はじめに
2020/07/11 に、YouTube Live で「つまずき Ansible 【Part10】インベントリーのあれこれ」という配信をしました。
実際に作業しながらエラーと戦って進めるシリーズです。
tekunabe.connpass.com
今回は、インベントリ関する TIPS 的なことをご紹介しました。
やったことや、わかったこと(つまずいたエラーと原因、対処など)をふりかえります。
動画
youtu.be
■ やったこと
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"
}
rt01 ansible_host=192.168.1.11 testvar=True
$ ansible-inventory -i inventory.ini --host rt01
{
// 略
"testvar": true
}
参考
インベントリを yaml で書く
世の中のインベントリファイルのサンプルは ini が多いが、YAML でも書ける。
参考
また、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 を定義。
---
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
オプションにも指定できる。
参考
■ わかったこと (出会ったエラーと原因と対処)
今回は解説がメインだったため、これといったつまずきはありませんでした。
しいて言えばコマンドのオプションのつけ忘れでしょうか・・。
むしろいただいたフィードバックをから「なるほど!」と思いました。
他、ansible-inventory
コマンド自体を今回始めて知った方もいらっしゃったので、ご紹介できてよかったです。
Part11 にむけて
以下のネタを検討中です。気が向いたものをやります。
- connection: local ななにか
- Ansible Toewr / AWX をコマンドがら操作する
- ansible.cfg
- Jinja2、フィルター
- Windows
- ESXi で VM作成