在Azure云服务管理器(ASM)中通过Azure DSC扩展来使用WMF4


概览

在Azure DSC扩展2.7版本中,我们添加了支持让你的虚拟机支持最新版本的WMF4.0。本文中我们会演示如何在云服务管理器(ASM)中使用这一功能。我们假设你已经知道怎样使用Azure 的  PowerShell SDK来创建虚拟机。如果还不清楚,可以参考MSDN。我们正在将这一个功能直接添加进PowerShell SDK DSC扩展中。现在WMF4中的功能只能让你自己构造JSON数据,然后使用泛型扩展命令发送配置。

下面的例子中我们会演示:

  1. 怎样创建你自己所需的Json数据发送给扩展配置。
  2. 怎样创建URL来发布配置,只允许用户通过URL来访问。此URL在扩展中被称为`ModulesUrl’
  3. 怎样将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。
  • 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是不合理的选项。

原文作者原文链接How to use WMF 4 with Azure DSC Extension in Azure Cloud Service Manager (ASM) 

本文链接: https://www.pstips.net/how-to-use-wmf-4-with-azure-dsc-extension-in-azure-cloud-service-manager-asm.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注