Azure 仮想マシンとPowerShell DSCとか

DSC = Desired State Configuration の略ですが最近触ることになったので少しメモ。

DSCとは的な話は@IT/Build Insiderの記事とか、ぎたぱそ先生のBlog見てください。

あとAzure仮想マシンにDSC Extensionが追加されたのですがそちらの使い方などはムッシュ先生の記事を見るといいかと思います。

細かい話は上述の記事たちを見て頂くとわかるかと思います。


仮想マシンでのDSCの使い方

ざっとした流れ。(要Azure PowerShell Cmdlets 0.8.6以上)

  1. Configurationを書いた.ps1を作る
  2. Publish-AzureVMDscConfiguration –ConfigurationArchivePath で.ps1をZipファイルにまとめる
    (DSC Resource KitなどImport-DSCResourceで参照しているモジュールも含まれます)
  3. Publish-AzureVMDscConfiguration でZipファイル(.ps1.zip)をAzure Blobストレージにアップロードする
  4. 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ファイルがアップロードされます。

image

 

実行状況の把握とか

一応簡単には管理ポータルで見えます

image

… 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ですしね。(そうじゃないのはしょうがない)

とりあえず今のところこんな感じでチマチマやってます。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中