Есть несколько десятков пользователей, которых нужно завести через Ansible. У нас есть рабочий плейбук для одного пользователя. Как его минимально изменить для создания нескольких десятков пользователей? И как отдельно заводить пользователей с правами администратора?

«Есть несколько десятков пользователей, которых нужно завести через Ansible. У нас есть рабочий плейбук для одного пользователя. Как его минимально изменить для создания нескольких десятков пользователей? И как отдельно заводить пользователей с правами администратора?» — вопрос из категории Ansible, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для массового создания пользователей нужно параметризовать плейбук, используя переменные и циклы. Лучшая практика — вынести список пользователей во внешний файл переменных.

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).