はじめに
azure.azcollection.azure_rm というインベントリプラグインは、AzureのVMの情報を動的に取得できます。
対象のリソースグループ名やグループ化の仕方、変数の持ち方などをYAMLで定義します。
このインベントリプラグイン利用時に、インベントリ名(inventory_hostname)を仮想マシン名にする方法を紹介します、
- 動作確認環境
- ansible 5.1.0 (ansible-core 2.12.1)
azure.azcollectioncollection 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 オプションを利用するほうが良いかと思います。