ansible:如何在notify中使用with_items中的变量$ {item}?

时间:2013-08-21 21:59:11

标签: ansible

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

任务运行良好,我获得了所有文件夹,但是处理程序不起作用,它不会使用虚拟环境初始化每个文件夹。处理程序中的$ {item} varialbe不起作用。 当我使用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}

2 个答案:

答案 0 :(得分:22)

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

可能的解决方案不是使用处理程序,而是使用extratask + conditional

这样的东西
- 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

答案 1 :(得分: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
      }}