PowerShell 7 将是 PowerShell 第一个 LTS(Long Term Servicing)
版本,目前 Preview 4 版本已经发布了。

若要以一致的方式大规模创建和管理 Azure 虚拟机
(VM),通常需要某种形式的自动化。
可以通过许多工具和解决方案来自动完成整个 Azure
基础结构部署和管理生命周期。 本文介绍了一些可以在 Azure
中使用的基础结构自动化工具。 这些工具通常适合以下某个方法:

Powershell 自动化变量 是那些一旦打开Powershell就会自动加载的变量。

此版本包含了一些 bug 修复,同时也带来了几个新特性:

自动执行 VM 的配置

这些变量一般存放的内容包括

三元运算符

工具包括Chef。

用户信息:例如用户的根目录$home

引入可选的三元运算符,提高了可读性。

特定于 VM 自定义的工具包括适用于 Linux VM
的cloud-init、PowerShell
Desired State Configuration
(DSC),以及适用于所有
Azure VM 的Azure
自定义脚本扩展。

配置信息:例如powershell控制台的大小,颜色,背景等。

澳门新葡萄京官网注册 1

自动化基础结构管理

运行时信息:例如一个函数由谁调用,一个脚本运行的目录等。

Start-Job -WorkingDirectory

工具包括用于自动完成自定义 VM
映像生成的Packer,以及用于自动完成基础结构生成过程的Terraform。

PS> $HOME

熟悉 Start-Job cmdlet 的人会发现新的 PowerShell 进程在 Windows
PowerShell 和 PowerShell Core 上开始 job
时具有不同的工作目录。此版本添加 Start-Job -WorkingDirectory
参数,允许在脚本块运行之前指定 job 进程的工作目录。

Azure
自动化可以跨
Azure 和本地基础结构执行操作。

C:Userstest

澳门新葡萄京官网注册 2

自动执行应用程序部署和交付

PS> $currentProcessID=$pid

$ErrorActionPreference = “Break”

示例包括Visual Studio Team
Services和Jenkins。

PS> $currentProcessID

如果设置
$ErrorActionPreference=”Break”,那么当出现错误时它会立即进入调试器。

Chef

5356

澳门新葡萄京官网注册 3

Chef是一个自动化平台,用于定义基础结构的配置、部署和管理方式。
其他组件包括:Chef
Habitat,用于应用程序生命周期自动化而不是基础结构;Chef
InSpec,用于自动遵循安全和策略要求。 Chef
客户端安装在目标计算机上,通过一个或多个中心 Chef
服务器来存储和管理配置。 有关详细信息,请参阅An Overview of
Chef(Chef
概述)。

PS> Get-Process -Id $pid

Invoke-DscResource

了解如何:

Handles  NPM(K)    PM(K)      WS(K) VM(M)  CPU(s)    Id ProcessName

现在可以在绕过 LCM(Local Configuration
Manager,本地配置管理器)的同时利用 DSC 资源。这意味着可以创建自己的
LCM,或者只使用自己脚本中现有的 DSC
资源,这也适用于跨平台。但是,并不支持二进制 DSC 资源。

从 Azure Marketplace 部署 Chef
Automate。

——-  ——    —–      —– —–  ——    — ———–

澳门新葡萄京官网注册 4

在 Windows 上安装 Chef 并创建 Azure
VM。

390      10    30604      33100  172    1.11  5356 powershell

DSC 配置编译

Cloud-init

PS> $PROFILE

此前如果编写了 DSC 配置脚本,则需要使用 Windows 计算机将其编译为 mof
文件以部署到受管节点上。从 Preview 4 开始,现在可以在非 Windows
系统上执行 DSC 编译。

Cloud-init是一种广泛使用的方法,用于在首次启动
Linux VM 时对其进行自定义。 可使用 cloud-init
来安装程序包和写入文件,或者配置用户和安全性。 在初始启动期间运行
cloud-init 时,无需额外的步骤和代理即可应用配置。

C:UserstestDocumentsWindowsPowerShellMicrosoft.PowerShell_profile.ps1

