この記事は、Ansible Advent Calendar 2021 (Adventar版) 10日目の記事です。
はじめに
ansible-runner では、インベントリやPlaybook、設定などの資材類のディレクトリ構造の基本が決まっています。
インベントリは 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つのインベントリファイルが扱われることが分かります。
おわりに
私自身は試せていませんが、ダイナミックインベントリもいけるそうです。
教えていただいた通りにダイナミックインベントリを配置したら読み取ってくれました。
— taso@何も分からん (@taso_int) 2021年12月10日
ありがとうございます🙇♂️
他、ansible-runner のドキュメントの Inventory の説明 ansible-runner.readthedocs.io