我正在通过简单的练习来学习Azure和Powershell DSC。
此博客条目为DSC提供了完美的“Hello World”示例:
Configuration HelloWorldConfig { Node localhost { File TestFile { Ensure = "Present" DestinationPath = "c:\temp\HelloWorld.txt" Contents = "Hello World!" } } }
我使用powershell创build了该软件包,并通过azure门户上的扩展刀片上传到我的Azure虚拟机。
有效! 当我login到机器上时,我可以看到文件c:\temp\HelloWorld.txt
。
但是DSC应该保护你免于“configuration漂移”。 为了testing这个,我通过手动删除文件来漂移我的configuration。
我如何使文件再次出现? 即如何重新运行这个所需的状态configuration检查。
我假设我上传的DSC脚本驻留在虚拟机的某处。 (我可以在扩展刀片上看到一个条目)。
或者我必须重新加载包? 如果是这样的话,为什么刀片上的条目甚至可以看到?
我问,这个包甚至在哪里? 我使用powershellfind了答案:
$extension = Get-AzureRmVMDscExtension -ResourceGroupName $vm.ResourceGroupName -VMName $vm.Name $extension.ModulesUrl
这显示我的包现在驻留在https://iaasv2tempstoreseasia.blob.core.windows.net/vmextensionstemporary-000116674c9bb772-20160908062048340/sample-dsc-package.zip?sv=2015-04-05&sr=c&sig=YnGCCH%2Bvfv% 2FMPWexQWhGOw7H8d8EkGcN5Ufudyz1MIE%3D&SE = 2016-09-09T06%3A20%3A48Z& SP = RW
所以,我认为它是在名为vmextensionstemporary-000116674c9bb772-20160908062048340
的blob容器中的一个名为iaasv2tempstoreseasia
的存储帐户(不是我的)中。 只有temp
这个词的存在表明它不是可以被导航的。
有趣的是,当我从扩展刀片删除DSC扩展时,我仍然可以使用这个URL下载软件包。 几个小时后,它消失了 – 我怀疑是由一些清理工作。
DSC使用DSC本地configurationpipe理器来处理DSCconfiguration并对其进行监控。 本地configurationpipe理器有一个名为CONFIGURATION MODE的设置,默认情况下它被设置为ApplyAndMonitor。 这意味着它将处理和应用你的DSC脚本,但如果有改变(在你的例子中删除文件),它不会自动重新应用设置。 你需要做的是将CONFIGURATION MODE设置为ApplyAndAutocorrect。 在此模式下,它将检测configuration漂移并重新应用您的DSC设置。
查看此url以获取有关此设置的更多信息:
我得出的结论是,一旦将已发布的zipfile upload到Azure门户,它将运行一次。 如果您想手动触发第二次运行,则唯一的方法是重复文件上载。
如果您想上传一次,然后再手动触发一次,则必须通过Powershell而不是Azure门户进行上传。
这里是我最终使用的命令。
我目前只有一个存储帐户和一个虚拟机,所以我可以在不进行任何过滤的情况下获得对两者的引用:
$sa = Get-AzureRmStorageAccount $vm = Get-AzureRmVM
编译和发布'HelloWorld'脚本:
Publish-AzureVMDscConfiguration -ConfigurationPath sample-dsc-script.ps1 -ResourceGroupName $sa.ResourceGroupName -StorageAccountName $sa.StorageAccountName -ContainerName dsc
这将在我的存储帐户中创build一个名为sample-dsc-script.ps1.zip
,该块位于名为dsc
的容器中。
要将此新上传的configuration应用于虚拟机,请执行以下操作:
$params = [PSCustomObject]@{ ResourceGroupName = $sa.ResourceGroupName; Location = $sa.Location; ArchiveStorageAccountName = $sa.StorageAccountName; ArchiveContainerName = "dsc"; ArchiveBlobName = "sample-dsc-script.ps1.zip"; ConfigurationName = "HelloWorldConfig"; VMName = $vm.Name; Version = 2.4; AutoUpdate = $true; WmfVersion = "5.0"; }; $params | Set-AzureRmVMDscExtension
然后我可以再次调用这个命令重新应用configuration。