澳门新葡萄京官网注册 5

Cloud-init 还支持不同的发行版。 例如,不需使用 apt-get install 或 yum
install 来安装包, 而应定义需安装的包的列表。 Cloud-init
将对所选发行版自动使用本机包管理工具。

powershell中的某些自动化变量只能读,不能写。例如:$Pid。

详情查看:

我们正在与合作伙伴协作,将 cloud-init 纳入用户向 Azure
提供的映像中并使其在映像中正常运行。 下表概述了 cloud-init 当前在 Azure
平台映像上的可用性:

可以通过Get-Help
about_Automatic_variables查看Automatic_variables的帮助。

PowerShell 7 Preview 4

别名发布者产品SKUVersion

TOPIC

(文/开源中国)    

UbuntuLTSCanonicalUbuntuServer14.04.5-LTS最新

about_Automatic_Variables

UbuntuLTSCanonicalUbuntuServer16.04-LTS最新

主题

CoreOSCoreOSCoreOSStable最新

about_Automatic_Variables

了解如何:

简短说明

使用 cloud-init 来自定义 Linux
VM。

说明存储 Windows PowerShell 状态信息的变量。

PowerShell DSC

这些变量由 Windows PowerShell 创建并维护。

PowerShell Desired State Configuration
(DSC)是一个管理平台,用于定义目标计算机的配置。
也可通过Open Management Infrastructure (OMI)
服务器在
Linux 上使用 DSC。

详细说明

DSC 配置定义要在计算机上安装的内容,以及如何配置主机。 本地配置管理器
(LCM) 引擎在每个目标节点上运行,此类节点根据推送的配置处理请求的操作。
拉取服务器是一项在中心主机上运行的 Web 服务,用于存储 DSC
配置和关联的资源。 该拉取服务器与每个目标主机上的 LCM
引擎通信,提供所需的配置并报告符合性情况。

下面是 Windows PowerShell 中的自动变量的列表:

了解如何:

$$

创建基本的 DSC
配置。

包含会话所收到的最后一行中的最后一个令牌。

配置 DSC
拉取服务器。

$?

使用适用于 Linux 的
DSC。

包含最后一个操作的执行状态。如果最后一个操作成功,则包含
TRUE,失败则包含 FALSE。

Azure 自定义脚本扩展

$^

适用于Linux或Windows的
Azure 自定义脚本扩展在 Azure VM 上下载和执行脚本。 可以在创建 VM
时使用该扩展,也可以在 VM 处于使用状态后随时使用该扩展。

包含会话所收到的最后一行中的第一个令牌。

可以从 Azure 存储或任何公共位置(例如 GitHub 存储库)下载脚本。
使用自定义脚本扩展时,可以通过在源 VM 上运行的任何语言来编写脚本。
可以根据需要使用这些脚本来安装应用程序或配置该 VM。
若要确保凭据的安全,可将密码之类的敏感信息存储在受保护配置中。
这些凭据只在 VM 内解密。

$_

了解如何:

包含管道对象中的当前对象。在对管道中的每个对象或所选对象执行操作的命令中,可以使用此变量。

通过 Azure CLI 创建 Linux VM
并使用自定义脚本扩展。

$Args

通过 Azure PowerShell 创建 Windows VM
并使用自定义脚本扩展。

包含由未声明参数和/或传递给函数、脚本或脚本块的参数值组成的数组。

Packer

在创建函数时可以声明参数,方法是使用 param
关键字或在函数名称后添加以圆括号括起、逗号

在 Azure 中创建自定义 VM
映像时,Packer会自动完成生成过程。
可以使用 Packer 来定义 OS 并运行配置后脚本,根据具体需求来自定义 VM。
配置完成后,会将 VM 作为托管磁盘映像捕获。 Packer 自动完成创建源
VM、网络和存储资源,运行配置脚本,然后创建 VM 映像这一过程。

分隔的参数列表。

了解如何:

$ConsoleFileName

在 Azure 中使用 Packer 创建 Linux VM
映像。

