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

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

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

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

Q&A

解決済

1回答

820閲覧

Ansible loopで実行しているタスクについて、一定条件にマッチした場合はloop処理だけを停止して後続タスクを実行したい

khaii21

総合スコア66

Ansible

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

0グッド

0クリップ

投稿2023/05/15 02:25

編集2023/05/15 10:28

実現したいこと

test.yml内にてloop処理を設定してtest_loop.ymlをincludeしています。
test_loop.ymlで条件にマッチした場合にloop処理だけを停止して、Task 1とTask 2の後続タスクを実行したいです。
test_loop.yml内で条件にマッチした場合にloop処理だけを停止して、後続のTask 1とTask 2を実行する方法はありますでしょうか?
宜しくお願い致します。

該当のソースコード

main.yml

1- name: Loop 2 ansible.builtin.include_tasks: test.yml 3- name: Task 1 4 ansible.builtin.include_tasks: taks1.yml 5- name: Task 2 6 ansible.builtin.include_tasks: task2.yml

test.yml

1 ansible.builtin.include_tasks: test_loop.yml 2 loop: [1, 2, 3]

test_loop.yml

1--- 2- name: Chefk status of hoge 3 ansible.builtin.systemd: 4 name: "hoge.service" 5- name: Start hoge when not running 6 ansible.builtin.service: 7 name: hoge 8 state: started 9 register: start_result 10 retries: 3 11 delay: 10 12 until: start_result is succeeded

試したこと

下記のようにend_playを設定するとloop処理だけではなく、後続のTask 1とTask 2のタスクは実行されず停止してしまいます。

test_loop.yml

1--- 2- name: Chefk status of hoge 3 ansible.builtin.systemd: 4 name: "hoge.service" 5 register: chk_hoge 6- name: Start hoge when not running 7 ansible.builtin.service: 8 name: hoge 9 state: started 10 register: start_result 11 retries: 3 12 delay: 10 13 until: start_result is succeeded 14- name: End play 15 ansible.builtin.meta: end_play 16 when: chk_hoge.status.SubState == "running"

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

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

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

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

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

guest

回答1

0

ベストアンサー

test_loop.ymlで条件にマッチした場合にloop処理だけを停止して、Task 1とTask 2の後続タスクを実行したいです。

条件はどこで設定されますか?
main.ymltest.ymltest_loop.yml?ですか?

whenで実現できるかと思いますがいかがですか?

投稿2023/05/16 04:24

comefigo

総合スコア1045

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

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

khaii21

2023/05/16 10:03 編集

ご確認ありがとうございます。 test_loop.ymlの最後に下記のようにwhenによる条件を入れた場合、test_loop.ymlだけだはなく 後続のtaks1.ymlとtaks2.ymlが実行されずにplayが全て止まってしまいます。 ``` - name: End play  ansible.builtin.meta: end_play  when: chk_hoge.status.SubState == "running" ``` test.yml側で3回のloop設定をしていますので、通常はtest.ymlに条件を設定すると考えていますが test.ymlで条件を設定する方法が分かりません。 条件分はどこに設定されていても問題ありません。 実現したいことですが、条件にマッチした場合test.ymlの3回のloop処理を途中で停止させたいです。
comefigo

2023/05/16 11:03

`ansible.builtin.meta: end_play`だと処理全体を終了するので、後続処理が実行されずに終了します。 なので、これを使わずに whenでやりくりしたほうが良いかと思います。 when: chk_hoge.status.SubState == "running" だったら、自前の例)skip_task変数にTrueを設定し、後続のinclude_tasks: task1.ymlやtask2.ymlのwhen: not skip_task で実行するのはいかがでしょうか?
khaii21

2023/05/16 11:53 編集

勉強不足で申し訳ございません。 test_loop.ymlの最後に下記のように追記するのでしょうか? ``` - name: Set skip_task  vars:   skip_task: "True"  when: chk_hoge.status.SubState == "running" ``` 上記を追記した場合、存在しないモジュールをタスク内に設定しているというエラーになりまして 上手くいきません。 タスク内に設定するskip_task変数をどのymlに渡して条件を設定出来るのでしょうか? 大変お手数ではございますが、記載方法をご教授頂けますと幸いです。
comefigo

2023/05/16 14:30

``` - name: Set skip_task  ansible.builtin.set_fact:   skip_task: {% if chk_hoge.status.SubState == "running" %}True{% else %}False{% endif %} ``` こんな感じで変数を新たに定義することで、後続の処理はskip_taskで処理するか否かを分岐する
khaii21

2023/05/17 01:14 編集

色々とご確認頂きまして大変感謝しております。 ご教授頂きましたタスクをtest_loop.ymlに追加したところ下記のエラーになりましたので前後にダブルクォーテーションを付けて、runningを囲っているダブルクォーテーションをエスケープさせて進みました。 ``` Syntax Error while loading YAML. found character that cannot start any token  skip_task: {% if chk_hoge.status.SubState == "running" %}True{% else %}False{% endif %}        ^ here ``` 下記に修正して実行出来るようになりました。 ``` skip_task: "{% if chk_hoge.status.SubState == \"running\" %}True{% else %}False{% endif %}" ``` 下記にて skip_taskの設定後に追記することで後続の処理を呼び出すことが出来ました。 ``` - name: Set skip_task  ansible.builtin.set_fact:   skip_task: "{% if chk_hoge.status.SubState == \"running\" %}True{% else %}False{% endif %}" - name: Task 1  ansible.builtin.include_tasks: taks1.yml  when: skip_task == True - name: Task 2  ansible.builtin.include_tasks: task2.yml  when: skip_task == True ``` また下記にてmain.ymlにskip_taskの変数による制御出来ることも確認出来ました。ありがとうございます。 ``` - name: Task 1  ansible.builtin.include_tasks: taks1.yml  when: skip_task != True - name: Task 2  ansible.builtin.include_tasks: task2.yml  when: skip_task == True ```
khaii21

2023/05/17 00:48 編集

すみません。現状loopの処理が3回実施されてしまいます。 ここからtest.ymlに設定しているloopに関して"running'の条件にマッチした場合、 どうのようにしてloopを停止させるのかやり方がご存知でしたらご教授頂けないでしょうか。 宜しくお願い致します。
comefigo

2023/05/17 15:51

ダブルクオーテーション抜けてましたですね。失礼しました。 つまり、test_loop.yml内の処理でchk_hoge.status.SubState == "running"になったら、後続のincludeされたタスクとloopもスキップしたいということですか? ちなみに処理を見る限り、とあるサービスが起動するまで待ちたいがためにloopしている認識でいいですか? もし、そうであれば、loopをやめてutilを使った方がよいですね。 以下のようにchk_hoge.status.SubState == "running"になるまで、10秒置きに再実行し、最大3回まで。 - name: Chefk status of hoge ansible.builtin.systemd: name: "hoge.service" register: chk_hoge until: chk_hoge.status.SubState == "running" retries: 3 delay: 10
khaii21

2023/05/18 00:58 編集

とんでもありません。 素人にお付きあい頂きまして大変感謝しております。 ご認識の通り、あるサービスが稼働していない場合に3回起動させるリトライをしたいと考えています。 ご教授頂いたuntilを使い動作検証をしておりました。 想定通りにrunning状態の場合にリトライが終了することが確認出来ました。 大変助かりました。
comefigo

2023/05/18 00:47

いえいえ。 よかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問