LinuxユーザーがイジるはじめてのAzure

LinuxユーザーがAzureを使いこなせるように応援するブログです

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

可用性セットに記載されている範囲のVMResourceIDの値だけ出力

$ 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}

〇対象VMJSON出力の中でosProfileの範囲のみ出力

 $ az vm show -g ${resourceGroupname} -n ${vmName} --query osProfile

osProfile内にあるlinuxConfiguration、sshpublicKeysを出力

 $ 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整形が

必要になってくるケースもあると思います。

 

是非コネコネとイジり倒して効率的なテンプレート作成を試してみましょう。