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

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

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

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

Q&A

解決済

1回答

502閲覧

Ansible failed_whenによる条件についてtureとfalseの結果が反対の処理となる

khaii21

総合スコア66

Ansible

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

0グッド

0クリップ

投稿2024/03/21 14:25

編集2024/03/21 14:33

実現したいこと

psコマンドを使って特定のプロセス(hoge)の起動状態を確認して、起動していた場合には
エラー終了させたいです。
6行目のfailed_when句でnullの状態でなければエラー終了するように条件を設定していますが
該当するプロセスが起動している場合に処理が止まりません。
反対に該当プロセス(hoge)が起動していない場合、failed_when の判定ではエラー扱いとなり
タスクが停止してしまいます。
該当のplaybookについて何かお気づきの方がいらっしゃいましたらご教授頂けないでしょうか。
宜しくお願い致します。

該当のソースコード

hoge.yml

1 - name: Check yinst set 2 ansible.builtin.shell: 3 executable: /bin/bash 4 cmd: set -o pipefail && ps aux | grep hoge | grep -v grep 5 register: hoge_hoge 6 failed_when: hoge_hoge.stdout_lines | select('regex', null) | list | length != 1
# hogeプロセスが起動していない場合、リターンコードは1となり、変数(hoge_hoge.stdout_lines)の値はnull値"[]"に見えます。 - name: Echo result ansible.builtin.debug: msg: "{{ hoge_hoge }}" ok: [localhost] => { "msg": { "changed": false, "cmd": "set -o pipefail && ps aux | grep hoge | grep -v grep", "delta": "0:00:00.046253", "end": "2024-03-21 22:32:41.905407", "failed": false, "failed_when_result": false, "msg": "non-zero return code", "rc": 1, "start": "2024-03-21 22:32:41.859154", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": [] } }
# 変数(hoge_hoge) はdict型、値は"VARIABLE IS NOT DEFINED!" - name: Echo result ansible.builtin.debug: var: hoge_hoge ok: [localhost] => { "<class 'dict'>": "VARIABLE IS NOT DEFINED!" }
# 変数(hoge_hoge.stdout_lines) はlist型 - name: Echo result ansible.builtin.debug: msg: "{{ hoge_hoge.stderr_lines | type_debug }}" ok: [localhost] => { "msg": "list" }

試したこと

6行目のfailed_when句の設定(nullの場合の条件設定)が問題だと考えています。
nullの代わりに下記にしてみても結果は同じようにプロセス"hoge"が起動している場合は処理が止まらず
起動していない場合は処理が停止します。

failed_when: "'[]' in hoge_hoge.stdout_lines"

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

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

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

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

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

guest

回答1

0

ベストアンサー

failed_when: hoge_hoge.stdout_lines | length >= 1

でいいと思うんだけど。。。

補足しておくと、最初の結果のダンプで

"stdout_lines": []

ってなってるのは、stdout_lines が配列(リスト)で、空であることを示しているので、単純に length を拾えば 0 になる。
プロセスが見つかった場合には ps の処理結果として1行以上の文字列が入るので、1 以上ならプロセスがある(fail させたい)になる

あとどうでもいいけど、pipefail するような内容ではないので、

cmd: ps aux | grep hog[e]

で十分動く。シェル資源の節約になるし読むのも楽。

投稿2024/03/21 15:32

編集2024/03/21 15:40
_raki

総合スコア82

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

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

khaii21

2024/03/22 01:45 編集

ご確認ありがとうございます。 ご教授頂きました failed_when: hoge_hoge.stdout_lines | length >= 1 こちらを試してみたところ、想定通り失敗扱いとなりました。 ありがとうございます。 本件とは直接関係無いのですが、ご存知でしたらご教授頂けないでしょうか。 > pipefail するような内容ではないので、 > cmd: ps aux | grep hog[e] pipefailの設定を省くとansible-lintのチェックで下記のエラーとなります。 risky-shell-pipe: Shells that use pipes should set the pipefail option. > cmd: ps aux | grep hog[e] こちらでもエラーが解消されないのですが、解消方法をご存知でしたらご教授頂けないでしょうか。
_raki

2024/03/23 03:56

lint を気にするならパイプが必要な処理の時は付けたままにするか noqaするかしないとダメですね。 もしくは lint の設定をオフにするか。 目的のプロセスの hoge が何かわからないのでなんでもできるわけじゃないですけど、 ``` ansible.builtin.command: ps h -C hoge register: hoge_hoge ``` みたいにしてshell をやめて command にして直接目的のプロセスだけ探せば結果としては同じことができます。 ただ、この場合は 対象のプロセスが実行プロセスじゃないとダメなので、jenkins 等の jvm 下で動くやつはたぶん検知できません(ps -C java しか引っかからない) 4択(付けたまま、# noqa で行オフ、config でオフ、command 等の別の方法にする)のどれかって感じですね。
khaii21

2024/03/23 04:31

色々とご確認ありがとうございました。 とても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問