web-dev-qa-db-ja.com

with_itemsとregisterを使用した反復

私は数時間苦労してきた問題の助けを探しています。リストを反復処理し、コマンドを実行し、各コマンドの出力を登録してから、一意の各レジスタ{{someregister}}。stdoutをデバッグして反復したい

たとえば、次のコードは"msg": "1"および"msg": "2"を吐き出します。

---

- hosts: localhost
  gather_facts: false

  vars:
    numbers:
      - name: "first"
        int: "1"
      - name: "second"
        int: "2"

  tasks:

    - name: Register output
      command: "/bin/echo {{ item.int }}"
      register: result
      with_items: "{{ numbers }}"

    - debug: msg={{ item.stdout }}
      with_items: "{{ result.results }}"

ただし、with_listを使用して名前が付けられたレジスタ変数でコマンドの出力をキャプチャしようとすると、リストまたはリスト内の要素にアクセスできません。たとえば、コードを次のようにわずかに変更します。

---

- hosts: localhost
  gather_facts: false

  vars:
    numbers:
      - name: "first"
        int: "1"
      - name: "second"
        int: "2"

  tasks:

    - name: Register output
      command: "/bin/echo {{ item.int }}"
      register: "{{ item.name }}"
      with_items: "{{ numbers }}"

    - debug: var={{ item.name.stdout }}
      with_items: "{{ numbers }}"

私に与えます:

TASK [debug] 

> ******************************************************************* fatal: [localhost]: FAILED! => {"failed": true, "msg": "'unicode
> object' has no attribute 'stdout'"}

レジスタにコマンドの出力を動的に指定することはできませんか?それは後でプレイで呼び出すことができますか?コマンドの各反復とその後続のregisterが一意にアクセスされるようにしたい「first」および「second」と呼ばれる変数が登録されていることを期待しますが、ありません。

デバッグスタンザからwith_itemsを削除し、first.stdoutを使用してvarまたはメッセージを明示的に定義すると、「undefined」が返されます。

AnsibleバージョンはCentos 7_2の2.0.2.0です。

前もって感謝します。

13
Rowley

わかりましたので、ここで何が起こっているのか、result.resultsの要素にアクセスする方法を理解するのに役立つ stackoverflowの投稿 を見つけました。

私が最終的に得たコードは次のとおりです。

---

- hosts: localhost
  gather_facts: false

  vars:
    numbers:
      - name: "first"
        int: "1"
      - name: "second"
        int: "2"

  tasks:

    - name: Register output
      command: "/bin/echo {{ item.int }}"
      register: echo_out
      with_items: "{{ numbers }}"

    - debug: msg="item.item={{item.item.name}}, item.stdout={{item.stdout}}"
      with_items: "{{ echo_out.results }}"

それは私に望ましい結果を与えました:

"msg": "item.item=first, item.stdout=1"
"msg": "item.item=second, item.stdout=2"
19
Rowley

私は質問を正しく理解しているかどうかはわかりませんが、おそらくこれは助けになるでしょう:

    - debug: msg="{{ item.stdout }}"
      with_items: echo_out.results

Ansibleは、それぞれitemmsgの両方を出力することに注意してください。したがって、"msg": "2"

3
Amit