てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible/Azure] azure.azcollection.azure_rm インベントプラグインでプライベートIPアドレスを接続先にする

はじめに

Ansible から Azure の VM の情報を取得して動的にインベントリを生成できる azure.azcollection.azure_rm インベントリプラグインという便利なものがあります。

こちらの issue で、プライベートIPアドレスを接続先にするにはどうしたらよいかという質問がありました。パブリックIPアドレスを持っているとパブリックIPアドレスを優先するので、その挙動が不都合なことがあるようです。

回答した内容でうまくいったようなので、こちらにもまとめおきます。

  • 環境
    • azure.azcollection 1.14.0

ansible_host 変数にプライベートIPアドレスをセットする

インベントリファイル内で、hostvar_expressions オプションを利用し、変数の対応付けをします。具体的には、接続先に利用する ansible_host 変数に private_ipv4_addresses | first を設定します。

---
plugin: azure.azcollection.azure_rm
plain_host_names: true # インベントリ名を仮想マシン名にする(本件とは直接関係ない)
hostvar_expressions:
  ansible_host: private_ipv4_addresses | first    # ポイント

インベントリファイル名の末尾は azure_rm.yaml または azure_rm.yamlある必要があります

なお、変数の対応付けする類似オプションとして compose がありますが、azure.azcollection コレクション 1.14.0 までは対応していない(ドキュメントにはある)ようなのでご注意ください。1.15.0 で compose対応しました

確認

ここでは、簡易的に ansible-inventory コマンドで各ホストの変数を表示する方法で確認します。

% ansible-inventory -i azure_rm.yaml --list | grep ansible_host
                "ansible_host": "10.1.0.9",
                "ansible_host": "10.1.0.4",
                "ansible_host": "10.1.0.7",
                "ansible_host": "10.1.0.8",

プライベートIPアドレスがセットされていることが分かります。

おわりに

ドキュメントの例に、ぴったりな例がないので、分かりにくかったようです。よく使いそうな例があるだけでドキュメントとしての価値は上がると思うので、今後もし追加したほうがよさそうな例があれば追加してみたいと思いました。