寄存器变量在Ansible剧本with_items环寄存器变量在Ansible剧本with_item

2019-05-10 11:20发布

我有与像不同的名字字典

vars:
    images:
      - foo
      - bar

不,我要检出库,然后建造码头工人的图像只有当源发生了变化。 由于越来越UND构建图像的源是除了名的所有项目一样,我创建与任务with_items: images ,并尝试与注册结果:

register: "{{ item }}"

并且还试图

register: "src_{{ item }}"

然后我尝试以下conditon

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: git@foobar.com/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

Answer 1:

那么,怎样才能正确地我保存的变量名的操作基于我遍历列表上的结果吗?

你并不需要。 对于有任务注册的变量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}}"


文章来源: Register variables in with_items loop in Ansible playbook