--- # Задачи для роли devops # Автор: Сергей Антропов # Сайт: https://devops.org.ru # Определение ОС и настройка переменных - name: "Определение ОС и настройка переменных" set_fact: devops_os_family: "{{ ansible_os_family | lower }}" devops_distribution: "{{ ansible_distribution | lower }}" devops_os_name: "{{ ansible_distribution | lower if ansible_distribution is defined else ansible_os_family | lower }}" when: ansible_os_family is defined # Определение групп пользователя в зависимости от ОС - name: "Определение групп пользователя для {{ devops_os_name }}" set_fact: devops_user_groups: "{{ devops_os_config[devops_os_name].groups | default(devops_os_config[devops_os_family].groups | default(['sudo'])) }}" devops_sudo_file: "{{ devops_os_config[devops_os_name].sudo_file | default(devops_os_config[devops_os_family].sudo_file | default('/etc/sudoers.d/devops')) }}" devops_sudo_validate: "{{ devops_os_config[devops_os_name].sudo_validate | default(devops_os_config[devops_os_family].sudo_validate | default('visudo -cf %s')) }}" when: devops_os_name is defined # Проверка существования групп перед созданием пользователя - name: "Проверка существования групп" getent: database: "group" key: "{{ item }}" register: group_check failed_when: false changed_when: false loop: "{{ devops_user_groups }}" when: devops_user_groups is defined # Фильтрация только существующих групп - name: "Фильтрация существующих групп" set_fact: devops_existing_groups: "{{ group_check.results | selectattr('ansible_facts', 'defined') | map(attribute='item') | list }}" when: group_check is defined # Создание отсутствующих групп (если необходимо) - name: "Создание группы docker если она не существует" group: name: "docker" state: "present" become: true when: - "'docker' in devops_user_groups" - "'docker' not in (devops_existing_groups | default([]))" # Генерация безопасного пароля для пользователя devops - name: "Генерация безопасного пароля для пользователя devops" set_fact: devops_user_password: "{{ lookup('password', '/tmp/devops_password length=' + devops_password.length | string + ' chars=ascii_letters,digits,punctuation') }}" no_log: true # Создание пользователя devops - name: "Создание пользователя devops" user: name: "{{ devops_user.name }}" home: "{{ devops_user.home }}" shell: "{{ devops_user.shell }}" groups: "{{ devops_existing_groups | default(devops_user_groups) }}" create_home: "{{ devops_user.create_home }}" state: "{{ devops_user.state }}" password: "{{ devops_user_password | password_hash('sha512') }}" become: true # Создание SSH директории для пользователя devops - name: "Создание SSH директории для пользователя devops" file: path: "{{ devops_ssh.ssh_dir }}" state: directory owner: "{{ devops_user.name }}" group: "{{ devops_user.name }}" mode: "{{ devops_ssh.ssh_dir_mode }}" become: true # Добавление SSH ключа в authorized_keys - name: "Добавление SSH ключа в authorized_keys" authorized_key: user: "{{ devops_user.name }}" key: "{{ devops_ssh_public_key }}" state: present manage_dir: false become: true when: devops_ssh_public_key is defined # Настройка sudo для пользователя devops (без пароля) - name: "Настройка sudo для пользователя devops без пароля" lineinfile: path: "{{ devops_sudo_file }}" line: "{{ devops_user.name }} ALL=(ALL) NOPASSWD: {{ devops_sudo.commands }}" create: true mode: '0440' validate: "{{ devops_sudo_validate }}" become: true # Добавление пользователя в группу docker (если группа существует) - name: "Добавление пользователя в группу docker" user: name: "{{ devops_user.name }}" groups: "{{ devops_user_groups }}" append: true become: true when: - "'docker' in devops_user_groups" - "'docker' in (devops_existing_groups | default([]))" # Логирование успешного создания пользователя - name: "Логирование создания пользователя devops" debug: msg: "Пользователь {{ devops_user.name }} успешно создан с безопасным паролем и SSH доступом на {{ devops_os_name | default('неизвестная') }} ОС"