如何从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
相关产品推荐
相关产品推荐

