You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible:如何根据用户创建任务的执行结果条件创建目录

Ansible:如何根据用户创建任务的执行结果条件创建目录

看起来你已经找到了关键的判断变量,但在条件写法和中间变量的使用上走了弯路,咱们一步步来修正:

首先,你不需要中间那个debug任务来传递变量——直接用第一个任务addinguser的注册结果就可以了,这能简化流程。

先梳理你当前的两个问题:

  1. when: "'false' in ok"的写法完全不对:ok是debug任务的注册结果,里面存的是debug的输出内容,不是你要的布尔值;而且你试图把布尔类型的false当成字符串来判断,不符合Ansible的变量处理逻辑。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 11:28:07