feat: Переименование geop в cod и добавление ARM64 поддержки

- Переименован пресет geop.yml в cod.yml
- Обновлены все группы с geop на cod
- Добавлена поддержка ARM64 для Astra Linux и RedOS
- Создан Dockerfile.arm64 для RedOS с исправлением конфликтов пакетов
- Улучшены разделители в логах Molecule
- Зашифрован файл vault/secrets.yml
- Обновлена роль devops с поддержкой vault
- Добавлены шаблоны для SSH и sudoers конфигураций
This commit is contained in:
Сергей Антропов
2025-10-27 19:43:26 +03:00
parent c66bb35f97
commit 5543ae4d27
25 changed files with 1531 additions and 931 deletions

View File

@@ -1,111 +1,261 @@
---
# Задачи для роли devops
# Основные задачи для роли 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: "🔍 Проверка входных параметров"
tags: [devops, validation]
block:
- name: "Проверка наличия пароля пользователя devops"
fail:
msg: "Пароль пользователя devops не найден в vault/secrets.yml. Установите переменную vault_devops_password."
when:
- vault_file_path is defined
- devops_password == ""
# Определение групп пользователя в зависимости от ОС
- 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: "Проверка наличия SSH публичного ключа"
fail:
msg: "SSH публичный ключ не найден в vault/secrets.yml. Установите переменную vault_devops_ssh_public_key."
when:
- vault_file_path is defined
- devops_ssh_public_key == ""
# Проверка существования групп перед созданием пользователя
- 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: "Логирование начала выполнения роли"
debug:
msg: "Начинаем настройку пользователя {{ devops_user }} на {{ ansible_distribution }} {{ ansible_distribution_version }}"
when: false
# Фильтрация только существующих групп
- name: "Фильтрация существующих групп"
set_fact:
devops_existing_groups: "{{ group_check.results | selectattr('ansible_facts', 'defined') | map(attribute='item') | list }}"
when: group_check is defined
- name: "📦 Установка необходимых пакетов"
tags: [devops, packages]
block:
- name: "Обновление кеша пакетов (Debian/Ubuntu)"
apt:
update_cache: yes
cache_valid_time: 3600
when: devops_os_family == "debian"
# Создание отсутствующих групп (если необходимо)
- name: "Создание группы docker если она не существует"
group:
name: "docker"
state: "present"
become: true
when:
- "'docker' in devops_user_groups"
- "'docker' not in (devops_existing_groups | default([]))"
- name: "Установка необходимых пакетов"
package:
name: "{{ devops_packages_to_install }}"
state: present
become: true
register: package_install_result
# Генерация безопасного пароля для пользователя 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
- name: "Логирование установки пакетов"
debug:
msg: "Установлены пакеты: {{ package_install_result.changed_packages | default('нет изменений') }}"
when: false
# Создание пользователя 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
- name: "👤 Создание группы devops"
tags: [devops, group]
block:
- name: "Проверка существования группы {{ devops_group }}"
group:
name: "{{ devops_group }}"
state: present
gid: "{{ devops_gid }}"
become: true
register: group_create_result
# Создание 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
- name: "Логирование создания группы"
debug:
msg: "Группа {{ devops_group }} создана/существует"
when: false
# Добавление 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
- name: "👥 Создание недостающих групп"
tags: [devops, groups, additional]
block:
- name: "Создание группы wheel (если не существует)"
group:
name: wheel
state: present
become: true
when: "'wheel' in devops_final_additional_groups"
ignore_errors: true
# Настройка 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
- name: "Создание группы systemd-journal (если не существует)"
group:
name: systemd-journal
state: present
become: true
when: "'systemd-journal' in devops_final_additional_groups"
ignore_errors: 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: "Создание группы docker (если не существует)"
group:
name: docker
state: present
become: true
when: "'docker' in devops_final_additional_groups"
ignore_errors: true
# Логирование успешного создания пользователя
- name: "Логирование создания пользователя devops"
debug:
msg: ользователь {{ devops_user.name }} успешно создан с безопасным паролем и SSH доступом на {{ devops_os_name | default('неизвестная') }} ОС"
- name: "👤 Создание пользователя devops"
tags: [devops, user, password]
block:
- name: роверка существования пользователя {{ devops_user }}"
user:
name: "{{ devops_user }}"
group: "{{ devops_group }}"
uid: "{{ devops_uid }}"
home: "{{ devops_home }}"
shell: "{{ devops_shell }}"
state: present
create_home: "{{ devops_create_home }}"
system: "{{ devops_system_user }}"
groups: "{{ devops_final_additional_groups }}"
append: yes
become: true
register: user_create_result
- name: "Установка пароля для пользователя {{ devops_user }}"
user:
name: "{{ devops_user }}"
password: "{{ devops_password | password_hash('sha512') }}"
update_password: always
become: true
no_log: true
register: password_set_result
- name: "Логирование создания пользователя"
debug:
msg: "Пользователь {{ devops_user }} создан/обновлен с паролем"
when: false
- name: "🔑 Настройка SSH ключей"
tags: [devops, ssh, keys]
block:
- name: "Создание директории .ssh для пользователя {{ devops_user }}"
file:
path: "{{ devops_ssh_dir }}"
state: directory
owner: "{{ devops_user }}"
group: "{{ devops_group }}"
mode: "{{ devops_ssh_dir_mode }}"
become: true
- name: "Добавление SSH публичного ключа в authorized_keys"
authorized_key:
user: "{{ devops_user }}"
key: "{{ devops_ssh_public_key }}"
state: present
manage_dir: no
become: true
register: ssh_key_result
when: devops_ssh_public_key != ""
- name: "Установка правильных прав на authorized_keys"
file:
path: "{{ devops_ssh_authorized_keys }}"
owner: "{{ devops_user }}"
group: "{{ devops_group }}"
mode: "{{ devops_ssh_keys_mode }}"
become: true
when: devops_ssh_public_key != ""
- name: "Логирование настройки SSH"
debug:
msg: "SSH ключ для пользователя {{ devops_user }} настроен"
when: false
- name: "🔐 Настройка sudo прав"
tags: [devops, sudo, permissions]
block:
- name: "Создание файла sudoers для пользователя {{ devops_user }}"
template:
src: "{{ devops_sudoers_template }}"
dest: "{{ devops_sudoers_file }}"
owner: root
group: root
mode: '0440'
backup: yes
become: true
register: sudoers_result
- name: "Проверка синтаксиса sudoers файла"
command: "visudo -c -f {{ devops_sudoers_file }}"
become: true
register: sudoers_check
changed_when: false
failed_when: sudoers_check.rc != 0
- name: "Логирование настройки sudo"
debug:
msg: "Sudo права для пользователя {{ devops_user }} настроены"
when: false
- name: "🔧 Настройка дополнительных параметров"
tags: [devops, config, additional]
block:
- name: "Установка umask для пользователя {{ devops_user }}"
lineinfile:
path: "{{ devops_home }}/.bashrc"
line: "umask {{ devops_umask }}"
owner: "{{ devops_user }}"
group: "{{ devops_group }}"
mode: '0644'
create: yes
backup: yes
become: true
- name: "Создание SSH конфигурации для пользователя {{ devops_user }}"
template:
src: "devops_ssh_config.j2"
dest: "{{ devops_ssh_config }}"
owner: "{{ devops_user }}"
group: "{{ devops_group }}"
mode: "0600"
backup: yes
become: true
- name: "Логирование дополнительных настроек"
debug:
msg: "Дополнительные настройки для пользователя {{ devops_user }} применены"
when: false
- name: "✅ Проверка настройки пользователя devops"
when: devops_verify_user
tags: [devops, verification, check]
block:
- name: "Проверка существования пользователя {{ devops_user }}"
command: "id {{ devops_user }}"
register: user_check
changed_when: false
failed_when: user_check.rc != 0
- name: "Проверка SSH ключа пользователя {{ devops_user }}"
stat:
path: "{{ devops_ssh_authorized_keys }}"
register: ssh_key_check
- name: "Проверка sudo прав пользователя {{ devops_user }}"
command: "sudo -l -U {{ devops_user }}"
become: true
register: sudo_check
changed_when: false
failed_when: sudo_check.rc != 0
- name: "Логирование результатов проверки"
debug:
msg: |
Результаты проверки пользователя {{ devops_user }}:
- Пользователь существует: {{ user_check.rc == 0 }}
- SSH ключ настроен: {{ ssh_key_check.stat.exists }}
- Sudo права настроены: {{ sudo_check.rc == 0 }}
- name: "📝 Уведомления о завершении"
tags: [devops, notification, success]
block:
- name: "Уведомление об успешном завершении"
debug:
msg: "✅ Пользователь {{ devops_user }} успешно настроен на {{ ansible_hostname }}"
when: devops_notify_on_success
- name: "Уведомление о настройке SSH"
debug:
msg: "🔑 SSH ключ для пользователя {{ devops_user }} настроен"
when: devops_notify_on_success and devops_verify_ssh
- name: "Уведомление о настройке sudo"
debug:
msg: "🔐 Sudo права для пользователя {{ devops_user }} настроены"
when: devops_notify_on_success and devops_verify_sudo