ARM templateのパラメータファイル渡しとJson Parser
ARM templateについてご質問をいただくことも多くなってきたので
このへんで少し活用するためのワザを紹介しておきましょう。
紹介するワザは2つ。
1)テンプレートをパラメータファイルと分けて管理する
2)出力されたJson形式から必要な要素をパース処理する
どちらもARM templateをシンプルに利用するだけなら必要ないですが
個社・個別にカスタマイズ・管理していくと必ずぶち当たる壁でもあります。
まず1)についてからいきましょう。参考とするサイトは以下です。
Azure CLI とテンプレートを使用してリソースをデプロイする | Microsoft Docs
⇒「パラメーターファイル」と記載されたサイト中央に記載されています。
ご利用されるケースとしては、ARM templateで自社の自動化パターンを
いくつか用意したが、VM名やvNETアドレス、OS起動時の自動実行スクリプト
など、依頼・利用したい側のユーザー部門の要望に合わせて柔軟に対応したい。
でもユーザー部門に記入いただく範囲はJSON本体ファイル全てではなく
パラメーター部分の範囲だけに絞りたい、そんなご要望にお応えできる機能です。
つまり企業内で言えば情報システム部門はJSONの本体ファイルの管理と
デプロイを担い、ユーザー部門やグループ企業へ記入をお願いする範囲は
パラメーターファイルのみにしたい、といったケースですね。
では実行時のサンプルからいきましょう。(1行です)
az group deployment create
--resource-group ${your_resource_group_name}
--template-file original.json
--parameters @parameterssample.json
ここではoriginal.jsonというファイルが本体ファイルで、parameterssample.json
というファイルが個別に用意したパラメーターファイルです。
ポイントをいくつか記載しておきます。
まず、本体ファイルであるoriginal.jsonですが、特に手を加える必要は
ありません。そのままテンプレートデプロイできる本体ファイルの
ままで修正する個所はありません。これは楽ちんです。
次にパラメーターファイルであるparametersample.jsonは
記載方法が本体ファイルのparameters{}とは若干異なります。
以下の部分は本体ファイルと同じです。(共通部分)
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
}
}
注意が必要なのはparameters{}内に入れた変数名と値の指定方法です。
以下がパラメーターファイルのサンプルです。
"parameters": {
"loginUser": {
"Value": "azure02"
},
"virtualMachines_name": {
"Value": "centclient201"
},
"vmSize": {
"Value": "Standard_A2"
}
}
パラメータファイルの注意点:
・TypeやMetadataなどの項目は指定しない。
・defaultValueはValueとして指定する。
※Valueの値「""内」だけユーザー部門に入力してもらう
・パラメーターファイルに記載する変数名(例:loginUser)
は本体ファイルに定義した変数名と合わせる必要がある
・本体ファイルに記載されていない変数はパラメーターファイルに
追記できない。(デプロイ前にエラーになる)
・本体ファイルに記載されている変数名と値はパラメーターファイルで
必ず記載する必要はない。省略可能ということ。
(本体ファイルに指定されている値がデプロイ時に有効)
・本体ファイルに記載されている変数名と値が、パラメーターファイル
で指定されているものと全く同じ変数名と値でも、デプロイに問題
はない。(ユーザー部門が修正された個所だけ変更される)
上記の注意点を守って記載してあげれば、2018/5現在の仕様では
ちゃんとデプロイできます。
本体ファイルさえ用意できていれば、パラメーターファイルだけ
分割して用意してあげることで管理は柔軟に対応できますね。ステキ。
では最後に2)のJson Parserについて触れていきましょう。
その名の通りJSON形式の出力をパース処理で必要な範囲だけ
くり抜く、というものです。
Linux環境ではjqと呼ばれるjson parserがメジャーですので
ARM templateの結果に対してjqを使う場合のTipsを記載しておきます。
jqは64bitOSなら以下からダウンロードできます。
$ wget http://stedolan.github.io/jq/download/linux64/jq
$ chmod 755 ./jq
以下Tipsです。
〇test.jsonのparametersに記載されているキー名のみ出力
$ jq '.parameters | keys' test.json | awk -F"\"" '{ print $2 }'
〇可用性セットの範囲だけ出力
$ jq '[.resources | select(.type == "Microsoft.Compute/availabilitySets")]' test.json
〇可用性セットに記載されている範囲のapiVersionの値だけ出力
$ jq '[.resources | select(.type == "Microsoft.Compute/availabilitySets") .apiVersion]' test.json
〇可用性セットに記載されている範囲のUpdateDomainの値だけ出力
$ jq '[.resources | select(.type == "Microsoft.Compute/availabilitySets") .properties.platformUpdateDomainCount]' test.json
〇可用性セットに記載されている範囲のVMのResourceIDの値だけ出力
$ jq '[.resources | select(.type == "Microsoft.Compute/availabilitySets") .properties.virtualMachines.id]' test.json
〇ストレージアカウントが記載されている範囲の冗長方式の値だけ出力
$ jq '[.resources | select(.type == "Microsoft.Storage/storageAccounts") .sku.name]' test.json
jqはこんな感じにしておきましょう。出力結果にダブルコート
などの記号が入る場合もあるので、必要に応じてtrやsedで整形して
くださいね。
次にJMESPath(じぇむすぱす)を少し紹介しておきます。
JMESPathはAzure CLI2.0(azコマンドの方)がインストールされて
いる環境であれば利用できます。
Azure CLI 2.0 でのクエリ コマンドの結果 | Microsoft Docs
こちらのイメージとしては、jqのようにJSONファイルやJSON出力
をベースに加工するのではなく、Azureのコマンドラインの出力結果
(JSON出力)を範囲を絞って出力させる、というものです。
そこそこ利用しているものをTipsでまとめておきました。
ベースとするJSON形式は以下のVM情報出力結果としています。
$ az vm show -g ${resourceGroupname} -n ${vmName}
〇対象VMのJSON出力の中でosProfileの範囲のみ出力
$ az vm show -g ${resourceGroupname} -n ${vmName} --query osProfile
〇osProfile内にあるlinuxConfiguration、ssh内のpublicKeysを出力
$ az vm show -g ${resourceGroupname} -n ${vmName} --query osProfile.linuxConfiguration.ssh.publicKeys
〇jqと組わせてpublicKeysのkeyData値のみ出力
$ az vm show -g ${resourceGroupname} -n ${vmName} --query osProfile.linuxConfiguration.ssh.publicKeys | jq '. .path'
ベースとするJSON形式は以下のネットワークインターフェース情報
出力結果としています。
$ az network nic show –g ${resorceGroupname} –n ${nicName}
〇ipConfigurations内のprivateIpAddressのみ出力
$ az network nic show –g ${resorceGroupname} –n ${nicName} --query ipConfigurations.privateIpAddress
〇ipConfigurations内のprivateIpAddressを値のみtsv形式で出力
$ az network nic show –g ${resorceGroupname} –n ${nicName} --query ipConfigurations[].privateIpAddress --output tsv
以上ですが、いかがでしたか。
単純にJSONテンプレートを利用するだけなら必要はありませんが
カスタマイズしていく過程では上記のような文字列・JSON整形が
必要になってくるケースもあると思います。
是非コネコネとイジり倒して効率的なテンプレート作成を試してみましょう。