Ansible:如何根据用户创建任务的执行结果条件创建目录
Ansible:如何根据用户创建任务的执行结果条件创建目录
看起来你已经找到了关键的判断变量,但在条件写法和中间变量的使用上走了弯路,咱们一步步来修正:
首先,你不需要中间那个debug任务来传递变量——直接用第一个任务addinguser的注册结果就可以了,这能简化流程。
先梳理你当前的两个问题:
when: "'false' in ok"的写法完全不对:ok是debug任务的注册结果,里面存的是debug的输出内容,不是你要的布尔值;而且你试图把布尔类型的false当成字符串来判断,不符合Ansible的变量处理逻辑。file模块里有个语法错误:owner: "{[ item.dir_owner ]}"应该改成owner: "{{ item.dir_owner }}",不然会导致变量解析失败。
修正后的完整代码
- name: "Create required users, and user edits for {{ role_name }}" user: name: "{{ item.name }}" comment: "{{ item.comment }}" uid: "{{ item.uid }}" shell: "{{ item.shell }}" group: "{{ item.group }}" with_items: - { name: "spring", comment: "springboot user", uid: "5017", shell: "/bin/bash", group: "spring" } register: addinguser tags: configure.yml - name: "Create required directories for this role" file: path: "{{ item.dir_path }}" state: directory mode: "{{ item.dir_mode }}" owner: "{{ item.dir_owner }}" # 修正了变量语法错误 group: "{{ item.dir_group }}" with_items: - { dir_path: '/home/spring/script', dir_mode: '0700', dir_owner: 'spring', dir_group: 'spring' } # 直接判断第一个用户创建任务是否成功(未失败) when: not addinguser.results.0.failed tags: configure.yml
条件逻辑说明
addinguser.results.0对应with_items里第一个(也是唯一一个)用户任务的执行结果failed是布尔类型的字段,用not取反就表示“任务未失败(即成功)”,你也可以写成addinguser.results.0.failed == false,两者效果完全一致。
扩展:多用户场景的处理
如果以后需要给多个用户创建目录,且只给创建成功的用户创建,可改用循环结合条件的写法:
- name: "Create directories for successfully added users" file: path: "/home/{{ item.item.name }}/script" state: directory mode: '0700' owner: "{{ item.item.name }}" group: "{{ item.item.name }}" loop: "{{ addinguser.results }}" when: not item.failed
这样会遍历所有用户任务的结果,自动为创建成功的用户生成对应目录。
备注:内容来源于stack exchange,提问作者Arch
相关产品推荐
相关产品推荐

