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

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

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

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

Q&A

解決済

2回答

3751閲覧

loop結果をdebugで出力する時、出力内容を制御したい

Ansible

総合スコア1

Ansible

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

0グッド

0クリップ

投稿2020/08/05 08:37

前提・実現したいこと

ansibleのloopのdebug表示について
■下記のdebugのように表示させる出力を絞って表示させる術などあればご教授いただけると幸いです。。。
狙い:
下記のtaskでは変数の「IPlist」の中身の分だけloopして
その結果をdebugで表示内容を絞って表示することが狙いでした。

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

The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'cmd'

該当のソースコード

--IPlist--(変数の中身) 11.22.33.44 55.66.77.88 ---------- cat 11.22.33.44.txt IPアドレス: 11.22.33.44 cat 55.66.77.88.txt IPアドレス: 55.66.77.88 下記がtasks --------------------------------------------------- - name: Execution ----{{ item }}---- command: "cat {{ item }}.txt" changed_when: false register: result1 loop: "{{ IPlist }}" - name: debug result debug: msg: - "実行結果" - "実行コマンド: {{ result1.cmd }}" - "実行時間: {{ result1.start }}" - "実行結果:" - "{{ result1.stdout }}" when: result1 is succeeded ---------------------------------------------------

試したこと

  • debug: msg={{ result1 }}で確認すると表示はされるオブジェクトもある。。。

別の方法としてフィルターを用いましたが
debug:
msg: |
{% for r in result1.results %}
{{ r.stdout_lines | to_nice_json }}
{% endfor %}
when: result1 is succeeded
動きはしますが日本語部分が文字化けして困りました。。。
---表示例----
"IP\u30a2\u30c9\u30ec\u30b9 :   13.231.87.234",
またansiblejp内でloopで検索したところ「loop_control」で出力を制御できるということで
試みましたがいまいち使い方が分からなかったです。。。
(参考:https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html#limiting-loop-output-with-label)

  • debug: var=result1←これじゃない感
    loop: "{{ result1 }}"
    loop_control:
    label: "{{ item.cmd }}"

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

自己解決

ループさせたいtaskをinclude_tasksにぶちこんでそれをloopで回せば動くのでは?と思い

  • include_tasks: client.yml
    loop: "{{ IPlist }}"

---client.yml---

  • name: Execution ----{{ item }}----
    command: "cat {{ item }}.txt"
    changed_when: false
    register: result1
    loop: "{{ IPlist }}"
  • name: debug result
    debug:
    msg:
    - "実行結果"
    - "実行コマンド: {{ result1.cmd }}"
    - "実行時間: {{ result1.start }}"
    - "実行結果:"
    - "{{ result1.stdout }}"
    when: result1 is succeeded

---client.yml---

これで一応loop分debugが表示されるようになりました。

別の解決方法としてloopする数が決まっていれば
例えばloop回数=3
result1.results.1.cmd(1つ目)
result1.results.2.cmd(2つ目)
result1.results.3.cmd(3つ目)
って感じでも動くことを確認しました。
(でもこれだとloopの数が100個あったら100個書かないとだからもっと他に汎用性のある書き方があるはず。。。)

投稿2020/08/06 11:47

編集2020/08/06 11:51
Ansible

総合スコア1

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

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

0

commandでloopしているのでresult1の戻り値は result1.resultsに値が入るかと思います。
まずそちらをご確認ください。

投稿2020/08/05 13:50

comefigo

総合スコア1045

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

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

Ansible

2020/08/06 10:15

ご回答ありがとうございます! result1とresult1.resultsの出力結果が一部ほぼ一緒だったもので違いが分からなかったですがloopでは戻り値が「result1.results」なのですね。 「戻り値がresult1.results」という前提で改めて調べてみます!
comefigo

2020/08/06 15:30

そうですね。 loop系の時はresultsに戻り値が入ります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問