← Назад к вопросам

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

1.3 Junior🔥 141 комментариев
#Ansible и управление конфигурацией

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение: Масштабирование плейбука Ansible для создания множества пользователей

Чтобы эффективно масштабировать плейбук Ansible с одного пользователя на несколько десятков, необходимо перейти от хардкодинга переменных к использованию структурированных данных и циклов. Вот оптимальный подход:

1. Переход на использование переменных в формате YAML/JSON

Вместо того, чтобы править плейбук для каждого пользователя, мы выносим данные о пользователях в отдельный файл переменных. Создадим файл users.yml в директории group_vars/ или vars/:

# users.yml
users_list:
  - username: "ivanov"
    full_name: "Иван Иванов"
    groups: "developers"
    ssh_key: "ssh-rsa AAAAB3NzaC1yc2EAAA..."
    shell: "/bin/bash"
    is_admin: false
    
  - username: "petrov"
    full_name: "Петр Петров"
    groups: "admins,developers"
    ssh_key: "ssh-rsa BBBBB3NzaC1yc2EAAA..."
    shell: "/bin/bash"
    is_admin: true
    
  - username: "sidorova"
    full_name: "Мария Сидорова"
    groups: "managers"
    ssh_key: "ssh-rsa CCCCC3NzaC1yc2EAAA..."
    shell: "/bin/zsh"
    is_admin: false

2. Модификация плейбука для использования цикла loop

Исходный плейбук, работающий с одним пользователем, преобразуется для обработки всего списка:

# main_playbook.yml
1 - name: "Создание системных пользователей"
2   hosts: all
3   become: yes
4   
5   tasks:
6     - name: "Создание групп (если нужно)"
7       ansible.builtin.group:
8         name: "{{ item.groups }}"
9       loop: "{{ users_list }}"
10      when: item.groups is defined
11      loop_control:
12        label: "{{ item.groups }}"
13    
14    - name: "Создание пользователей"
15      ansible.builtin.user:
16        name: "{{ item.username }}"
17        comment: "{{ item.full_name }}"
18        groups: "{{ item.groups }}"
19        shell: "{{ item.shell | default('/bin/bash') }}"
20        create_home: yes
21        home: "/home/{{ item.username }}"
22      loop: "{{ users_list }}"
23      loop_control:
24        label: "{{ item.username }}"
25    
26    - name: "Настройка SSH-ключей"
27      ansible.builtin.authorized_key:
28        user: "{{ item.username }}"
29        key: "{{ item.ssh_key }}"
30      loop: "{{ users_list }}"
31      when: item.ssh_key is defined
32      loop_control:
33        label: "{{ item.username }}"

3. Отдельная обработка администраторов

Для выделения администраторов можно использовать несколько подходов:

Подход A: Фильтрация в цикле с when

# В том же плейбуке добавляем задачу для админов
.

1 - name: "Настройка sudo-прав для администраторов"
2   ansible.builtin.copy:
3     dest: "/etc/sudoers.d/{{ item.username }}"
4     content: |
5       {{ item.username }} ALL=(ALL) NOPASSWD:ALL
6     validate: "/usr/sbin/visudo -cf %s"
7   loop: "{{ users_list }}"
8   when: item.is_admin == true
9   loop_control:
10    label: "{{ item.username }}"

Подход B: Разделение списков на обычных пользователей и админов

# В файле переменных users.yml
regular_users: "{{ users_list | selectattr('is_admin', 'equalto', false) | list }}"
admin_users: "{{ users_list | selectattr('is_admin', 'equalto', true) | list }}"
# В плейбуке используем разные задачи
1 - name: "Создание обычных пользователей"
2   ansible.builtin.user:
3     name: "{{ item.username }}"
4     comment: "{{ item.full_name }}"
5     groups: "{{ item.groups }}"
6     shell: "{{ item.shell }}"
7   loop: "{{ regular_users }}"
8 
9 - name: "Создание администраторов с особыми правами"
10  ansible.builtin.user:
11    name: "{{ item.username }}"
12    comment: "{{ item.full_name }}"
13    groups: "{{ item.groups }},wheel"
14    shell: "{{ item.shell }}"
15  loop: "{{ admin_users }}"
16 
17 - name: "Настройка sudo для админов"
18  ansible.builtin.lineinfile:
19    path: "/etc/sudoers"
20    line: "%wheel ALL=(ALL) NOPASSWD:ALL"
21    validate: "/usr/sbin/visudo -cf %s"

4. Расширенные возможности для управления

Для большего контроля можно добавить:

# Дополнительные задачи в плейбуке
1 - name: "Установка паролей (если нужно)"
2   ansible.builtin.user:
3     name: "{{ item.username }}"
4     password: "{{ item.password | default(omit) }}"
5   loop: "{{ users_list }}"
6   when: item.password is defined
7   no_log: true  # Важно для безопасности!
8 
9 - name: "Настройка umask и других параметров"
10  ansible.builtin.copy:
11    dest: "/home/{{ item.username }}/.profile"
12    content: |
13      umask 022
14      export EDITOR=vim
15    owner: "{{ item.username }}"
16    group: "{{ item.username }}"
17  loop: "{{ users_list }}"

Ключевые преимущества подхода:

  • Масштабируемость: Добавление нового пользователя - просто новая запись в YAML.
  • Идемпотентность: Плейбук можно запускать многократно без побочных эффектов.
  • Безопасность: SSH-ключи и пароли хранятся в зашифрованном виде с использованием Ansible Vault.
  • Поддержка: Четкое разделение данных (переменные) и логики (задачи).
  • Гибкость: Легко добавлять фильтрацию, условия и дополнительные параметры.

Рекомендации по безопасности:

# Шифрование sensitive данных
ansible-vault encrypt users.yml

# Запуск с паролем
ansible-playbook main_playbook.yml --ask-vault-pass

Этот подход позволяет управлять десятками и даже сотнями пользователей через один плейбук с минимальными изменениями при добавлении новых учётных записей.

Есть несколько десятков юзеров, которых нужно завести через ansible. Мы сделали рабочий плейбук для одного юзера, как минимально поменять плейбук так, чтобы он заводил несколько десятков юзеров. Как заводить отдельно админов | PrepBro