包含在会话中最近使用的控制台文件 (.psc1) 的路径。在通过 PSConsoleFile
参数启动

在 Azure 中使用 Packer 创建 Windows VM
映像。

Windows PowerShell 或使用 Export-Console cmdlet
将管理单元名称导出到控制台文件

Terraform

时,将填充此变量。

Terraform是一项自动化工具,用于通过
HashiCorp Configuration Language (HCL)
这个单一模板格式语言来定义和创建整个 Azure 基础结构。 可以使用 Terraform
来定义模板,自动完成为给定应用程序解决方案创建网络、存储和 VM
资源这一过程。 可以将适合其他平台的现有 Terraform 模板用于 Azure
以确保一致性并简化基础结构部署,不需转换为 Azure 资源管理器模板。

在使用不带参数的 Export-Console cmdlet
时,它自动更新在会话中最近使用的控制台文件。

了解如何:

可以使用此自动变量确定要更新的文件。

使用 Azure 安装和配置
Terraform。

$Error

使用 Terraform 创建 Azure
基础结构。

包含错误对象的数组,这些对象表示最近的一些错误。最近的错误是该数组中的第一个错误对象

Azure 自动化

($Error[0])。

Azure
自动化使用
Runbook 在目标 VM 上处理一组任务。 Azure 自动化用于管理现有
VM,而不是创建基础结构。 Azure 自动化可以跨 Linux 和 Windows VM
运行,还可以通过混合 Runbook 辅助角色在本地虚拟机或物理机上运行。 可以将
Runbook 存储在源代码管理存储库(例如 GitHub)中。
然后即可手动运行或按定义的计划运行这些 Runbook。

$Event

Azure 自动化还提供 Desired State Configuration (DSC)
服务,用于针对给定的一组 VM 的配置方式创建定义。 然后,DSC
就可以确保所需配置得到应用且 VM 保持一致。 Azure 自动化 DSC 可以在
Windows 和 Linux 计算机上运行。

包含一个 PSEventArgs 对象,该对象表示一个正在被处理的事件。

了解如何:

此变量只在事件注册命令(例如 Register-ObjectEvent)的 Action 块内填充。

创建 PowerShell
Runbook。

此变量的值是 Get-Event cmdlet 返回的同一个对象。

使用混合 Runbook
辅助角色来管理本地资源。

因此,可以在 Action 脚本块中使用 $Event 变量的属性(例如

使用 Azure 自动化
DSC。

$Event.TimeGenerated)。

Visual Studio Team Services

$EventSubscriber

Team
Services是一套工具,用于共享和跟踪代码、使用自动化生成,以及创建完整的持续集成和开发
(CI/CD) 管道。 Team Services 集成 Visual Studio
和其他编辑器,简化了使用过程。 Team Services 还可以创建和配置 Azure
VM,然后向其部署代码。

包含一个 PSEventSubscriber
对象,该对象表示正在被处理的事件的事件订阅者。

了解如何:

此变量只在事件注册命令的 Action 块内填充。此变量的值

使用 Team Services
创建持续集成管道。

是 Get-EventSubscriber cmdlet 返回的同一个对象。

Jenkins

$ExecutionContext

Jenkins是一种持续集成服务器,用于部署和测试应用程序,以及创建进行代码交付的自动化管道。
可以通过成百上千的插件来扩展核心 Jenkins 平台,还可以通过 Webhook
集成许多其他的产品和解决方案。 可以在 Azure VM 上手动安装 Jenkins,从
Docker 容器内部运行 Jenkins,或者使用预建的 Azure Marketplace 映像。

包含一个 EngineIntrinsics 对象,该对象表示 Windows PowerShell
主机的执行上下文。

了解如何:

可以使用此变量来查找可用于 cmdlet 的执行对象。

使用 Jenkins、GitHub 和 Docker 在 Azure 中的 Linux VM
上创建开发基础结构。

$False

后续步骤

包含 FALSE。可以使用此变量在命令和脚本中表示
FALSE,而不是使用字符串”false”。如果

