はじめに
azure.azcollection.azure_rm
というインベントリプラグインは、AzureのVMの情報を動的に取得できます。
対象のリソースグループ名やグループ化の仕方、変数の持ち方などをYAMLで定義します。
このインベントリプラグイン利用時に、インベントリ名(inventory_hostname
)を仮想マシン名にする方法を紹介します、
- 動作確認環境
- ansible 5.1.0 (ansible-core 2.12.1)
azure.azcollection
collection 1.10.0
デフォルトでは?
デフォルトでは、インベントリ名は 仮想マシン名_4文字
のようになります。
仮想マシン名
は、仮想マシンをポータルで作成する画面でいう「仮想マシン名」です。
4文字のところは、仮想マシンのID(/subscriptions/サブスクリプションID/resourceGroups/リソースグループ名/providers/Microsoft.Compute/virtualMachines/仮想マシン名
)をもとにしたハッシュ値の最初の4文字です。
リソースグループが別だと同じ仮想マシン名が許容されるので、競合させないための工夫のようです。
ですが、設計上全リソースグループ内で仮想マシン名をユニークにしていたり、include_vm_resource_groups
パラメーター で対象リソースグループを制限している場合などでは仮想マシン名は競合せず、インベントリ名を仮想マシン名に合わせたいケースもあるかもしれません。
仮想マシン名に合わせる機能は、インベントリプラグインとしては後から追加され、実装上はAzure rm legacy hostnames
と呼んでいたようです。
インベントリ名を仮想マシン名にするサンプル
インベントリ名を仮想マシン名にするには、以下のように、plain_host_names
オプションに、true
を指定します。
inventory_azure_rm.yml
plugin: azure.azcollection.azure_rm include_vm_resource_groups: # (参考) 対象リソースグループ名、デフォルトはすべて - ansible_azure plain_host_names: true # インベントリ名を仮想マシン名にする conditional_groups: # (参考) 動的なグループ定義 windows: "'WindowsServer' in image.offer"
なお、ファイル名は公式ドキュメントにあるように、ファイル名を azure_rm.(yml|yaml)
で終わるようにします。
実行例
インベントリ名を書くにするために、debug
モジュールで、"I am {{ inventory_hostname }}"
を出力するだけのPlaybookを実行します。ここでは、ansible01
が仮想マシン名です
$ ansible-playbook -i inventory_azure_rm.yml debug.yml PLAY [all] ************************************************************************************************************ TASK [debug inventory_hostname] *************************************************************************************** ok: [ansible01] => { "msg": "I am ansible01" } PLAY RECAP ************************************************************************************************************ ansible01 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
インベントリ名を確認するだけなら、Playbookは実行せずに ansible-inventory
コマンドを利用すのが便利です。
$ ansible-inventory -i inventory_azure_rm.yml --graph @all: |--@ungrouped: |--@windows: | |--ansible01
なお、デフォルトである plain_host_names: false
の場合は、以下のようにインベントリ名は 仮想マシン名_4文字
になります
$ ansible-inventory -i inventory_azure_rm.yml --graph @all: |--@ungrouped: |--@windows: | |--ansible01_d165
別解
以下のように、hostaname
オプションで name
を指定することでも、結果的には同じ挙動になります。
# ...略... hostnames: - name
より意図を示すためには、plain_host_names
オプションを利用するほうが良いかと思います。