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

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

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

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

Q&A

解決済

2回答

1706閲覧

Ansible Towerとansible-playbookコマンドの対応関係

_ryo_

総合スコア1

Ansible

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

1グッド

0クリップ

投稿2022/01/06 08:27

実現したいこと

Ansible TowerのInventory > hostsにて、特定にhostを指定した先に定義できるvariablesはhostvarsではないことが分かりました。
これをansible-playbookコマンドで検証してから、Ansible Tower上で実行したい場合に以下のことが知りたいです。

  • Ansible Towerを実行する際の構成に関して、ansible-playbookを実行する際にどのように定義すれば同じ状況を作れるか。

該当のソースコード

ansible-playbook

  • inventory
test-group: hosts: ansible-test1: vars: vars1: "aaa" vars2: "bbb" vars3: "ccc" ansible-test2: vars: vars1: "ddd" vars2: "eee" vars3: "fff" ansible-test3: vars: vars1: "ggg" vars2: "hhh" vars3: "iii"
  • playbook
--- - name: test hosts: all gather_facts: no tasks: - name: vars debug: msg: "{{ vars }}"

Ansible Tower

  • inventory

Inventory > hosts
3つあるhostのうち1つ

イメージ説明

  • playbook

ansible-playbookと同様

詳細

Ansible Towerとansible-playbookコマンドでは、欲しいvarsの階層が違う。

Ansible Towerでは、欲しいvars(vars1, vars2, vars3)がhostvarsと同様の階層にあるのに対し、
ansible-playbookコマンドでは、varsの下にその3つのvarsが入っている。

  • ansible-playbook
ok: [ansible-test3] => { "msg": { (省略) "groups": { "all": [ "ansible-test1", "ansible-test2", "ansible-test3" ], "test-group": [ "ansible-test1", "ansible-test2", "ansible-test3" ], "ungrouped": [] }, "hostvars": { "ansible-test1": { (省略) "vars": { "vars1": "aaa", "vars2": "bbb", "vars3": "ccc" } }, "ansible-test2": { (省略) "vars": { "vars1": "ddd", "vars2": "eee", "vars3": "fff" } }, "ansible-test3": { (省略) "vars": { "vars1": "ggg", "vars2": "hhh", "vars3": "iii" } } }, (省略) "vars": { "vars1": "ggg", "vars2": "hhh", "vars3": "iii" } } }
  • Ansible Tower
これより上は省略 ok: [ansible-test3] => { "msg": { (省略) "groups": { "all": [ "ansible-test2", "ansible-test3", "ansible-test1" ], "test-group": [ "ansible-test2", "ansible-test3", "ansible-test1" ], "ungrouped": [] }, "hostvars": { "ansible-test1": { (省略) "vars1": "aaa", "vars2": "bbb", "vars3": "ccc" }, "ansible-test2": { (省略) "vars1": "ddd", "vars2": "eee", "vars3": "fff" }, "ansible-test3": { (省略) "vars1": "ggg", "vars2": "hhh", "vars3": "iii" } }, (省略) "vars1": "ggg", "vars2": "hhh", "vars3": "iii" } }
endy👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

回答

Ansible Towerを実行する際の構成に関して、ansible-playbookを実行する際にどのように定義すれば同じ状況を作れるか。

「CLIとGUIで同じ出力を得たい」という質問内容と理解しました。
今回は、「CLIと同じ出力を得るためにGUI側の変数定義を変える方法」を回答します。

Playbookではなく、変数定義を変えます。

Ansible TowerのInventory > hostsにて、特定にhostを指定した先に定義できるvariablesはhostvarsではないことが分かりました。