可以通过许多不同的选项,在 Azure 中使用基础结构自动化工具。
可以自由使用最适合自己的需求和环境的解决方案。 若要开始尝试一些内置到
Azure
的工具,请了解如何自动完成Linux或WindowsVM
的自定义。

该字符串转换为非空字符串或非零整数,则可将该字符串解释为 TRUE。

$ForEach

包含 ForEach-Object 循环的枚举数。可以对 $ForEach
变量的值使用枚举数的属性和方法。

此变量仅在运行 For 循环时存在,循环完成即会删除。

$Home

包含用户的主目录的完整路径。此变量等效于 %homedrive%%homepath%
环境变量。

$Host

包含一个对象,该对象表示 Windows PowerShell
的当前主机应用程序。可以使用此变量在命

令中表示当前主机,或者显示或更改主机的属性,如
$Host.version、$Host.CurrentCulture

或 $host.ui.rawui.setbackgroundcolor(“Red”)。

$Input

一个枚举数,它包含传递给函数的输入。$Input
变量区分大小写,只能用于函数和脚本块。(脚

本块本质上是未命名的函数。)在函数的 Process 块中,$Input
变量包含当前位于管道中的对

象。在 Process 块完成后,$Input 的值为 NULL。如果函数没有 Process 块,则
$Input

的值可用于 End 块,它包含函数的所有输入。

$LastExitCode

包含运行的最后一个基于 Windows 的程序的退出代码。

$Matches

$Matches 变量与 -match 和 -not match 运算符一起使用。

将标量输入提交给 -match 或 -notmatch
运算符时,如果检测到匹配,则会返回一个布尔值,

并使用由所有匹配字符串值组成的哈希表填充 $Matches 自动变量。有关 -match
运算符的详细

信息,请参阅 about_comparison_operators。

$MyInvocation

包含一个对象,该对象具有有关当前命令(如脚本、函数或脚本块)的信息。可以使用该对象中的

信息(如脚本的路径和文件名 ($myinvocation.mycommand.path) 或函数的名称

($myinvocation.mycommand.name))来标识当前命令。对于查找正在运行的脚本的名称,这非常有用。

$NestedPromptLevel

包含当前提示级别。值 0
指示原始提示级别。该值在进入嵌套级别时递增,在退出嵌套级别时递减。

例如,在使用 $Host.EnterNestedPrompt 方法时,Windows PowerShell
会出现嵌套命令

提示符。在 Windows PowerShell 调试程序中到达断点时,Windows PowerShell
也会出现嵌

套命令提示符。

在进入嵌套提示时,Windows PowerShell
暂停当前命令,保存执行上下文,并递增

$NestedPromptLevel 变量的值。要创建更多嵌套命令提示符(最多 128
级)或返回到原始命

令提示符,请完成命令,或键入”exit”。

$NestedPromptLevel 变量有助于跟踪提示级别。可以创建包含此值的备用
Windows

PowerShell 命令提示符,以使此值始终可见。

$NULL

包含 NULL 或空值。可以在命令和脚本中使用此变量表示
NULL,而不是使用字符串”NULL”。

如果该字符串转换为非空字符串或非零整数,则可将该字符串解释为 TRUE。

$PID

包含承载当前 Windows PowerShell 会话的进程的进程标识符 (PID)。

$Profile

包含当前用户和当前主机应用程序的 Windows PowerShell
配置文件的完整路径。可以在命令

中使用此变量表示配置文件。例如,可以在命令中使用此变量确定是否已创建某个配置文件:

test-path $profile

也可以在命令中使用此变量创建配置文件:

new-item -type file -path $pshome -force

此外,还可以在命令中使用此变量在记事本中打开配置文件:

notepad $profile

$PSBoundParameters

包含活动参数及其当前值的字典。只有在声明参数的作用域(如脚本或函数)中,

此变量才有值。可以使用此变量显示或更改参数的当前值,也可以将参数值传递给

其他脚本或函数。

例如:

function test {

param($a, $b)

# Display the parameters in dictionary format.

$psboundparameters

# Call the Test1 function with $a and $b.

test1 @psboundparameters

}

