你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
更改计算机配置的 PowerShell Desired State Configuration 中的行为
在开始之前,最好先阅读计算机配置概述。
计算机配置使用 PowerShell Desired State Configuration (PSDSC) 版本 3 来审核和配置计算机。 DSC 配置定义了计算机应处于的状态。 在计算机配置中实施 DSC 的方式存在许多明显差异。
计算机配置使用 PowerShell 7 跨平台
计算机配置旨在使管理 Windows 和 Linux 的体验保持一致。 在这两种操作系统环境中,具备 PowerShell DSC 知识的人员可以使用脚本技能创建和发布配置。
机器配置仅使用 PowerShell DSC 版本 3,不依赖于先前实现的适用于 Linux 的 DSC 或该存储库中包含的 nx*
提供程序。
从版本 1.26.33 开始,计算机配置在适用于 Windows 的 PowerShell 7.1.2 和适用于 Linux 的 PowerShell 7.2 预览版 6 中运行。 从 7.2 版开始,PSDesiredStateConfiguration 模块不再是 PowerShell 安装的一部分,而是作为 PowerShell 库中的模块进行安装。
多重配置
计算机配置支持将多个配置分配给同一台计算机。 在计算机配置扩展的操作系统中,无需执行任何特殊步骤。 无需配置部分配置。
按配置管理依赖项
使用可用工具打包配置时,配置所需的依赖项包含在 .zip
文件中。 计算机会将这些内容提取到每个配置的唯一文件夹中。 机器配置扩展提供的代理为每个配置创建一个专用的 PowerShell 会话。 它使用 $Env:PSModulePath
将自动模块加载限制为仅提取包的路径。
此更改具有多个优点:
- 可以在同一台计算机上为每个配置使用不同的模块版本。
- 当计算机上不再需要配置时,代理会安全地删除提取配置的整个文件夹。 无需跨配置管理共享依赖项。
- 不需要在中心服务中管理任意模块的多个版本。
将项目作为包进行管理
Azure 自动化 State Configuration 功能包括模块和配置脚本的项目管理。 在服务中发布这两个功能后,即可将脚本编译为 MOF 格式。 同样,Windows 拉取服务器也需要管理 Web 服务实例的配置和模块。 相比之下,DSC 扩展具有简化模型,其中所有项目都打包在一起,并存储在可使用 HTTPS 请求从目标计算机访问的位置。 Azure Blob 存储是托管项目的常用选项。
计算机配置只是使用简化模型,其中所有项目都打包在一起,并可通过 HTTPS 从目标计算机进行访问。 不需要在服务中发布模块、脚本或内部版本。 其中一项更改是包应始终包含编译的 MOF。 不能在包中加入脚本文件,并在目标计算机上对其进行编译。
自定义配置包的最大大小
在 Azure 自动化 State Configuration 中,DSC 配置的大小受到限制。 机器配置支持的总包大小为 100 MB(压缩前)。 对于包内 MOF 文件的大小,没有具体限制。
配置模式在包项目中设置
创建配置包时,将使用以下选项设置模式:
Audit
- 验证计算机的合规性。 不做任何更改。AuditandSet
- 验证和修正计算机的合规性状态。 如果计算机不合规,则进行更改。
模式是在包中设置的,而不是在本地 Configuration Manager 服务中设置的,因为每个配置可能会应用不同的模式。
通过 Azure 资源管理器支持参数
文件存储在计算机上时,由计算机配置分配中的 configurationParameter 属性数组设置的参数会覆盖配置 MOF 文件中的静态文本。 利用参数,操作员可以从服务 API 控制自定义和更改,而无需在计算机内运行命令。
Azure Policy 中将值传递给计算机配置分配的参数必须为字符串类型。 即使 DSC 资源支持数组,也无法通过参数传递数组。
从外部计算机触发设置
以前的 DSC 版本中存在一个问题:在没有大量自定义代码和不依赖 WinRM 远程连接的情况下大规模校正偏移。 来宾配置解决了这一问题。 计算机配置的用户可以通过按需修正控制偏移校正。
序列包含 Get 方法
当计算机配置审核或配置计算机时,Windows 和 Linux 都使用相同的事件序列。 显著的行为更改是服务调用 Get
方法,以返回有关计算机状态的详细信息。
- 代理首先运行
Test
以确定配置是否处于正确状态。 - 如果将包设置为
Audit
,则该函数返回的布尔值确定来宾分配的 Azure 资源管理器状态是Compliant
还是NonCompliant
。 - 如果将包设置为
AuditandSet
,则布尔值确定是否通过使用Set
方法应用配置来修正计算机。 如果Test
方法返回$false
,则Set
运行。 如果Test
返回$true
,则Set
不运行。 - 最后,提供程序运行
Get
以返回每个设置的当前状态,因此,会获得有关计算机为何不合规的详细信息,以及用于确认当前状态是否合规的详细信息。
Get 的特殊要求
DSC Get
方法对 DSC 不需要的机器配置有特殊要求。
- 返回的哈希表应包含名为 Reasons 的属性。
- Reasons 属性必须是数组。
- 数组中的每个项都应是一个哈希表,其中包含名为 Code 和 Phrase 的键。
- 不应返回除哈希表之外的任何其他值。
服务使用 Reasons 属性来标准化合规性信息的呈现方式。 可将 Reasons 中的每个项视为关于资源如何合规或不合规的消息。 该属性之所以是数组,是因为资源可能出于多种原因而不合规。
服务需要 Code 和 Phrase 属性。 创作自定义资源时,需将要显示为资源不合规原因的文本设置为 Phrase 的值。 Code 具有特定格式设置要求,因此报告可以清楚地显示有关用于进行审核的资源的信息。 此解决方案使来宾配置可扩展。 只要输出可以作为 Phrase 属性的字符串值返回,便可以运行任何命令。
- Code(字符串):资源的名称,重复该名称,后接一个不包含空格的短名称(作为原因标识符)。 这三个值应以冒号分隔,且不包含空格。
- 例如
registry:registry:keynotpresent
- 例如
- Phrase(字符串):用户可读的文本,用于解释设置不合规的原因。
- 例如
The registry key $key isn't present on the machine.
- 例如
$reasons = @()
$reasons += @{
Code = 'Name:Name:ReasonIdentifer'
Phrase = 'Explain why the setting is not compliant'
}
return @{
reasons = $reasons
}
当使用命令行工具获取在 Get
中返回的信息时,你可能会发现该工具返回了意外的输出。 即使是在 PowerShell 中捕获输出,也可能会将输出写入标准错误。 若要避免此问题,请考虑将输出重定向到 null。
Reasons 属性嵌入式类
在基于脚本的资源(仅限 Windows)中,Reason 类包含在架构 MOF 文件中,如下所示。
[ClassVersion("1.0.0.0")]
class Reason
{
[Read] String Phrase;
[Read] String Code;
};
[ClassVersion("1.0.0.0"), FriendlyName("ResourceName")]
class ResourceName : OMI_BaseResource
{
[Key, Description("Example description")] String Example;
[Read, EmbeddedInstance("Reason")] String Reasons[];
};
在基于类的资源(Windows 和 Linux)中,Reason 类包含在 PowerShell 模块中,如下所示。 Linux 区分大小写,因此 Code
中的 C
和 P
中的 Phrase
必须大写。
enum ensure {
Absent
Present
}
class Reason {
[DscProperty()]
[string] $Code
[DscProperty()]
[string] $Phrase
}
[DscResource()]
class Example {
[DscProperty(Key)]
[ensure] $ensure
[DscProperty()]
[Reason[]] $Reasons
[Example] Get() {
# return current current state
}
[void] Set() {
# set the state
}
[bool] Test() {
# check whether state is correct
}
}
如果资源具有所需的属性,则 Get
还应与 Reason 类并行返回这些属性。 如果未包括 Reason,则该服务将包括“全部捕获”行为,该行为将输入到 Get
的值与 Get
返回的值进行比较,并将详细的比较结果作为 Reason 提供。
配置名称
自定义配置的名称必须在所有位置都保持一致。 这些项必须具有相同的名称:
- 内容包的
.zip
文件 - MOF 文件中的配置名称
- Azure 资源管理器模板中的机器配置分配名称
在 Windows PowerShell 中运行命令
可以通过在 DSC 资源中使用以下模式来在 PowerShell 中运行 Windows 模块。 以下模式暂时将 PSModulePath
设置为运行 Windows PowerShell 而不是 PowerShell,以发现 Windows PowerShell 中提供的所需模块。 此示例是安全 Web 服务器内置 DSC 资源中使用的 DSC 资源的片段。
此模式暂时将 PowerShell 执行路径设置为从 Windows PowerShell 运行并发现所需的 cmdlet(在本例中为 Get-WindowsFeature
)。 返回命令的输出,然后按兼容性要求将其标准化。 执行 cmdlet 后,将 $env:PSModulePath
重新设置为原始路径。
# The Get-WindowsFeature cmdlet needs to be run through Windows PowerShell
# rather than through PowerShell, which is what the Policy engine runs.
$null = Invoke-Command -ScriptBlock {
param ([string]$FileName)
$InitialPSModulePath = $env:PSModulePath
$WindowsPSFolder = "$env:SystemRoot\System32\WindowsPowershell\v1.0"
$WindowsPSExe = "$WindowsPSFolder\powershell.exe"
$WindowsPSModuleFolder = "$WindowsPSFolder\Modules"
$GetFeatureScriptBlock = {
param([string]$FileName)
if (Get-Command -Name Get-WindowsFeature -ErrorAction SilentlyContinue) {
Get-WindowsFeature -Name Web-Server |
ConvertTo-Json |
Out-File $FileName
} else {
Add-Content -Path $FileName -Value 'NotServer'
}
}
try {
# Set env variable to include Windows Powershell modules so we can find
# the Get-WindowsFeature cmdlet.
$env:PSModulePath = $WindowsPSModuleFolder
# Call Windows PowerShell to get the info about the Web-Server feature
& $WindowsPSExe -command $WindowsFeatureScriptBlock -args $FileName
} finally {
# Reset the env variable even if there's an error.
$env:PSModulePath = $InitialPSModulePath
}
}
计算机配置公共预览版期间不可用的常见 DSC 功能
在公共预览版期间,机器配置不支持使用 WaitFor*
资源指定跨计算机依赖项。 一台计算机不可能监视并等待另一台计算机达到某种状态后再继续运行。
计算机配置的公共预览版本中不提供重新启动处理,同时 $global:DSCMachineStatus
也不可用。 配置无法在配置期间或结束时重新启动节点。
受支持模块的已知兼容性问题
PowerShell 库中的 PsDscResources 模块和 Windows 附带的 PSDesiredStateConfiguration 模块受 Microsoft 支持,并且已成为 DSC 的常用资源集。 在为 DSCv3 更新 PSDscResources 模块之前,请注意以下已知的兼容性问题。
- 不要使用 Windows 附带的 PSDesiredStateConfiguration 模块中的资源。 而是切换到 PSDscResources 资源。
- 不要使用 PsDscResources 中的
WindowsFeature
、WindowsFeatureSet
、WindowsOptionalFeature
和WindowsOptionalFeatureSet
资源。 在 Windows Server 上加载 PowerShell 7.1.3 中的 DISM 模块时存在已知问题,需要进行更新。
适用于 linux 的 nx*
资源(包含在 DSC for Linux 存储库中)是以 C 和 Python 语言的组合编写的。 由于 Linux 上 DSC 的转发路径将使用 PowerShell,因此现有的 nx*
资源与 DSCv3 不兼容。 在我们提供包含适用于 Linux 的支持资源的新模块之前,你需要编写自定义资源。
与 DSC 版本 3 和更早版本共存
计算机配置中的 DSC 版本 3 可以与 Windows 和 Linux 中安装的旧版本共存。 实现是独立的。 但是,DSC 版本之间没有冲突检测,因此请不要尝试管理相同的设置。
后续步骤
- 阅读计算机配置概述。
- 开发自定义机器配置包。
- 使用
GuestConfiguration
模块创建 Azure Policy 定义,用于对环境进行大规模管理。 - 使用 Azure 门户分配自定义策略定义。
- 了解如何查看计算机配置策略分配的合规性详细信息。