てくなべ (tekunabe)

ansible / network / automation

[Ansible] 「つまずき Ansible 【Part10】インベントリーのあれこれ」ふりかえり

はじめに

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"
}
  • ini の Truebool 扱い
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 ツール。

f:id:akira6592:20200711211736p:plain
Device 一覧、これをAnsibleのインベントリとして利用できる
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 オプションにも指定できる。

参考


■ わかったこと (出会ったエラーと原因と対処)

今回は解説がメインだったため、これといったつまずきはありませんでした。 しいて言えばコマンドのオプションのつけ忘れでしょうか・・。

むしろいただいたフィードバックをから「なるほど!」と思いました。

他、ansible-inventory コマンド自体を今回始めて知った方もいらっしゃったので、ご紹介できてよかったです。


Part11 にむけて

以下のネタを検討中です。気が向いたものをやります。

  • connection: local ななにか
  • Ansible Toewr / AWX をコマンドがら操作する
  • ansible.cfg
  • Jinja2、フィルター
  • Windows
  • ESXi で VM作成