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

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

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

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

Q&A

解決済

2回答

225閲覧

Ansible untilによるリトライが実行されない

khaii21

総合スコア66

Ansible

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

0グッド

0クリップ

投稿2024/03/23 15:06

編集2024/03/23 15:30

実現したいこと

プロセス(hoge)が起動するまでチェクを行い、確認が取れてから次のタスクに進ませたいです。
確認には下記のコマンドで実施しています。

ps aux | grep hoge | grep -v grep

該当プロセス(hoge)は起動までに数秒かかるため、リトライは待ち時間1秒で10回に設定しています。
起動していない場合にはコマンド実行結果はnullになる認識です。
nullの場合は、リトライを実施して起動するまでチェックを繰り返しさせたいです。
しかし現状は起動していないにもかかわらず、一度もリトライをしないで次のタスクに
進んでしまいます。

7行目のuntilの設定条件に誤りがあると思いますが、色々変更しても改善出来ません。
何かお気づきのことがありましたらご教授頂けないでしょうか。

宜しくお願い致します。

発生している問題・エラーメッセージ

「import check_ps.yml」のタスクでリトライがされず、次のタスク「Echo result check ps」の
failed_when句でエラーとなります。

fatal: [localhost]: FAILED! => { "ps_check.stdout_lines": [], "failed_when_result": true }

該当のソースコード

playbook.yml

1- name: Set ps of value 2 ansible.builtin.set_fact: 3 ps_check: 4 5- name: import check_ps.yml 6 ansible.builtin.import_tasks: check_ps.yml 7 until: ps_check.stdout_lines != null 8 retries: 10 9 delay: 1 10 11- name: Echo result check ps 12 ansible.builtin.debug: 13 var: ps_check.stdout_lines 14 failed_when: ps_check.stdout_lines | length < 1

check_ps.yml

1- name: Check prosess 2 ansible.builtin.shell: ps aux | grep hoge | grep -v grep 3 register: ps_check 4 ignore_errors: true

変数(ps_check)の状況

# msg: "{{ ps_check.stdout_lines }}"の結果 ok: [localhost] => { "msg": [] } # msg: "{{ ps_check.stdout_lines | type_debug }}"の結果 ok: [localhost] => { "msg": "list" }

試したこと

下記の条件に変更してもリトライされず改善しませんでした。

until: ps_check.stdout_lines | length >= 1

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

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

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

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

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

guest

回答2

0

なんのプロセスを待ちたいのかわからないけど、プロセスが空転してたら意味がないと思うので、この手の処理はやめたほうがいいんじゃないかって。。。

プロセスを起動してそのプロセスが居ることを確認するのではなくて、プロセスが起動したことで可能になるサービスをチェックするのが本来の目的なのではないかと。

であれば、

実行するコマンドがステータスを吐いてくれる場合
https://stackoverflow.com/questions/47443265/how-to-use-ansible-wait-for-to-check-a-command-status-with-multiple-lines

service や systemctl でステータスが取れる場合
https://stackoverflow.com/questions/63781603/how-can-i-get-ansible-to-wait-until-a-service-is-active

fact からステータスが取れる場合
https://stackoverflow.com/questions/64793708/ansible-how-to-check-and-wait-for-docker-to-be-up-and-running-in-multiple-hosts

などがあるのと、プロセスが起動したことで特定のポートが開いたかどうかで判定できるならビルトインに wait_for があります。
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/wait_for_module.html

起動に時間がかかる、起動した後もしばらく動いている(もしくは止めるまで止まらないサービスである)なら、 ps の処理結果で生存判定は出来ないことが多い(ps aux でプロセス名しか見ないならゾンビプロセスも生きてると判定してしまう)ので、本当に必要なことを確認したほうがいいと思います。

ちなみに、前回はプロセスの有無で処理を止めるかどうかの判定をしていただけなので指摘しなかったんですけど、今回と合わせて考えたら前回の判定部分も見直しを検討したほうがいいかもしれません。

投稿2024/03/23 23:14

_raki

総合スコア82

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

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

khaii21

2024/03/24 11:28

ご確認ありがとうございます。 色々とご教授ありがとうございました。 wait_forモジュールを使うことで目的が達成出来そうです。 動作確認を致します。
guest

0

ベストアンサー

