実現したいこと
commandモジュールにて実行した結果から、任意の文字列(fatal error)を検知したいです。
11行目にてチェックを行いfatal errerとなった場合の処理をしたいです。
該当の変数(hoge_cmd.results)の要素数は今回のケースでは2つですが、1つの場合もあれば10のケースも見込めます。
11行目のselectのチェックを要素数だけloopして実行し、結果を出力したいのですが良いやり方が思いつきません。
リスト型の変数に対して要素数が分かれば実現可能だと考えているのですが、要素数の確認の仕方が分かりません。
下記を利用すれば実現可能だと考えているすが、変数hoge_cmd.resultsの要素数の取得の仕方が分かりません。
when: ( hoge_cmd.results[ {{ item }}]['stdout_lines'] ) | select("regex", "fatal error") | list | length >= 1 with_sequence: start=0 end=要素数
どなたか良い方法をご存知の方がいらっしゃいましたら、ご教授頂けないでしょうか。
宜しくお願い致します。
registerにて実行結果を変数(hoge_cmd)に代入して、selectを使って文字列をカウントします。
変数hoge_cmdはdict型ですが、標準出力結果が含まれているその配下のhoge_cmd.resultsはlist型になります。
msg: "{{ hoge_cmd | ansible.builtin.type_debug }}" "msg": "dict" msg: "{{ hoge_cmd.results | ansible.builtin.type_debug }}" "msg": "list" msg "{{ hoge_cmd.results.stdout_lines | type_debug }}" "msg": "AnsibleUndefined”
hoge_cmd.results抜粋"
1ok: [localhost] => { 2 "msg": [ 3 ・ 4 ・ 5 "item": "hoge001.co.jp", 6 ・ 7 ・ 8 "stdout_lines": [ 9 "OK" 10 ] 11 }, 12 ・ 13 ・ 14 "item": "hoge002.co.jp", 15 ・ 16 ・ 17 "stdout_lines": [ 18 "fatal error"
msg: "{{ hoge_cmd.results[0]['stdout_lines'] }}" ok: [localhost] => { "msg": [ "hoge001.co.jp" "OK" ] msg: "{{ hoge_cmd.results[1]['stdout_lines'] }}" "msg": [ "hoge002.co.jp" "fatal error" ] }
該当のソースコード
playbook.yml
1 tasks: 2 - name: "hogeコマンドの実行" 3 ansible.builtin.command: hoge_command "{{ item }}" 4 with_items: 5 - "{{ server_group }}" 6 register: hoge_cmd 7 changed_when: true 8 - name: "hogeコマンドの実行結果" 9 ansible.builtin.debug: 10 msg: "1台もしくは複数台のホストでコマンドが失敗した可能性があります" 11 when: ( hoge_cmd.results[要素数だけループ]['stdout_lines'] ) | select("regex", "fatal error") | list | length >= 1 12 - name: "hogeコマンドの実行結果" 13 ansible.builtin.debug: 14 msg: "{{ hoge_cmd.results }}" 15 - name: "hogeコマンドの実行結果 標準出力" 16 ansible.builtin.debug: 17 msg: "{{ hoge_cmd.results[0]['stdout_lines'] }}"
試したこと
今回のケースでは予め要素数が2つだとわかっていますので下記でselectによるチェックは出来ましたが、
endにあたる要素数の取得の仕方が分かりません。
when: ( hoge_cmd.results[{{ item }}]['stdout_lines'] ) | select("regex", "fatal error") | list | length >= 1 with_sequence: start=0 end=1
標準出力にあたるstdout_linesを下記のようにした場合、template error となりました。
ansible.builtin.debug: msg: "{{ hoge_cmd.results[{{ item }}]['stdout_lines'] }}" with_sequence: start=0 end=1
エラー内容 "template error while templating string: expected token ':', got '
from_jsonフィルターを試してみたのですが、エラーになりました。
msg: "{{ (hoge_cmd.results | ansible.builtin.from_json).stdout_lines }}"
エラー内容 {"msg": "Unexpected templating type error occurred on ({{ (hoge_cmd.results | ansible.builtin.from_json).stdout_lines }}): the JSON object must be str, bytes or bytearray, not list. the JSON object must be str, bytes or bytearray, not list"}

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/08/17 05:48 編集
2023/08/17 09:27
2023/08/17 12:19 編集
2023/08/17 13:03
2023/08/17 13:54