我正在尝试检查多个用户的目录是否为空。如果这样做,应该为每个用户执行命令。
- 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
这可能吗,如果我在这里做错了吗?
答案 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
是前一个任务的结果(这在“使用注册循环”文档)。