🎼

[Azure] ARM テンプレート読み解き (デプロイ後スクリプトの自動実行)

5 min read

はじめに

Azure QuickStart Templates を読み込んで勉強しよう!
ということで、アウトプットもしてみます。第5弾です。

今回の読み解き対象

ARM Template for Deploying Jenkins Master/Slave Cluster

テンプレートの概要

こちらのテンプレートをデプロイすると、Jenkins の Master/Slave 用の VM がデプロイされます。デプロイ後、少しだけ手作業が必要です。

この ARM テンプレートで見えるのは、VM のデプロイ後に特定のタスクを実施する方法です。

読み解く

毎度ですが、よくあるテンプレートのパターンは下記の通りです。

  1. パラメータ指定 (parameters)
  2. 変数の設定 (variables)
  3. デプロイするリソースの記述 (resources)

パラメータ指定 (parameters)

前半の "parameters": から始まる部分では、テンプレート内で使われるパラメータ (変数) の設定です。テンプレートのデプロイ時に選択肢として表示させたりすることができます。

locationvmSize などを指定するようになっていますね。

変数の設定 (variables)

"variables": セクションでは、この yaml ファイル中で利用する変数名を設定できます。このテンプレートでは、サブネットや利用するスクリプトをここで設定しています。変更したいときは、適宜こちらを書き換えてからデプロイすれば良いです。

azuredeploy.json
    "variables": {
        "NetIpRange": "10.0.0.0/16",
        "SubnetRange": "10.0.1.0/24",
        "scriptUrlMaster": "[uri(parameters('_artifactsLocation'),concat('scripts/install-jenkins.sh',parameters('_artifactsLocationSasToken')))]",
        "scriptUrlNode1":"[uri(parameters('_artifactsLocation'),concat('scripts/install-slave.sh',parameters('_artifactsLocationSasToken')))]",
        "scriptUrlNode2":"[uri(parameters('_artifactsLocation'),concat('win-slave.ps1',parameters('_artifactsLocationSasToken')))]"
    },

デプロイするリソースの記述 (resources)

"resources": セクションで、デプロイするリソースを記述しています。

VNet や VM の基本的な構成部分は、拙著の [Azure] 101-vm-multiple-ipconfig テンプレート読み解き が参考になると思いますので、そちらをご覧くださいませ。

今回のキモは、"type": "Microsoft.Compute/virtualMachines/extensions" のあたりです。ここで、デプロイ後に実行させるスクリプトを記述しています。

Linux 版

azuredeploy.json
        {
            "name": "Jenkins-Master/installJenkins",
            "type": "Microsoft.Compute/virtualMachines/extensions",
            "apiVersion": "2019-03-01",
            "location": "[parameters('location')]",
            "tags": {
                "displayName": "jenkins-master-script"
            },
            "dependsOn": [
                "[resourceId('Microsoft.Compute/virtualMachines', 'Jenkins-Master')]"
            ],
            "properties": {
                "publisher": "Microsoft.Azure.Extensions",
                "type": "CustomScript",
                "typeHandlerVersion": "2.0",
                "autoUpgradeMinorVersion": true,
                "settings": {
                    "fileUris": [
                        "[variables('scriptUrlMaster')]"
                    ]
                },
                "protectedSettings": {
                    "commandToExecute": "sh install-jenkins.sh"
                }
            }
        },

properties 配下の settings - fileUris で VM 上で実行する (ダウンロードされる) ファイルの場所を指定しておき、protectedSettingscommandToExecute で実行コマンドを渡しています。

fileUris"[variables('scriptUrlMaster')]" は、2. の "variables": セクションで設定されている変数ですね。

参考 : Linux 仮想マシンで Azure カスタム スクリプト拡張機能 v2 を使用する

Windows (PowerShell) 版

azuredeploy.json
        {
            "name": "node-2/customScript1",
            "type": "Microsoft.Compute/virtualMachines/extensions",
            "apiVersion": "2019-07-01",
            "location": "[parameters('location')]",
            "tags": {
                "displayName": "Jenkins slave for Windows VM"
            },
            "dependsOn": [
                "[resourceId('Microsoft.Compute/virtualMachines', 'node-2')]"
            ],
            "properties": {
                "publisher": "Microsoft.Compute",
                "type": "CustomScriptExtension",
                "typeHandlerVersion": "1.10",
                "autoUpgradeMinorVersion": true,
                "settings": {
                    "fileUris": [
                        "[variables('scriptUrlNode2')]"
                    ]
                },
                "protectedSettings": {
                    "commandToExecute": "powershell -file win-slave.ps1"
                }
            }
        },

こちらも Linux 版と考え方は一緒で、properties 配下の settings - fileUris で VM 上で実行する (ダウンロードされる) ファイルの場所を指定しておき、protectedSettingscommandToExecute で実行コマンドを渡しています。

参考 : Windows でのカスタムのスクリプト拡張機能

こうすることで、デプロイ後に任意のスクリプトを自動実行させることができます。このテンプレートのように、外部の GitHub などで別管理するとやりやすいでしょうかね。IaC でできることが広がっていきますね!

最後に

Azure QuickStart Templates は、Azure を勉強するにあたっては結構宝の山だとも思うので、今後も面白そうなものを読み解いてはアウトプットしていきたいな、と思います。