可变时Ansible

时间:2019-04-10 09:01:56

标签: ansible

我正在尝试检查多个用户的目录是否为空。如果这样做,应该为每个用户执行命令。

- name: Check if vim plugins has been initialised               
  find: paths="/home/{{ item.name }}/.vim/bundle/"              
  register: "{{ item.name }}_vim_plugin_init_state"             
  with_items: "{{ users }}"                                     
  tags: debug                                                   

- name: Install vim plugins                                     
  command: vim -E -s -c "source ~/.vimrc" -c PluginInstall -c qa
  become_user: "{{ item.name }}"                                
  with_items: "{{ users }}"                                     
  when: "{{ item.name }}"_vim_plugin_init_state.matched|int == 0
  tags: debug                                                   

这可能吗,如果我在这里做错了吗?

1 个答案:

答案 0 :(得分:1)

with语句的参数隐含在Jinja模板上下文中。换句话说,如果您写:

when: something

您实际上正在得到:

when: "{{ something }}"

并且由于您从不将{{...}}标记嵌套在现有的Jinja表达式内,这意味着您通常永远不会在{{...}}表达式内使用when。但是,由于要为用户中的每个项目创建唯一的变量,因此需要在安装任务中计算变量名称,这会使事情复杂化。

幸运的是,您误用了register命令,该命令在循环中的行为不同于在单个任务上的行为。有关详细信息,请阅读“ Using register in a loop”。

如果使用得当,事情会变得容易得多:

- name: Check if vim plugins has been initialised
  find: paths="/home/{{ item.name }}/.vim/bundle/"
  register: "vim_plugin_init_state"
  loop: "{{ users }}"
  tags: debug

- name: Install vim plugins
  command: vim -E -s -c "source ~/.vimrc" -c PluginInstall -c qa
  become_user: "{{ item.item.name }}"
  when: "item.matched|int > 0"
  loop: "{{ vim_plugin_init_state.results }}"
  loop_control:
    label: "{{ item.item.name }}"
  tags: debug

请注意,我在此处做了一些其他更改:

  • 我使用的是loop而不是with_items,因为这是目前推荐的语法。

  • 我正在使用loop_control设置一个明确的标签,该标签会在任务运行时减少所有输出。

  • 我使用item.item.name来指代用户,因为在第二个任务中,每个item是前一个任务的结果(这在“使用注册循环”文档)。