Ansible のディレクトリ構造について
https://docs.ansible.com/ansible/2.8/user_guide/playbooks_best_practices.html#directory-layout
https://docs.ansible.com/ansible/2.8/user_guide/playbooks_best_practices.html#alternative-directory-layout
があって、二つを合わせた感じの構造にしたいんですが、vars を読み込ませる”設定”がなくて、できないのかどうか、を確認したいです。
※ playbook 中で var_files で相対的にパスを指定すれば読み込めるんだけど、それはしたくない(既にそうしてて辞めたい)
構造
bash
1ansible $ tree 2. 3|-- group_vars 4| `-- all 5| `-- test.yml 6|-- host_vars 7| `-- localhost 8| `-- test.yml 9|-- inventories 10| `-- localhost 11|-- logs 12|-- playbooks 13| `-- test.yml 14`-- roles 15 168 directories, 4 files
ファイル
bash
1ansible $ cat group_vars/all/test.yml 2gv: "group_vars/all/test.yml" 3hv: "group_vars/all/test.yml" 4 5ansible $ cat host_vars/localhost/test.yml 6gv: "host_vars/localhost/test.yml" 7hv: "host_vars/localhost/test.yml" 8 9ansible $ cat inventories/localhost 10localhost 11 12ansible $ cat playbooks/test.yml 13- hosts: all 14 gather_facts: yes 15 16 tasks: 17 - name: debug 18 debug: 19 msg: "I am {{ inventory_hostname }}. group_vars gv is {{ gv }}. host_vars hv is {{ hv }}." 20
環境変数(WSL2でWindowsディレクトリをマウントしている関係で ansible.cfgは使っていない)
bash
1ansible $ env | grep -i ansible 2ANSIBLE_CALLBACK_WHITELIST=ansible.posix.profile_tasks 3ANSIBLE_INVENTORY=inventories 4ANSIBLE_LOG_PATH=logs/ansible_20220309015357.log 5ANSIBLE_ROLES_PATH=./roles 6ANSIBLE_PLAYBOOK_VARS_ROOT=all 7ANSIBLE_VERSION=2.10.0
実行例
※ ANSIBLE_INVENTORY で -i を省略している
※ 実際に使う時は playbook だけ指定して使う
bash
1ansible-playbook playbooks/test.yml -c local --check --diff 2 3# group_vars/all/test.yml が読み込まれていないので 4The task includes an option with an undefined variable. The error was: 'gv' is undefined 5になる 6
group_vars と host_vars を inventories の下に持っていけば使える(altの構成)のはわかっています。
単に inventory と playbook がたくさんあるのでそれぞれ整理したいのと、vars を inventory の下から出したい、と思っています。
ANSIBLE_PLAYBOOK_VARS_ROOT の top, bottom, all のいずれもダメ(そりゃそう)だったので、どうにかならないかなという感じです。
コードで言えばこの辺
https://github.com/ansible/ansible/blob/devel/lib/ansible/vars/manager.py#L208
で、つまり
https://github.com/ansible/ansible/blob/6f445ca6e5c9c8b85ccc5062e00508c69ca26fde/lib/ansible/playbook/base.py#L880
なので、実行場所起点でstackしてないからかなと。。。
playbooks か inventories ディレクトリを辞めれば通るんだけど、どっちも複数のファイルがあるので整理したいという感じです。
何かいい方法について心当たりがあれば教えてください。
2022/03/10 01:30 追記
とりあえずデフォルトのままだとどうにもならないのはコード的に確認できたので、ちょっと試しに上記の playbook/base.py をいじってうまく動くことを確認しました。
python にも ansible のコードにも明るくないので、playbooks ディレクトリに play を置いている前提で1つ上のディレクトリを指定しただけです。
run_dir に ansible の実行ディレクトリを指定できればそれでよくて、もしかしたら vars_plugin でオーバーライドしちゃえばいけるんじゃないかと思いました。
vars_plugin で既に同じ処理ができるものがないか検索してみたところパスを追加できるようなものはなかったようです。
bash
1playbook $ diff base.py* 2895,898d894 3< run_dir = os.path.dirname(os.path.dirname(self.get_path())) 4< if run_dir not in path_stack: 5< path_stack.append(run_dir) 6<
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2022/03/09 09:32
2022/03/09 10:13
2022/03/09 14:01