てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible/Azure] azure_rm インベントリプラグインでインベントリ名を仮想マシン名に合わせる

はじめに

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 オプションを利用するほうが良いかと思います。