はじめに
2020/07/11 に、YouTube Live で「つまずき Ansible 【Part10】インベントリーのあれこれ」という配信をしました。 実際に作業しながらエラーと戦って進めるシリーズです。
今回は、インベントリ関する TIPS 的なことをご紹介しました。
やったことや、わかったこと(つまずいたエラーと原因、対処など)をふりかえります。
動画
■ やったこと
ansible-inventory
によるインベントリ確認
ansible-inventory
コマンドはインベントリの確認するのにとても便利。
--graph
オプションで親子関係の確認
$ ansible-inventory -i inventory.ini --graph @all: |--@eos: | |--eos1 |--@ios: | |--rt01 | |--rt02 |--@junos: | |--vsrx1 |--@ungrouped:
--list
オプションで変数などの確認
$ ansible-inventory -i inventory.ini --list { "_meta": { "hostvars": { "eos1": { "ansible_become": true, "ansible_become_method": "enable", "ansible_become_password": "secret", "ansible_connection": "httpapi", "ansible_host": "192.168.1.133", "ansible_httpapi_port": 5080, "ansible_network_os": "eos", "ansible_password": "xxxx", "ansible_user": "ansible" }, "rt01": { "ansible_become": true, "ansible_become_method": "enable", "ansible_become_password": "secret", "ansible_connection": "network_cli", "ansible_host": "192.168.1.11", "ansible_network_os": "ios", "ansible_password": "xxxx", "ansible_user": "admin" }, "rt02": { "ansible_become": true, "ansible_become_method": "enable", "ansible_become_password": "secret", "ansible_connection": "network_cli", "ansible_host": "192.168.1.12", "ansible_network_os": "ios", "ansible_password": "xxxx", "ansible_user": "admin" }, "vsrx1": { "ansible_connection": "network_cli", "ansible_network_os": "junos", "ansible_password": "xxxx", "ansible_port": 33003, "ansible_user": "ansible" } } }, "all": { "children": [ "eos", "ios", "junos", "ungrouped" ] }, "eos": { "hosts": [ "eos1" ] }, "ios": { "hosts": [ "rt01", "rt02" ] }, "junos": { "hosts": [ "vsrx1" ] } }
ini ファイルに定義する変数
bool 値の注意
ini の true
は文字扱い
rt01 ansible_host=192.168.1.11 testvar=true
$ ansible-inventory -i inventory.ini --host rt01 { // 略 "testvar": "true" }
- ini の
True
はbool
扱い
rt01 ansible_host=192.168.1.11 testvar=True
$ ansible-inventory -i inventory.ini --host rt01 { // 略 "testvar": true }
参考
インベントリを yaml で書く
世の中のインベントリファイルのサンプルは ini が多いが、YAML でも書ける。
参考
- yaml – Uses a specific YAML file as an inventory source — Ansible Documentation
- [Ansible] インベントリファイルを YAML 形式で書く - てくなべ (tekunabe)
また、ansible-inventory
の --list
に -y
をあわせて実行すると、既存のインベントリファイルを YAML 形式で表示でき、書きっぷりを参考にできる。
$ ansible-inventory -i inventory.ini --list -y all: children: eos: hosts: eos1: ansible_become: true ansible_become_method: enable ansible_become_password: secret ansible_connection: httpapi ansible_host: 192.168.1.133 ansible_httpapi_port: 5080 ansible_network_os: eos ansible_password: xxxx ansible_user: ansible ios: hosts: rt01: ansible_become: true ansible_become_method: enable ansible_become_password: secret ansible_connection: network_cli ansible_host: 192.168.1.11 ansible_network_os: ios ansible_password: xxxx ansible_user: admin testvar: true rt02: ansible_become: true ansible_become_method: enable ansible_become_password: secret ansible_connection: network_cli ansible_host: 192.168.1.12 ansible_network_os: ios ansible_password: xxxx ansible_user: admin junos: hosts: vsrx1: ansible_connection: network_cli ansible_network_os: junos ansible_password: xxxx ansible_port: 33003 ansible_user: ansible ungrouped: {}
ファイル不要なインベントリ
host_list inventory pluginによる機能。
ファイルを作るまでもない時に便利。個人的には -i localhost,
をよく利用。1つの場合は、末尾に ,
が必要。
複数のインベントリファイルを読み込む
-i
オプションを複数指定する
$ ansible-inventory -i inventory.ini -i inventory2.ini --list
-i
オプションでディレクトリを指定する
$ ansible-inventory -i inventories --list
ただし、ディレクトリ指定の場合は .ini
拡張子のファイルは読み込まないので注意。
参考
外部システムをインベントリとして利用
Ansible は他システムの情報を取得して、動的なインベントリとして利用できる機能がある。Inventory Plugin を切り替えて利用する。
Inventory Plugins — Ansible Documentation
Netbox
NetBox は、OSSの IPAM/DCIM ツール。
netbox inventory plugin を利用する以下の yaml を定義。
netbox.yml
--- plugin: netbox api_endpoint: http://netbox01 token: 0123456789abcdef0123456789abcdef01234567 group_by: - manufacturers # グループ化方法
-i
オプションに上記の yaml ファイルを指定する。
$ ansible-inventory -i netbox.yml --list { "_meta": { "hostvars": { "rt01": { "ansible_connection": "network_cli", "ansible_host": "192.168.1.11", "ansible_network_os": "ios", "ansible_password": "xxxx", "ansible_user": "admin", "device_roles": [ "core" ], "device_types": [ "calalyst" ], "manufacturers": [ "cisco" ], "primary_ip4": "192.168.1.11", "sites": [ "my_site" ] }, "rt02": { "ansible_connection": "network_cli", "ansible_host": "192.168.1.12", "ansible_network_os": "ios", "ansible_password": "xxxx", "ansible_user": "admin", "device_roles": [ "core" ], "device_types": [ "calalyst" ], "manufacturers": [ "cisco" ], "primary_ip4": "192.168.1.12", "sites": [ "my_site" ] } } }, "all": { "children": [ "manufacturers_cisco", "ungrouped" ] }, "manufacturers_cisco": { "hosts": [ "rt01", "rt02" ] } }
もちろん ansible-playbook
の -i
オプションにも指定できる。
参考
■ わかったこと (出会ったエラーと原因と対処)
今回は解説がメインだったため、これといったつまずきはありませんでした。 しいて言えばコマンドのオプションのつけ忘れでしょうか・・。
むしろいただいたフィードバックをから「なるほど!」と思いました。
@akira6592
— すがっち (@sgw_tw) 2020年7月11日
つまづきAnsible【Part10】
ansible-inventoryコマンド。
--list は意図しない変数参照や認証情報を拾ってこないかどうかをplaybook動作させる前に確認できるので、便利だなと思いました。
--list -yにするとさらに見やすいです。大収穫でしたー。#tekunabe
他、ansible-inventory
コマンド自体を今回始めて知った方もいらっしゃったので、ご紹介できてよかったです。
Part11 にむけて
以下のネタを検討中です。気が向いたものをやります。