質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

受付中

Ansible のディレクトリ構成と検索パス

_raki
_raki

総合スコア39

Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

2回答

0リアクション

0クリップ

424閲覧

投稿2022/03/09 08:53

編集2022/03/09 17:06

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

ansible $ tree . |-- group_vars | `-- all | `-- test.yml |-- host_vars | `-- localhost | `-- test.yml |-- inventories | `-- localhost |-- logs |-- playbooks | `-- test.yml `-- roles 8 directories, 4 files

ファイル

bash

ansible $ cat group_vars/all/test.yml gv: "group_vars/all/test.yml" hv: "group_vars/all/test.yml" ansible $ cat host_vars/localhost/test.yml gv: "host_vars/localhost/test.yml" hv: "host_vars/localhost/test.yml" ansible $ cat inventories/localhost localhost ansible $ cat playbooks/test.yml - hosts: all gather_facts: yes tasks: - name: debug debug: msg: "I am {{ inventory_hostname }}. group_vars gv is {{ gv }}. host_vars hv is {{ hv }}."

環境変数(WSL2でWindowsディレクトリをマウントしている関係で ansible.cfgは使っていない)

bash

ansible $ env | grep -i ansible ANSIBLE_CALLBACK_WHITELIST=ansible.posix.profile_tasks ANSIBLE_INVENTORY=inventories ANSIBLE_LOG_PATH=logs/ansible_20220309015357.log ANSIBLE_ROLES_PATH=./roles ANSIBLE_PLAYBOOK_VARS_ROOT=all ANSIBLE_VERSION=2.10.0

実行例

※ ANSIBLE_INVENTORY で -i を省略している
※ 実際に使う時は playbook だけ指定して使う

bash

ansible-playbook playbooks/test.yml -c local --check --diff # group_vars/all/test.yml が読み込まれていないので The task includes an option with an undefined variable. The error was: 'gv' is undefined になる

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

playbook $ diff base.py* 895,898d894 < run_dir = os.path.dirname(os.path.dirname(self.get_path())) < if run_dir not in path_stack: < path_stack.append(run_dir) <

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。