CLIのinventory配下に定義した変数と、TowerのInventory > hosts > (特定ホスト) 配下に定義した変数は同じもののはずです。
どちらも、変数の優先順位インベントリー host_vars/*に相当します。

では、なぜ今回のようにCLIとGUIで異なる出力になったかというと、CLIとGUIで定義している変数が単純に異なるためだと思います。

CLIのinventoryでは、以下のように2階層の辞書構造を定義しています。
最上位階層に注目すると、vars という key に対して { vars1: "aaa", vars2: "bbb", vars3: "ccc" } という辞書型のvalueを紐付ける構造です。

参考情報として、コメントで同じ意味を持つFlow styleの変数構造も書きました。

yaml

1vars: 2 vars1: "aaa" 3 vars2: "bbb" 4 vars3: "ccc" 5 6# { vars: { vars1: "aaa", vars2: "bbb", vars3: "ccc" } }

GUIのinventoryでは、以下のように単一階層の辞書構造を定義しています。

yaml

1vars1: "aaa" 2vars2: "bbb" 3vars3: "ccc" 4 5# { vars1: "aaa", vars2: "bbb", vars3: "ccc" }

CLIと同じ変数構造を持たせたい場合には、GUIの方にも同じように変数を定義すると良いと思います。
具体的には、以下のとおりです。

yaml

1vars: 2 vars1: "aaa" 3 vars2: "bbb" 4 vars3: "ccc"

P.S.

手元にTowerがなくて検証できていないので、ミスがあったらすみません。
お手数ですが、回答内容が意図に沿っているか、ご自身でも動作確認いただけますと幸いです。

投稿2022/01/06 14:20

stopendy0122

総合スコア170

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

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

_ryo_

2022/01/07 05:15

ご回答いただき、誠にありがとうございます。 おっしゃる通り、GUI側を合わせるというものは代替案として用意してありまして、 GUIの形式に合わせられるようCLI側のinventoryなどをどうにかできないかなと思っていました。 ただ、調べている中でなかなか実現が難しそうに感じておりまして、もう少し粘ってみてダメそうであれば > 「CLIと同じ出力を得るためにGUI側の変数定義を変える方法」 という形で進めていこうかなと思います。 どうぞよろしくお願い致します。
stopendy0122

2022/01/07 07:12 編集

> GUIの形式に合わせられるようCLI側のinventoryなどをどうにかできないかなと思っていました。 なるほど! CLIのインベントリをこのように書くと、GUIと同様に最上位レイヤにvars1, vars2, vars3 と3つの変数が並ぶことになります。 こちらは意図のとおりになっていますでしょうか?? ※teratailの仕様でコメント返信ではYAMLのレイアウトが崩れてしまうため、インデントを`.`で表現しています。お手数ですが、手元でお試しいただく際には、事前に`.`を半角スペースに置換いただければと思います。 ```yaml test-group: ..hosts: ....ansible-test1: ......vars1: "aaa" ......vars2: "bbb" ......vars3: "ccc" ....ansible-test2: ......vars1: "ddd" ......vars2: "eee" ......vars3: "fff" ....ansible-test3: ......vars1: "ggg" ......vars2: "hhh" ......vars3: "iii" # { test-group: { hosts: { ansible-test1: { vars1: "aaa", vars2: "bbb", vars3: "ccc" }, ansible-test2: { (略) }, ansible-test3: { (略) } } } } ``` 上記のように変数定義すると、varsという変数は存在しなくなります。 したがって元のplaybookも動作しなくなるので、以下のようにvarsという変数を使わない形に変形する必要があります。 ```yaml --- - name: test ..hosts: all ..gather_facts: no ..tasks: ..- name: vars ....debug: ......msg: "{{ vars1 }}\n{{ vars2 }}\n{{ vars3 }}" ```
_ryo_

2022/01/20 04:06

お返事が遅くなってしまい、申し訳ございません。 今回いただいたもので、想定していたものが実現できました。 誠にありがとうございます。 構造として、以下のような形をとるものという固定概念からvarsを入れていました。 ``` atlanta: hosts: host1: host2: vars: ntp_server: ntp.atlanta.example.com proxy: proxy.atlanta.example.com ``` この度は誠にありがとうございました。
stopendy0122

2022/02/26 10:53

無事に進んだようで良かったです。 こちらこそ、反応が遅れて失礼いたしました。 jira01030さんもご回答してくださっているので、そちらの方もご確認お願いします。 (もしかしたら気づいていないのでは...と) CLIで作成したインベントリをTowerにインポートする機能は、CLIからGUIに移行するときに役に立つテクニックですし、参考になると思いますよ。 もちろん、今回のようにCLIとGUIの挙動差分が疑われる場合の確認方法としても有用です。 引き続き開発頑張ってくださいね。
guest

0

手元の環境では、頂いたInventoryをAnsibleTowerにImportしたところ、_ryo_さんが仰っているCLIと同等の階層構造になりました。

イメージ説明

推測になりますが、AnsibleTowerにホスト情報を手動定義された際に階層構造を1つ下げて定義されたのではないかと思います。

CLIで使用されているインベントリファイルをそのままAnsibleTowerで利用するには

インベントリ>新規ソースの作成>ソース:プロジェクト

でインベントリファイルが格納されているGitのリポジトリを選択すれば、インベントリファイルのホスト情報をAnsibleTowerにインポートできます。

これでCLIとGUIで差が出ることは無いかと思います(見当違いなこと言ってたらすいません

投稿2022/01/07 08:36

jir01030

総合スコア129

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問