本文目录
概览
在Azure DSC扩展2.7版本中,我们添加了支持让你的虚拟机支持最新版本的WMF4.0。本文中我们会演示如何在云服务管理器(ASM)中使用这一功能。我们假设你已经知道怎样使用Azure 的 PowerShell SDK来创建虚拟机。如果还不清楚,可以参考MSDN。我们正在将这一个功能直接添加进PowerShell SDK DSC扩展中。现在WMF4中的功能只能让你自己构造JSON数据,然后使用泛型扩展命令发送配置。
下面的例子中我们会演示:
- 怎样创建你自己所需的Json数据发送给扩展配置。
- 怎样创建URL来发布配置,只允许用户通过URL来访问。此URL在扩展中被称为`ModulesUrl’
- 怎样将JSON数据发送给已存在的虚拟机。
创建JSON数据
要创建Json数据,我们应当使用Set-AzureVMExtension而不是 Set-AzureVMDscExtension命令,通过-PublicConfiguration参数传递JSON数据。下面的函数New-XAzureVmDscExtensionJson 会为我们这个例子创建所需的JSON数据。
# Create a Json to send the the DSC VM Extension function New-XAzureVmDscExtensionJson { [CmdletBinding()] param( [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [string] $moduleName, [Parameter(Mandatory = $false)] [ValidateNotNull()] [string] $modulesUrl, [AllowNull()] [HashTable] $properties, [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [string] $configurationName, [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [ValidateSet('4.0','latest','5.0PP')] [string] $WmfVersion ) $publicSettingsTable = @{ Properties = $properties WmfVersion = $WmfVersion } if($null -ne $modulesUrl) { $publicSettingsTable.Add('ModulesUrl',$modulesUrl) } $publicSettingsTable.Add('ConfigurationFunction' , "${ModuleName}\${configurationName}") return ConvertTo-Json -Depth 8 $publicSettingsTable }
下面来解释这些值:
modulesUrl
代表
Publish-AzureVmDscConfiguration产生的zip压缩包的RUL。
moduleName
- 扩展会在ZIP文件内部为该配置查找文件名。
configurationName
- 用来帮助扩展在文件或者模块内部使用这个函数来寻找配置。
WmfVersion
- 需要升级到的WMF版本或者保持当前机器中的版本不变。当前支持的值:
4.0
表示如果还没有新版本安装时,将WMF版本升级至4.0。5.0PP
表示要升级到WMF 5.0PP.latest
表示要升级到最新版本WMF。
- 需要升级到的WMF版本或者保持当前机器中的版本不变。当前支持的值:
properties
- 可以传递给配置的一个哈希表参数。
上面的函数会生产一个像下面例子那样的JSON数据.
"Properties": {
"DestinationPath": "C:\\test"
},
"WmfVersion": "4.0",
"ConfigurationFunction": "configuration.ps1\\ConfigurationName",
"ModulesUrl": "https://storageaccountname.blob.core.windows.net/windows-powershell-dsc/configuration.ps1.zip?<sastoken>"
}
创建 `ModulesUrl’
要生成一个JSON数据,我们需要modulesUrl,这是发布的配置的URL,和一些查询字符串。下面的 Get-XAzureDscPublishedModulesUrl函数会发布这个配置,创建一个有效期为一个小时的只读SASToken,然后使用SASToken返回完整URL块(微软Windows Azure中的一种存储类型)。
# Publish a DSC configuration, Create a SasToken, and return the full URI with the SASToken
function Get-XAzureDscPublishedModulesUrl
{
[CmdletBinding()]
param
(
[Parameter(HelpMessage='The storage container to publish the configuration to')]
[ValidateNotNullOrEmpty()]
[String]
$StorageContainer = 'windows-powershell-dsc',
[Parameter(Mandatory=$true, Position=0, HelpMessage='The name of the blob.')]
[ValidateNotNullOrEmpty()]
[String]
$blobName,
[Parameter(Mandatory=$true, Position=1, HelpMessage='The path to the configuration to publish')]
[ValidateNotNullOrEmpty()]
[String]
$configurationPath,
[Parameter(Mandatory=$true, Position=2, HelpMessage='The name of the storage account to publish to')]
[ValidateNotNullOrEmpty()]
[String]
$storageAccountName
)
# Get the Storage Account Context
function Get-AzureDscStorageAccountContext
{
param(
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[String]
$storageAccountName
)
$azureStorageAccount = Get-AzureStorageAccount -StorageAccountName $storageAccountName
if(!$azureStorageAccount)
{
throw 'storage account not found'
}
$storageAccessKey = (Get-AzureStorageKey -StorageAccountName $StorageAccountName).Primary
$storageContext = New-AzureStorageContext -StorageAccountName $StorageAccountName `
-StorageAccountKey $storageAccessKey
return $storageContext
}
$expiryTime = [DateTime]::UtcNow.AddMinutes(60)
#Publish the configuration
Publish-AzureVMDscConfiguration -ConfigurationPath $configurationPath -Verbose -Force `
-storageContext (Get-AzureDscStorageAccountContext -storageAccountName $storageAccountName) `
-ContainerName $StorageContainer
# Create a SasToken for the Configuration
return New-AzureStorageBlobSASToken -Container $StorageContainer -Blob $blobName -Permission r `
-ExpiryTime $expiryTime -Context (Get-AzureDscStorageAccountContext -storageAccountName $storageAccountName) -FullUri
}
合并所有准备数据,并发送给虚拟机
现在我们需要调用函数,来获取modulesUrl,把值和其它剩余的参数传递给函数并获取JSON数据,再获取我们的虚拟机对象,然后使用JSON数据在虚拟机对象中调用Set-AzureVMExtension,将配置发送给DSC扩展。下面的例子会演示这一流程。
$storageAccountName = 'storageaccountname' $publisher = 'Microsoft.Powershell' $dscVersion = '2.7' $serviceName = 'servicename' $vmName = 'vmName' $moduleName = 'configuration.ps1' $blobName = "$moduleName.zip" $configurationPath = "$PSScriptRoot\$moduleName" $ConfigurationName = 'ConfigurationName' $modulesUrl = Get-XAzureDscPublishedModulesUrl -blobName $blobName -configurationPath $configurationPath ` -storageAccountName $storageAccountName Write-Verbose -Message "ModulesUrl: $modulesUrl" -Verbose $PublicConfigurationJson = New-XAzureVmDscExtensionJson -moduleName $moduleName -modulesUrl $modulesUrl ` -properties @{DestinationPath = 'C:\test'} -configurationName $ConfigurationName -WmfVersion '4.0' -Verbose Write-Verbose -Message "PublicConfigurationJson: $PublicConfigurationJson" -Verbose $vm = get-azurevm -ServiceName $serviceName -Name $vmName $vm = Set-AzureVMExtension ` -VM $vm ` -Publisher $publisher ` -ExtensionName 'DSC' ` -Version $dscVersion ` -PublicConfiguration $PublicConfigurationJson ` -ForceUpdate $vm | Update-AzureVM
在虚拟机完成更新以后,你就拥有了一个WMF4.0的虚拟机,稍后还会发一篇帖子来演示如何在ARM中做这件事。
我已经将这个示例脚本发布到了 GitHub中 ,你可能只需更新云服务的名称,然后在Azure 的PowerShell SDK中运行即可。
注意
Windows 2016技术预览版已经预装了等价的WMF5。因此,在这样的操作系统上来指定WMF4是不合理的选项。
原文作者:Travis Plunk [MSFT]
原文链接:How to use WMF 4 with Azure DSC Extension in Azure Cloud Service Manager (ASM)
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!