てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] Tower 上のインベントリを CLI Ansible のダイナミックインベントリとして利用する

はじめに

Ansible は、Inventory Plugin という機能によって、様々な形式のインベントリを利用できるようになっています。

よくある INI や YAML 形式のスタティックなファイル以外にも、ダイナミックにインベントリ情報を取得することもできます。 たとえば、awc_ec2や、vmware_vm_inventorynetboxなどがあります。

他に Ansible Tower のインベントリ情報にも対応しています。

この記事では、tower インベントリプラグインを利用して、Ansible Tower 上で定義したインベントリを、CLI の Ansible で利用する方法を紹介します。

  • 動作確認環境
    • Ansible 2.9.5
    • Ansible Tower 3.6.3
    • もくもく会環境を活用させていただきました

設定ファイルの作成

Ansible Tower への接続情報や、対象のインベントリを指定する設定ファイルを作成します。

公式ドキュメントの例が参考になります。

  • inventory_tower.yml
---
plugin: tower
host: タワーのIPアドレス
username: testuser      # ユーザー名
password: testupassword # パスワード
inventory_id: 2         # インベントリID
validate_certs: false   # SSL 証明書検証の無効化

今回はお試しのため、パスワードは平文で記載していますが、ansible-vault による暗号化などをしたほうがよいです。

inventory_id で指定する ID は、Ansible Tower の画面上で対象のイベントリ画面を開いたときの URL で分かります。

f:id:akira6592:20200415135122p:plain:w500
URL でIDが分かる

なお、今回対象のインベントリはこんな内容です。

f:id:akira6592:20200415135206p:plain:w500
インベントリの雰囲気(グループ)

f:id:akira6592:20200415135237p:plain:w500
インベントリの雰囲気(ホスト)

準備はこれだけです。

あとは、Ansible の各コマンドの -i オプションにこの設定ファイルの yaml を指定するだけです。

確認

Playbook を実行せずとも、インベントリの内容を確認するための ansible-inventoryというコマンドがありますので、ansible-inventory コマンドで確認します。

一覧の表示

ansible-inventory コマンドの、--list オプションで、インベントリのホストや割り当てられる変数の一覧を表示できます。

表示形式はデフォルトでは JSON ですが、-y または --yaml オプションYAML に変更できます。

  • コマンド例
$ ansible-inventory -i inventory_tower.yml --list -y

以下、実行例です。

$ ansible-inventory -i inventory_tower.yml --list -y
all:
  children:
    control:
      hosts:
        ansible:
          ansible_host: 10.0.0.176
          ansible_password: xxxx
          ansible_user: studentXX
          nodes: &id001
            rtr1:
              Loopback100: 192.168.100.1
            rtr2:
              Loopback100: 192.168.100.2
          private_ip: 172.16.49.144
          remote_tower_enabled: 'true'
          remote_tower_id: 2
    dc1:
      hosts:
        rtr1:
          ansible_connection: network_cli
          ansible_host: 10.0.0.249
          ansible_network_os: ios
          ansible_user: ec2-user
          nodes: *id001
          private_ip: 172.16.214.99
          remote_tower_enabled: 'true'
          remote_tower_id: 3
# ...(略)...

グループ階層の確認

--graph オプションで、グループ階層が確認できます。

  • コマンド例
$ ansible-inventory -i inventory_tower.yml --graph

以下、実行例です。

$ ansible-inventory -i inventory_tower.yml --graph
@all:
  |--@control:
  |  |--ansible
  |--@dc1:
  |  |--rtr1
  |  |--rtr3
  |--@dc2:
  |  |--rtr2
  |  |--rtr4
  |--@routers:
  |  |--@arista:
  |  |  |--rtr2
  |  |  |--rtr4
  |  |--@cisco:
  |  |  |--rtr1
  |  |--@juniper:
  |  |  |--rtr3
  |--@ungrouped:

おわりに

この記事では、tower インベントリプラグインを利用して、Ansible Tower 上で定義したインベントリを、CLI の Ansible で利用する方法を紹介しました。

Ansible Tower でいろいろ設定していくと「ちょっとこの Playbook だけ CLI で実行したい」というときに、Tower のインベントリ情報をダイナミックに利用できるのは便利ではないでしょうか。

なお、このプラグインは今後(Ansible 2.10?)、Ansible 本体付属ではなく、awx.awx という Collection 上で開発が進んでいく模様です。

f:id:akira6592:20200415135725p:plain:w300
awx.awx Collection の inventory_plugin

github.com