DSC = Desired State Configuration の略ですが最近触ることになったので少しメモ。
DSCとは的な話は@IT/Build Insiderの記事とか、ぎたぱそ先生のBlog見てください。
- PowerShell Desired State Configuration(DSC)とは(前) (1/2)
- タグ「PowerShell DSC」の記事一覧 (Build Insider)
- PowerShell DSC の記事といろいろ
あとAzure仮想マシンにDSC Extensionが追加されたのですがそちらの使い方などはムッシュ先生の記事を見るといいかと思います。
- PowerShell DSC 拡張を使用した Azure の仮想マシンへの IIS 展開のメモ
- Introducing the Azure PowerShell DSC (Desired State Configuration) extension
細かい話は上述の記事たちを見て頂くとわかるかと思います。
仮想マシンでのDSCの使い方
ざっとした流れ。(要Azure PowerShell Cmdlets 0.8.6以上)
- Configurationを書いた.ps1を作る
- Publish-AzureVMDscConfiguration –ConfigurationArchivePath で.ps1をZipファイルにまとめる
(DSC Resource KitなどImport-DSCResourceで参照しているモジュールも含まれます) - Publish-AzureVMDscConfiguration でZipファイル(.ps1.zip)をAzure Blobストレージにアップロードする
- Set-AzureVMDSCExtension でZipファイルを指定して仮想マシンにExtensionを追加
あとは仮想マシン上で(Azure DSC Extension Pluginが)Zipファイルをダウンロード→解凍→ Configurationから.mofを生成 → 出来上がった.mofを使ってPush型で適用するという感じです。
普段通りConfiguration作ったら、後はAzure PowerShell CmdletsでAzureのExtension用に固めて設定、というだけですね。仮想マシン上のログを見ればPushで適用されているのがわかるかと思います。
以下は個人的なメモです。
モジュール(リソース)と独自ファイル
ConfigurationのImport-DSCResourceでインポートしているモジュールは自動的にAzure上にも展開されます。(Zipファイルに含まれます)
何か独自のファイルを同時に展開したければリソースを作るか、何かのリソースに一緒に含めてしまうかするといいかもです。(Azure上で最初に $env:ProgramFiles\WindowsPowerShell\Modules フォルダーにZipに含まれるモジュールがコピーされます)
※ Publish-AzureVMDscConfiguration でZipファイルを作った後、手動で(.ps1ファイルと同じフォルダなどに)追加してもいいですがAzure上の作業ディレクトリがわかりづらいのでモジュールに含めたほうが楽かなぁと思います。
ConfigurationData を使いたい
ConfigurationDataを使いたい場合、例えば以下のような.psd1ファイルを作って指定することで対応できます。中身は例なので適当です。
@{ AllNodes = @( @{ NodeName="localhost" PSDscAllowPlainTextPassword=$true } ); }
利用する際はSet-AzureVMDscExtensionのConfigurationDataPathに.psd1ファイルへのパスを指定します。
Set-AzureVMDscExtension -VM $vm -ConfigurationArchive "hoge.ps1.zip" -ConfigurationName hoge -ConfigurationDataPath .\hoge.psd1 -ContainerName $StorageContainer -Force
まぁ大体のことはIntroducing the Azure PowerShell DSC (Desired State Configuration) extension に書いてるんですよ。
あと.psd1を指定するとBlob上に都度.psd1ファイルがアップロードされます。
実行状況の把握とか
一応簡単には管理ポータルで見えます
… Cmdletsでどうやってとるんでしょうね?
> $vm | Get-AzureVMExtension | Where{$_.ExtensionName -eq 'DSC' } ExtensionName : DSC Publisher : Microsoft.Powershell Version : 1.* PrivateConfiguration : PublicConfiguration : { "SasToken": "?sv=2014-02-14&sr=b&sig=yh63yOnTipPWz0prTXN3ASFsd 8oB94wnnKv4EFSL5vI%3D&se=2014-09-07T22%3A48%3A54Z&sp=r", "ModulesUrl": "https://xxxx.blob.core.windows.net/dsc/WebSe rverInstall.ps1.zip", "ConfigurationFunction": "WebServerInstall.ps1\\WebServerInsta ll", "Properties": null } ReferenceName : DSC State : Enable RoleName : xxxx
みたいなのは取れますけど違うしなぁ。。。
その他あまり関係ないこと
Add-AzureProvisioningConfigとかするとRDPとRemote PowerShellのInputEndpointが追加されるので、嫌な人はNew-AzureVMに渡す前に消すといいんではないでしょうか。(InputEndpointを追加してる場合は以下の例だと全部消えるので注意)
($vmConfig.ConfigurationSets | Where{$_.ConfigurationSetType -eq 'NetworkConfiguration'} | select -First 1).InputEndpoints.Clear()
Add-AzureProvisioningConfigはWindows/Linuxに関連して結構いろいろな設定を触るので、パイプラインの最初のほうで実行してその後Set-AzureVMBGInfoExtensionとかSet-AzureVMDscExtensionしたほうがいいと思います。
あと仮想マシン作成時に使用するOSイメージは
(Get-AzureVMImage | Where { $_.ImageFamily -eq "Windows Server 2012 R2 Datacenter" } | sort PublishedDate -Descending | Select-Object -First 1).ImageName
とかでイメージ名を取得するといいんでは無いでしょうか。
ちょっと提供時期ずれる可能性ありますが、公式で毎月のHotfixなど適用済みOSイメージをだいたい提供してくれるので、最新のOSイメージ使って毎度デプロイしなおせばいいんじゃないですかね。そのためのDSCですしね。(そうじゃないのはしょうがない)
とりあえず今のところこんな感じでチマチマやってます。