web-dev-qa-db-ja.com

Ansible Playbookのwith_itemsループに変数を登録する

次のような異なる名前の辞書があります

vars:
    images:
      - foo
      - bar

いいえリポジトリをチェックアウトし、その後ソースが変更された場合にのみdockerイメージをビルドします。ソースを取得してイメージを構築することは、with_items: imagesでタスクを作成し、結果を登録しようとする名前を除いて、すべてのアイテムで同じであるため:

register: "{{ item }}"

そしてまた試した

register: "src_{{ item }}"

次に、次の条件を試しました

when: "{{ item }}|changed"

そして

when: "{{ src_item }}|changed"

これは常にfatal: [piggy] => |changed expects a dictionaryになります

それで、私が繰り返し処理するリストに基づいて変数名で操作の結果を適切に保存するにはどうすればよいですか?

更新:私はそのような何かを持ちたいと思います:

- hosts: all
  vars:
    images:
      - foo
      - bar
  tasks:
    - name: get src
      git:
        repo: [email protected]/repo.git
        dest: /tmp/repo
      register: "{{ item }}_src"
      with_items: images

    - name: build image
      Shell: "docker build -t repo ."
      args:
        chdir: /tmp/repo
      when: "{{ item }}_src"|changed
      register: "{{ item }}_image"
      with_items: images

    - name: Push image
      Shell: "docker Push repo"
      when: "{{ item }}_image"|changed
      with_items: images
27
soupdiver

それで、私が繰り返し処理するリストに基づいて変数名で操作の結果を適切に保存するにはどうすればよいですか?

する必要はありません。 with_itemsを持つタスク用に登録された変数の形式は異なり、すべてのアイテムの結果が含まれます。

- hosts: localhost
  gather_facts: no
  vars:
    images:
      - foo
      - bar
  tasks:
    - Shell: "echo result-{{item}}"
      register: "r"
      with_items: "{{ images }}"

    - debug: var=r

    - debug: msg="item.item={{item.item}}, item.stdout={{item.stdout}}, item.changed={{item.changed}}"
      with_items: "{{r.results}}"

    - debug: msg="Gets printed only if this item changed - {{item}}"
      when: item.changed == true
      with_items: "{{r.results}}"
45
Kashyap