Ответ
Для массового создания пользователей нужно параметризовать плейбук, используя переменные и циклы. Лучшая практика — вынести список пользователей во внешний файл переменных.
1. Основной подход с циклом loop и условием when:
- hosts: all
vars:
user_list:
- username: alice
groups: developers
admin: false
- username: bob
groups: sudo,developers
admin: true
- username: charlie
groups: sudo
admin: true
tasks:
- name: Create regular users
ansible.builtin.user:
name: "{{ item.username }}"
groups: "{{ item.groups }}"
state: present
shell: /bin/bash
loop: "{{ user_list }}"
when: not item.admin
- name: Create admin users (add to sudo group)
ansible.builtin.user:
name: "{{ item.username }}"
groups: "{{ item.groups }}"
state: present
shell: /bin/bash
loop: "{{ user_list }}"
when: item.admin
2. Более масштабируемый подход с внешним файлом переменных:
Создайте файл group_vars/all/users.yml:
user_list:
- { username: 'alice', admin: false }
- { username: 'bob', admin: true }
# ... десятки других пользователей
А в плейбуке используйте include_vars или просто ссылайтесь на переменную, если она определена в инвентаре.
3. Использование with_items и отдельной задачи для админов (альтернативный стиль):
- name: Add multiple users
ansible.builtin.user:
name: "{{ item }}"
state: present
with_items: "{{ users }}"
- name: Add admin users to sudoers
ansible.builtin.user:
name: "{{ item }}"
groups: sudo
append: yes
with_items: "{{ admin_users }}"
Ключевые моменты:
loop(илиwith_items) позволяет итерироваться по списку.whenусловно выполняет задачу, что удобно для разделения логики создания обычных пользователей и админов.- Для управления большими списками данные лучше хранить отдельно в YAML/JSON файлах или динамически генерировать из внешнего источника (например, LDAP).