てくなべ (tekunabe)

ansible / network automation / 学習メモ

[ansible] ansible-runner で複数のインベントリファイルを扱う

この記事は、Ansible Advent Calendar 2021 (Adventar版) 10日目の記事です。

はじめに

ansible-runner では、インベントリやPlaybook、設定などの資材類のディレクトリ構造の基本が決まっています。

ansible-runner.readthedocs.io

インベントリは inventory/hosts です。デモディレクトリにもあります。

ansible-runner run --help の結果には --inventory オプションがあり、default=<private_data_dir>/inventory とのことです。hosts まで指定するものではないようです。

Ansible Runner Options:
  configuration options for controlling the ansible-runner runtime environment.

...(略)...
  --inventory INVENTORY
                        optional path for the location of the inventory content directory (default=<private_data_dir>/inventory)

ふと、複数のインベントリファイルを扱うにはどうしたらいいのだろうと思い、調べたり試したりしていたら、inventory/hosts というファイルではなく「ディレクトリ」の中に複数のインベントリファイルを置いたらできました。

もともと ansible-playbook コマンドの -i オプションでは、ファイルだけはなくディレクトリも指定できるので、この仕様を利用しています。

この記事では簡単なサンプルで説明します。

  • 動作確認
    • ansible-runner 2.1.1
    • ansible-core 2.12.1(Execution Environment のコンテナ側)

ファイル構成

一覧

.
├── env
│   └── settings                  # (1)
├── inventory
│   └── hosts
│       ├── group_vars
│       │   └── all.yml           # (2) 変数ファイル
│       ├── inventory_network     # (3) インベントリ1
│       └── inventory_server.yml  # (4) インベントリ2
└── project
    └── playbooks
        └── test.yml              # (4) Playbook

(1) env/settings

---
process_isolation: true
container_image: localhost/my-ee   # 手元でビルドしたもの ansible-core は 2.12.1

(2) inventory/hosts/group_vars/all.yml

変数定義ファイルです。ここに配置すれば適用される、ということを確認するために、おいてます。

---
greeting: default greeting

(3) inventory/hosts/inventory_network

インベントリファイル1つめ。ini 形式のものです。ファイル名に .ini をつけないのがポイントです。

.ini は、ディレクトリ単位でインベントリを指定した場合の読み込み除外対象の拡張子になっているためです。

[ios]
ios01
ios02

(4) inventory/hosts/inventory_server.yml

インベントリファイル2つめ。形式も複数にしてみたかったので YAML 形式にしてみます。.yml は、除外対象になっていないので、拡張子を普通につけて大丈夫です。

---
all:
  hosts:
    sv01:
    sv02:

(5) project/playbook/test

ansible-runner 経由で実行する Playbook です。

hosts: all なので、今回の場合は、4つのホストが対象になる想定です。

---
- hosts: all
  gather_facts: false
  connection: local

  tasks:
    - name: test debug 1
      ansible.builtin.debug:
        msg: "{{ greeting }}"

Playbookの実行

ansible-runner 経由で、Playbook を実行します。--inventory オプションはつけずに、デフォルのままとします。

$ ls -1   # 実行するディレクトリと資材類の位置関係のデバッグ
env
inventory
project
$ ansible-runner run . -p playbooks/test.yml 

PLAY [all] *********************************************************************

TASK [test debug 1] ************************************************************
ok: [sv01] => {
    "msg": "default greeting"
}
ok: [sv02] => {
    "msg": "default greeting"
}
ok: [ios01] => {
    "msg": "default greeting"
}
ok: [ios02] => {
    "msg": "default greeting"
}

PLAY RECAP *********************************************************************
ios01                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
ios02                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
sv01                       : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
sv02                       : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

4つのホスト分が実行されました。2つのインベントリファイルが扱われることが分かります。

おわりに

私自身は試せていませんが、ダイナミックインベントリもいけるそうです。

他、ansible-runner のドキュメントの Inventory の説明 ansible-runner.readthedocs.io