4. 使用循环批量创建用户

任务目标

编写一个Ansible Playbook,从一个用户列表中循环读取用户名、密码和授权组,批量创建系统用户。每个用户需设置密码,并确保其加入指定的附加组(如wheel或sudo组)以获得提权能力。

前置条件

  • 控制节点已安装Ansible 2.9+
  • 目标主机为Linux系统,且控制节点可通过SSH免密登录
  • 目标主机上python或python3可用(Ansible依赖)

Playbook实现

创建文件create_users.yml,内容如下:

---
- name: 批量创建用户并设置密码与授权
  hosts: all
  become: yes
  vars:
    users:
      - name: alice
        password: "{{ 'alice123' | password_hash('sha512') }}"
        groups: wheel
      - name: bob
        password: "{{ 'bob456' | password_hash('sha512') }}"
        groups: wheel
      - name: charlie
        password: "{{ 'charlie789' | password_hash('sha512') }}"
        groups: ""

  tasks:
    - name: 循环创建用户
      ansible.builtin.user:
        name: "{{ item.name }}"
        password: "{{ item.password }}"
        groups: "{{ item.groups }}"
        append: yes
        state: present
        shell: /bin/bash
        create_home: yes
      loop: "{{ users }}"
      loop_control:
        label: "{{ item.name }}"

运行方式

ansible-playbook -i 你的主机清单 create_users.yml

若没有现成清单,可直接对本机执行验证:

ansible-playbook -i localhost, -c local create_users.yml

验证方法

Playbook执行完毕后,在目标主机上运行以下命令确认结果:

# 检查用户是否存在
id alice
id bob
id charlie

# 验证密码是否生效(需输入密码切换)
su - alice -c "whoami"

# 验证授权组
groups alice
groups bob

通过条件:

  • 三个用户均存在,且home目录已创建
  • alice和bob属于wheel组(或你的sudo组),charlie无附加组
  • 使用设置的密码可以成功切换到对应用户
  • Playbook执行结果中无failed任务

关键说明

  • password_hash('sha512')过滤器在控制节点将明文密码转为加密哈希,避免明文传输
  • append: yes确保用户原有附加组不被覆盖,仅追加新组
  • 若目标主机的sudo组不是wheel(如Debian/Ubuntu为sudo),请修改groups值
  • 生产环境中建议使用Ansible Vault加密密码变量,而非明文写入Playbook