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

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

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

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

Q&A

解決済

2回答

1689閲覧

【Ansible】with_itemsがタグを無視して毎回実行してしまうんですが、、、、

kenmero

総合スコア30

Ansible

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

1グッド

0クリップ

投稿2019/08/05 01:12

編集2019/08/05 02:59

背景

Playbookのタスクを大きく二つに分けるために、Ansibleのオプションにある
tagsを用いて制御しようとした。
しかし、include処理が毎回呼ばれてしまうケースに遭遇。

それが原因で、
そのタスク処理で使用する変数を毎回渡さないとエラーになったり、
Ansibleの標準出力結果の「PLAY RECAP」にそのタスクがカウントされてしまう。

調査しても原因がわからず、、、、

誰かこの事象の原因、解決策をご存じの方がいましたら
教えてください。

Sample Code

デバッグモジュールで「hogeXX」とメッセージを出力するシンプルなコードです。
hogeAはメインymlで出力し、hogeB、hogeCはサブymlをincludeして出力しています。
問題となっているのはhogeCで、このタスクが毎回実施されてしまいます。

test.yml --- - name: Junos Module TEST hosts: all # gather_facts: no # become: yes vars: - hoge_dic: - { name: hogeC, msg: hogeC } tasks: - name: hogeA debug: msg="hogeA" tags: hogeA - name: hoges block: - name: hogeB include: hogeB.yml - name: hogeC include: hogeC.yml with_items: - "{{ hoge_dic }}" loop_control: loop_var: hoge_info tags: hoges
hogeB.yml - name: hogeB debug: msg="hogeB"
hogeC.yml - name: hogeC debug: msg="{{ item.msg }}" with_items: - "{{ hoge_info }}"

出力結果 ※tag[hogeA」指定

[root@test playbook]# ansible-playbook -i localhost, test.yml --tags=hogeA PLAY [Junos Module TEST] ******************************************************************************************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************************************************************************** ok: [localhost] TASK [hogeA] ******************************************************************************************************************************************************************************************************************************** ok: [localhost] => { "msg": "hogeA" } TASK [hogeC] ******************************************************************************************************************************************************************************************************************************** included: /etc/ansible/playbook/hogeC.yml for localhost PLAY RECAP ********************************************************************************************************************************************************************************************************************************** localhost : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

出力結果 ※tag[hoges」指定

[root@test playbook]# ansible-playbook -i localhost, test.yml --tags=hoges PLAY [Junos Module TEST] ******************************************************************************************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************************************************************************** ok: [localhost] TASK [hogeB] ******************************************************************************************************************************************************************************************************************************** ok: [localhost] => { "msg": "hogeB" } TASK [hogeC] ******************************************************************************************************************************************************************************************************************************** included: /etc/ansible/playbook/hogeC.yml for localhost TASK [hogeC] ******************************************************************************************************************************************************************************************************************************** ok: [localhost] => (item={u'msg': u'hogeC', u'name': u'hogeC'}) => { "msg": "hogeC" } PLAY RECAP ********************************************************************************************************************************************************************************************************************************** localhost : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

毎回"TASK [hogeC]"が実施されてしまいます。。。。。

urbainleverrier👍を押しています

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

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

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

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

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

urbainleverrier

2019/08/05 04:55

どのような場合にhogeCを実行させたくないのですか?
kenmero

2019/08/05 11:35

ご返答ありがとうございます。 tags:hogesを指定した場合のみ実行したいです。
urbainleverrier

2019/08/05 15:27

失礼しました。 tags:hogesを指定した場合、included: /etc/ansible/playbook/hogeC.yml for localhostとログが出ていますが、その後のtaskは実行されていますか? また、includeではなく、include_tasksではどうですか? versionは最新のものを使っていますか?
kenmero

2019/08/06 06:00

include_tasksを指定することで 解決できました❗ お付き合い頂き大変ありがとうございます! ちなみに、バージョンは2.81 その後のタスクは実行されていませんでした
guest

回答2

0

ベストアンサー

自己流で、参考までにですが、私の場合はplaybookからroleを読み込ませ、roleのmain.yamlには、以下のように書きます。

# main.yaml - name: your task unit name include_tasks: your_task_name.yaml when: your_task_is_run - name: your anothother task unit name include_tasks: your_another_task_name.yaml when: your_another_task_is_run

またplaybookには次のように書きます。

# your_playbook.yaml - hosts: your_target_hosts vars: your_task_is_run: true your_another_task_is_run: false max_fail_percentage: 0 remote_user: root roles: - your_role

playbookでyour_task_is_runといった具合にbooleanで実行するtaskを指定するのがポイントです。
このようにするメリットはmain.yamlで実行するタスクの粒度を完全に制御できることです。
変更の多いタスクが大きなタスクに含まれる場合は適宜ファイルを分割してmain.yamlに含ませることで、一枚のファイルに集中することができるようになります。
コマンドラインからは指定できませんが、playbookで全体の状況を確認してから、実行します。
whenではなく、tagに置き換えることができるかもしれません。

また、この場合playbookには一つのplayのみ書くのが理想です。
もしnodeのセットアップなど、大きなplaybookを書く場合には、all.yamlにまとめて書きます。手作業が必要で面倒ですが、all.yamlを使う場面はそれほど多くないので、私なりには捗っています。

投稿2019/08/05 05:37

編集2019/08/05 05:44
urbainleverrier

総合スコア200

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

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

kenmero

2019/08/05 11:40

ご回答ありがとうございます。 上記の場合のwhenは、ほぼtagsと同じ意味を持った使い方と思われます。 whenで処理を分けても毎回実行されてしまうので解決策にはなりそうにありません。 今回解決したい事象としましては、2つの処理を制御するのもそうなのですが with_itemsを用いてアイテムをいっこずつサブymlに渡して行うタスクを記載した場合に、 毎回実行されてしまうということです。 - name: hogeC include: hogeC.yml with_items: - "{{ hoge_dic }}" loop_control: loop_var: hoge_info
guest

0

with_itemsを使用すると、毎回タスクが実行されるようです。
原因がわかりましたが、対処法がわかりません。

どのようにすればいいのでしょうか?

投稿2019/08/05 01:46

kenmero

総合スコア30

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問