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

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

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

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

Q&A

2回答

1569閲覧

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

_raki

総合スコア82

Ansible

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

0グッド

0クリップ

投稿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

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<

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

playbooksフォルダの配下にgroup_varsフォルダとhost_varsフォルダを移動するのはいかがですか?
変数の優先順位を参考にして頂ければお分かりかと思います。
https://docs.ansible.com/ansible/2.9_ja/user_guide/playbooks_variables.html#ansible-variable-precedence

ご存知かと思いますが、ansible-playbook実行時に -i でインベントリを指定するので、そのインベントリから見て↑の変数の優先順位が適用されます。それと同時にplaybookから見ても同様な優先順位が適用されます。
つまり双方の変数が読み込まれるので利用シーンに応じて適宜使分けることが可能です。

投稿2022/03/09 09:22

comefigo

総合スコア1045

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_raki

2022/03/09 09:32

ありがとうございます。でも逆なんです。 inventories や playbooks ディレクトリの外に group_vars と host_vars を出したいんです。 inventory の整理はマルチクラウドな昨今、aws,gcp,azure などがあり、localhost の他、ローカル用に docker 指定など多数のファイルがあり、フォルダで分割したい。 inventories にサブディレクトリを作るとなると、group_vars/host_vars もその下にそれぞれ作る必要が出てしまいます。 DR用途なども含め、これらvarsを全ての inventory で共有したいのです。 同じく playbooks ディレクトリも、packer 用、インスタンス用、ツール用、運用用など多数のファイルがあり、それぞれ別のディレクトリ(playbooks_xxxとして)にしています。 どれかの playbooks ディレクトリの下に group_vars/host_vars を持っていくなら、最初から inventories の下に置いておけばいいのです。
comefigo

2022/03/09 10:13

なるほど。 そこまで多様なものは簡単にカバーできる術はなさそうですね。 うちのプロジェクトでもgroup_varsを使いつつ、一部の変数はvars_filesで読み込ませたりしています。 また、全く同じgroup_varsを参照したいときはシンボリックリンクを使ってたりしています。
_raki

2022/03/09 14:01

ですよね。 うちもそうしてるんですけど、いい加減そこら辺をもうちょいクリーンにしたいなと思いまして。。。 playにvars_files指定するのもシンボリックリンクをリポジトリに追加してWindowsやMacでぐぬぬってなるのももう嫌だなって。。。
guest

0

完璧な方法ではありませんが、シンボリックリンクで対処する方法もあると思います。
(Ansibleではなく、Linux的な解決方法として)

シンボリックリンク案

前提として、カレントディレクトリの位置は以下のログの通りだとします。
わかりづらくてすみませんが、treeコマンドのログから読み取ってください。

sh

1ansible $ tree 2. 3├── group_vars 4│   └── all 5│   └── test.yml 6├── host_vars 7│   └── localhost 8│   └── test.yml 9├── inventories 10│   └── localhost 11└── playbooks 12 └── test.yml

シンボリック案の実装に必要なコマンドは以下2行だけです。

sh

1ln -s ../group_vars inventories/ 2ln -s ../host_vars inventories/

シンボリック作成後のtreeは以下のようになります。
inventories/配下にgroup_varshost_varsという2つのシンボリックリンクが存在し、上位ディレクトリを参照するようになっています。
これにより、上位ディレクトリのgroup_varshost_varsを読み込むことが可能となります。

sh

1ansible $ tree 2. 3├── group_vars 4│   └── all 5│   └── test.yml 6├── host_vars 7│   └── localhost 8│   └── test.yml 9├── inventories 10│   ├── group_vars -> ../group_vars 11│   ├── host_vars -> ../host_vars 12│   └── localhost 13└── playbooks 14 └── test.yml

思いつく限りのメリット/デメリットは以下のとおりです。

メリット

  • ソースコード改修よりもシンプル
  • 今後Ansibleの仕様変更があったとしても容易に対応できる

デメリット

  • Projectの数だけシンボリックリンクを作成する工程は必要になります
  • VS Codeでの操作には若干注意が必要です
    • VS Code上でもシンボリックリンクは "一応" 認識されます (シンボリックリンクのアイコンが表示されます)
    • しかし、VS Code上でinventory/group_varsを右クリックしてDeleteすると、そこはフォルダ扱いになって参照先の変数ファイルも巻き込んで消してしまいます
    • コマンドでrm inventory/group_varsを実行すればシンボリックリンクだけ消えてくれます
    • シンボリックリンクファイルを消したいときは、VS CodeのGUI機能ではなくInteractive Shellのrmコマンドなどで消す必要があります
  • シンボリックリンクに対応していないファイルシステムにシンボリックリンクファイルを持ち出すとファイルが破損する気がします (Windowsなど)
    • 未検証なのでわかりませんが、シンボリックファイルをWindowsに持っていくとただのテキストファイルになったような...
    • 例えば、以下のようなワークフローとは相性が悪いです
      • Windowsマシン上でgit cloneしてAnsible Playbookを編集してgit pushする
      • その後Ansibleサーバにてgit cloneしてデプロイする
    • 今はVS CodeなどのエディタにRemote SSH相当の機能があるので、Windows上で開発することは滅多になく、問題にならないとは思います

投稿2022/03/26 07:00

編集2022/03/26 07:44
stopendy0122

総合スコア163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stopendy0122

2022/03/26 07:46

コメントのやり取りで「シンボリックリンク」にも言及があることに今更気づきました。 ちゃんと読んでなくてすみません。
_raki

2022/03/26 11:21

いえ。ありがとうございます。 シンボリックリンクはご説明のとおり、環境に依存してしまうので今回は見送りです。 (対応自体はシンボリックリンクでできるけどリポジトリで共有とか異機種環境とかランナーとかほんと面倒だし) そもそも Ansible のユースケースとコードの問題だと思っているので、設定で解決できないのがわかったらもういいかなって。。。
stopendy0122

2022/03/26 14:18

なるほど。確かに仰るとおりですね。 承知しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問