16

我是 Ansible 的新手,我正在尝试创建几个虚拟环境(每个项目一个,项目列表在变量中定义)。

该任务运行良好,我得到了所有文件夹,但是处理程序不起作用,它没有使用虚拟环境初始化每个文件夹。处理程序中的 ${item} 变量不起作用。使用 with_items 时如何使用处理程序?

  tasks:    
    - name: create virtual env for all projects ${projects}
      file: state=directory path=${virtualenvs_dir}/${item}
      with_items: ${projects}
      notify: deploy virtual env

  handlers:
    - name: deploy virtual env
      command: virtualenv ${virtualenvs_dir}/${item}
4

2 回答 2

23

一旦任何(逐项子)任务请求处理程序(已更改:结果中是),处理程序就会被“标记”以执行。那时处理程序就像下一个常规任务,不知道逐项循环。

一个可能的解决方案不是使用处理程序,而是使用额外任务 + 条件

就像是

- hosts: all 
  gather_facts: false
  tasks:
  - action: shell echo {{item}}
    with_items:
    - 1 
    - 2 
    - 3 
    - 4 
    - 5 
    register: task
  - debug: msg="{{item.item}}"
    with_items: task.results
    when: item.changed == True
于 2013-08-21T22:43:36.493 回答
0

总结前面的讨论和为现代 Ansible 调整...

- hosts: localhost,
  gather_facts: false

  tasks:
  - action: shell echo {{item}} && exit {{item}}
    with_items:
    - 1
    - 2
    - 3
    - 4
    - 5
    register: task
    changed_when: task.rc == 3
    failed_when: no
    notify: update service

  handlers:
  - name: update service
    debug: msg="updated {{item}}"
    with_items: >
      {{
      task.results
      | selectattr('changed')
      | map(attribute='item')
      | list
      }}
于 2020-05-13T03:00:29.807 回答