untilを含めずにps aux | grep hoge | grep -v grepの実行結果(変数ps_check)を確認しましたか?
おそらくnullではなく、ps_check.stdout_lines.length == 0 になるかと思います。
つまり、psの結果に該当のプロセス(hoge)が含まれておらず、結果が空(nullではない)になります。

投稿2024/03/23 17:22

comefigo

総合スコア1045

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

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

khaii21

2024/03/24 03:48

ご確認ありがとうございます。 ご教授頂きました変数を使って下記のようにuntil句に設定しましたが、 ``` until: ps_check.stdout_lines.length != 0 ``` 下記のエラーとなりました。 ``` The error was: 'list object' has no attribute 'length'. ``` 何かお気づきのことがありましたらご指摘頂けますと幸いです。
comefigo

2024/03/24 07:59

> untilを含めずにps aux | grep hoge | grep -v grepの実行結果(変数ps_check)を確認しましたか? こちらの結果は何になりましたでしょうか?
khaii21

2024/03/24 09:55 編集

対象プロセスが起動していない状態の変数を確認致しました。 お手漉きの時にご確認頂けますと幸いです。 ``` # var: ps_checkの結果 "<class 'dict'>": "VARIABLE IS NOT DEFINED!" # msg: {{ ps_check | type_debug }}の結果 "msg": "dict" # var: ps_check.stdout_linesの結果 "msg": "Hello world!" # msg: {{ ps_check.stdout_lines | type_debug }}の結果 "msg": "list" # var: "{{ ps_check.length }}"の結果 The error was: 'dict object' has no attribute 'length'.のエラー # msg: "{{ ps_check.length | type_debug }}"の結果 "msg": "AnsibleUndefined" # var: "{{ ps_check.stdout_lines.length }}"の結果 The error was: 'list object' has no attribute 'length'.のエラー # msg: "{{ ps_check.stdout_lines.length | type_debug }}"の結果 "msg": "AnsibleUndefined" ```
comefigo

2024/03/24 10:03 編集

- name: Check prosess  ansible.builtin.shell: ps aux | grep hoge | grep -v grep  register: ps_check のみを実行し、その実行結果でしょうか?
khaii21

2024/03/25 08:52 編集

続けてのご確認ありがとうございます。 ご指示頂いた結果です。 宜しくお願い致します。 ``` # var: ps_checkの実行結果 ok: [localhost] => { "ps_check": { "changed": false, "cmd": "ps aux | grep hoge | grep -v grep", "delta": "0:00:00.043408", "end": "2024-03-25 00:10:09.262471", "failed": true, "msg": "non-zero return code", "rc": 1, "start": "2024-03-25 00:10:09.219063", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": [] } } ```
comefigo

2024/03/24 15:34

- name: Check prosess  ansible.builtin.shell: ps aux | grep hoge | grep -v grep  register: ps_check  ignore_errors: true  until: ps_check.stdout_lines.length > 0  retries: 10  delay: 1 で期待した動作になると思います。
khaii21

2024/03/25 10:15

ご丁寧にタスクについて記載頂きありがとうございます。 こちら実行したところ下記のエラーが出ておりまして、 リトライはされず、先のタスクに進んでしまいます。 色々と確認しているのですが解消しない状況です。 何かお気づきのことがありますでしょうか。 ``` fatal: [localhost]: FAILED! => {"msg": "The conditional check 'ps_check.stdout_lines.length > 0' failed. The error was: error while evaluating conditional (ps_check.stdout_lines.length > 0): 'list object' has no attribute 'length'. 'list object' has no attribute 'length'"} ```
comefigo

2024/03/25 12:19

間違えました。 長さを得るにはフィルタ( | length )を使います。 - name: Check prosess  ansible.builtin.shell: ps aux | grep hoge | grep -v grep  register: ps_check  ignore_errors: true  until: ps_check.stdout_lines | length > 0  retries: 10  delay: 1
khaii21

2024/03/26 00:49 編集

色々とご確認、ご丁寧にコードも教えて頂きましてありがとうございます。 今回ご教授頂いたロジックは他にも実施したいタスクにも有効活用して出来ると考えていまして、どうしても実現させたいタスクでした。 数日間お付き合い頂きまして本当にありがとうございました。
comefigo

2024/03/26 06:55

解決おめでとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問