$PsCmdlet

包含一个对象,该对象表示正在运行的 cmdlet 或高级函数。

可以在 cmdlet 或函数代码中使用该对象的属性和方法来响应使用的条件。例如,

ParameterSetName 属性包含正在使用的参数集的名称,而 ShouldProcess 方法将
WhatIf

和 Confirm 参数动态添加到 cmdlet。

有关 $PSCmdlet 自动变量的详细信息,请参阅 about_Functions_Advanced。

$PsCulture

包含操作系统中当前所用的区域性的名称。区域性确定数字、货币和日期等项的显示格式。这是系

统的 System.Globalization.CultureInfo.CurrentCulture.Name
属性的值。要获取系统

的 System.Globalization.CultureInfo 对象,请使用 Get-Culture cmdlet。

$PSDebugContext

在调试期间,此变量包含有关调试环境的信息。在其他时间,此变量包含 NULL
值。因此,可以使

用此变量指示调试程序是否拥有控制权。填充之后,此变量包含一个具有
Breakpoints 和

InvocationInfo 属性的 PsDebugContext 对象。InvocationInfo
属性有多个十分有用的

属性,包括 Location 属性。Location 属性指示正在调试的脚本的路径。

$PsHome

包含 Windows PowerShell 的安装目录的完整路径(通常为

%windir%System32WindowsPowerShellv1.0)。可以在 Windows PowerShell 文件

的路径中使用此变量。例如,下面的命令在概念性帮助主题中搜索”variable”一词:

select-string -pattern variable -path $pshome*.txt

$PSScriptRoot

包含要从中执行脚本模块的目录。

通过此变量,脚本可以使用模块路径来访问其他资源。

$PsUICulture

包含操作系统中当前所用的用户界面 (UI) 区域性的名称。UI
区域性确定哪些文本字符串用于用户

界面元素(如菜单和消息)。这是系统的

System.Globalization.CultureInfo.CurrentUICulture.Name
属性的值。要获取系统

的 System.Globalization.CultureInfo 对象,请使用 Get-UICulture cmdlet。

$PsVersionTable

包含一个只读哈希表,该哈希表显示有关在当前会话中运行的 Windows
PowerShell 版本的详

细信息。

该表包括下列项:

CLRVersion: 公共语言运行时 (CLR) 的版本

BuildVersion: 当前版本的内部版本号

PSVersion: Windows PowerShell 版本号

WSManStackVersion: WS-Management 堆栈的版本号

PSCompatibleVersions: 与当前版本兼容的 Windows PowerShell 版本

SerializationVersion :序列化方法的版本

PSRemotingProtocolVersion:Windows PowerShell 远程管理协议的版本

$Pwd

包含一个路径对象,该对象表示当前目录的完整路径。

$Sender

包含生成此事件的对象。此变量只在事件注册命令的 Action 块内填充。

此变量的值也可在 Get-Event 返回的 PSEventArgs

(System.Management.Automation.PSEventArgs) 对象的 Sender 属性中找到。

$ShellID

包含当前 shell 的标识符。

$SourceArgs

包含表示正在被处理的事件的事件参数的对象。此变量只在事件注册命令的
Action

块内填充。此变量的值也可在 Get-Event 返回的 PSEventArgs

(System.Management.Automation.PSEventArgs) 对象的 SourceArgs
属性中找到。

$SourceEventArgs

包含一个对象,该对象表示从正在被处理的事件的 EventArgs 中派生出的

第一个事件参数。此变量只在事件注册命令的 Action 块内填充。

此变量的值也可在 Get-Event 返回的 PSEventArgs

(System.Management.Automation.PSEventArgs) 对象的 SourceArgs
属性中找到。

$This

在定义脚本属性或脚本方法的脚本块中,$This 变量引用要扩展的对象。

$True

包含 TRUE。可以在命令和脚本中使用此变量表示 TRUE。

另请参阅

about_Hash_Tables

about_Preference_Va

riables

about_Variables