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

如何从Ansible的user_config变量中提取已创建用户名列表?

问题背景

通过Ansible批量创建用户后,已将任务结果注册到user_config变量中,需要提取其中的已创建用户名列表,用于后续任务的loop参数。


相关文件与变量内容

group_vars/users.yml

add_users: "{{ users_all }}"
users_all:
  - name: bob
    create_home: yes
    shell: /bin/bash
    password: "{{ bob_user_pass | password_hash('sha512', bob_user_pass_salt) }}"
    state: present
  - name: jane
    create_home: yes
    shell: "/bin/bash"
    password: "{{ jane_user_pass | password_hash('sha512', jane_user_pass_salt) }}"
    state: present

play_create_users.yml

- name: Create Users
  ansible.builtin.user:
    name: "{{ item.name }}"
    create_home: "{{ item.create_home }}"
    shell: "{{ item.shell }}"
    password: "{{ item.password }}"
    state: "{{ item.state }}"
  loop: "{{ add_users }}"
  register: user_config 

注册的user_config变量(修正格式后)

{
  "user_config": {
    "msg": "All items completed",
    "results": [ 
      {
        "name": "bob",
        "state": "present",
        "move_home": false,
        "password": "NOT_LOGGING_PASSWORD",
        "changed": false,
        "home": "/home/bob",
        "shell": "/bin/bash",
        "failed": false,
        "item": {
          "name": "bob",
          "create_home": true,
          "shell": "/bin/bash",
          "password": "$6$xxxxxxxxxxxxxxx",
          "state": "present"
        },
        "ansible_loop_var": "item"
      },
      {
        "name": "jane",
        "state": "present",
        "move_home": false,
        "password": "NOT_LOGGING_PASSWORD",
        "changed": false,
        "home": "/home/jane",
        "shell": "/bin/bash",
        "failed": false,
        "item": {
          "name": "jane",
          "create_home": true,
          "shell": "/bin/bash",
          "password": "$6$xxxxxxxxxx",
          "state": "present"
        },
        "ansible_loop_var": "item"
      }
    ],
    "skipped": false,
    "changed": false
  }
}

单个用户名获取示例

- debug:
    var: user_config['results'][0]['name']

返回结果:

{
  "user_config['results'][0]['name']": "bob"
}

解决方案

以下两种方法均可提取可用于后续loop的用户名列表:

方法1:使用map过滤器快速提取

通过map过滤器直接从user_config.results中提取name字段,再转为列表:

- name: 提取已创建用户名列表
  set_fact:
    created_users: "{{ user_config.results | map(attribute='name') | list }}"

- name: 验证用户名列表(可选)
  debug:
    var: created_users

执行后created_users变量会得到["bob", "jane"],可直接用于后续任务的loop: "{{ created_users }}"。

方法2:遍历结果收集(支持额外过滤)

若需要过滤特定条件的用户(比如仅收集创建成功且有变更的用户),可通过循环收集:

- name: 收集已创建用户名
  set_fact:
    created_users: "{{ created_users | default([]) + [item.name] }}"
  loop: "{{ user_config.results }}"
  when: item.failed == false  # 可选:过滤创建失败的用户

- name: 验证用户名列表
  debug:
    var: created_users

后续任务使用示例

拿到列表后即可直接在后续任务中使用:

- name: 为每个用户创建测试文件
  ansible.builtin.file:
    path: "/home/{{ item }}/test.txt"
    state: touch
    owner: "{{ item }}"
  loop: "{{ created_users }}"

内容的提问来源于stack exchange,提问作者synaptik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:03:33