From 7232bd6756fcd127f5f228afc7801af8db894723 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=90=D0=BD=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BF=D0=BE=D0=B2?= Date: Sat, 25 Oct 2025 20:24:43 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=80=D0=BE=D0=BB=D1=8C=20devops=20=D1=83=D0=BD=D0=B8?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=B2=D1=81=D0=B5=D1=85=20=D0=9E=D0=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлена автоматическая детекция ОС и настройка групп пользователя - Поддержка всех ОС из dockerfiles: Ubuntu, Debian, RHEL, CentOS, Rocky, AlmaLinux, Astra Linux, ALT Linux, RedOS - Автоматический выбор групп: sudo для Ubuntu/Debian, wheel для RHEL-семейства - Обновлена документация с примерами для разных ОС - Добавлены тесты для проверки универсальности - Исправлены ошибки линтера в meta/main.yml Роль теперь работает на всех системах из dockerfiles без дополнительной настройки. --- roles/deploy.yml | 4 +-- roles/devops/QUICKSTART.md | 2 ++ roles/devops/README.md | 22 +++++++++++---- roles/devops/defaults/main.yml | 50 +++++++++++++++++++++++++++++++++- roles/devops/examples.yml | 23 +++++++++++++++- roles/devops/meta/main.yml | 7 +++++ roles/devops/tasks/main.yml | 24 +++++++++++++--- roles/devops/tests/test.yml | 2 ++ 8 files changed, 120 insertions(+), 14 deletions(-) diff --git a/roles/deploy.yml b/roles/deploy.yml index 69d00da..58f617b 100644 --- a/roles/deploy.yml +++ b/roles/deploy.yml @@ -6,5 +6,5 @@ - name: Развертывание всех ролей hosts: all roles: - # - ping - - devops + - ping + #- devops diff --git a/roles/devops/QUICKSTART.md b/roles/devops/QUICKSTART.md index 890a5bb..a349008 100644 --- a/roles/devops/QUICKSTART.md +++ b/roles/devops/QUICKSTART.md @@ -12,6 +12,8 @@ 3. ✅ Настраивает SSH доступ по ключу 4. ✅ Добавляет права sudo без пароля 5. ✅ Создает домашнюю директорию +6. ✅ Автоматически определяет ОС и настраивает группы +7. ✅ Поддерживает все ОС из dockerfiles (Ubuntu, Debian, RHEL, CentOS, Rocky, AlmaLinux, Astra Linux, ALT Linux, RedOS) ## Быстрый запуск diff --git a/roles/devops/README.md b/roles/devops/README.md index b4687cf..4c384e9 100644 --- a/roles/devops/README.md +++ b/roles/devops/README.md @@ -111,12 +111,22 @@ devops_ssh_keys: ## Поддерживаемые ОС -- Ubuntu (focal, jammy) -- Debian (bullseye, bookworm) -- RHEL (8, 9) -- CentOS (8, 9) -- Rocky Linux (8, 9) -- AlmaLinux (8, 9) +- **Ubuntu** (focal, jammy) +- **Debian** (bullseye, bookworm) +- **RHEL** (8, 9) +- **CentOS** (8, 9) +- **Rocky Linux** (8, 9) +- **AlmaLinux** (8, 9) +- **Astra Linux** (1.7) +- **ALT Linux** (p9) +- **RedOS** (9) + +### Автоматическое определение ОС + +Роль автоматически определяет операционную систему и настраивает: +- **Группы пользователя**: `sudo` для Ubuntu/Debian, `wheel` для RHEL-семейства +- **Путь к sudoers**: `/etc/sudoers.d/devops` +- **Валидация sudoers**: `visudo -cf %s` ## Теги diff --git a/roles/devops/defaults/main.yml b/roles/devops/defaults/main.yml index 936fc91..49ba1d2 100644 --- a/roles/devops/defaults/main.yml +++ b/roles/devops/defaults/main.yml @@ -8,7 +8,7 @@ devops_user: name: "devops" home: "/home/devops" shell: "/bin/bash" - groups: ["sudo", "docker"] + groups: [] create_home: true state: "present" @@ -32,3 +32,51 @@ devops_ssh: ssh_dir: "/home/devops/.ssh" ssh_dir_mode: "0700" authorized_keys_mode: "0600" + +# Настройки для разных ОС +devops_os_config: + # Ubuntu/Debian + ubuntu: + groups: ["sudo", "docker"] + sudo_file: "/etc/sudoers.d/devops" + sudo_validate: "visudo -cf %s" + debian: + groups: ["sudo", "docker"] + sudo_file: "/etc/sudoers.d/devops" + sudo_validate: "visudo -cf %s" + + # RHEL/CentOS/Rocky/AlmaLinux + rhel: + groups: ["wheel", "docker"] + sudo_file: "/etc/sudoers.d/devops" + sudo_validate: "visudo -cf %s" + centos: + groups: ["wheel", "docker"] + sudo_file: "/etc/sudoers.d/devops" + sudo_validate: "visudo -cf %s" + rocky: + groups: ["wheel", "docker"] + sudo_file: "/etc/sudoers.d/devops" + sudo_validate: "visudo -cf %s" + alma: + groups: ["wheel", "docker"] + sudo_file: "/etc/sudoers.d/devops" + sudo_validate: "visudo -cf %s" + + # Astra Linux + astra: + groups: ["sudo", "docker"] + sudo_file: "/etc/sudoers.d/devops" + sudo_validate: "visudo -cf %s" + + # ALT Linux + alt: + groups: ["wheel", "docker"] + sudo_file: "/etc/sudoers.d/devops" + sudo_validate: "visudo -cf %s" + + # RedOS + redos: + groups: ["wheel", "docker"] + sudo_file: "/etc/sudoers.d/devops" + sudo_validate: "visudo -cf %s" diff --git a/roles/devops/examples.yml b/roles/devops/examples.yml index 4f78209..896b97e 100644 --- a/roles/devops/examples.yml +++ b/roles/devops/examples.yml @@ -27,7 +27,6 @@ devops_user: name: "mydevops" home: "/home/mydevops" - groups: ["sudo", "docker", "wheel"] devops_password: length: 40 min_special: 6 @@ -40,6 +39,28 @@ roles: - devops +# Пример 4: Для конкретной ОС (RHEL/CentOS) +- name: "Создание пользователя для RHEL/CentOS" + hosts: rhel_servers + become: true + vars: + devops_os_config: + rhel: + groups: ["wheel", "docker", "adm"] + roles: + - devops + +# Пример 5: Для Ubuntu/Debian +- name: "Создание пользователя для Ubuntu/Debian" + hosts: ubuntu_servers + become: true + vars: + devops_os_config: + ubuntu: + groups: ["sudo", "docker", "adm"] + roles: + - devops + # Пример 4: С дополнительными группами - name: "Создание пользователя с дополнительными группами" hosts: all diff --git a/roles/devops/meta/main.yml b/roles/devops/meta/main.yml index 30abf18..e7ead9d 100644 --- a/roles/devops/meta/main.yml +++ b/roles/devops/meta/main.yml @@ -18,6 +18,13 @@ galaxy_info: versions: - "8" - "9" + - name: Rocky + versions: + - "8.0" + - "9.0" + - name: "Astra Linux" + versions: + - "1.7" galaxy_tags: - devops - usermanagement diff --git a/roles/devops/tasks/main.yml b/roles/devops/tasks/main.yml index 7fb3c82..652e914 100644 --- a/roles/devops/tasks/main.yml +++ b/roles/devops/tasks/main.yml @@ -3,6 +3,22 @@ # Автор: Сергей Антропов # Сайт: 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 + # Генерация безопасного пароля для пользователя devops - name: "Генерация безопасного пароля для пользователя devops" set_fact: @@ -15,7 +31,7 @@ name: "{{ devops_user.name }}" home: "{{ devops_user.home }}" shell: "{{ devops_user.shell }}" - groups: "{{ devops_user.groups }}" + groups: "{{ devops_user_groups }}" create_home: "{{ devops_user.create_home }}" state: "{{ devops_user.state }}" password: "{{ devops_user_password | password_hash('sha512') }}" @@ -44,14 +60,14 @@ # Настройка sudo для пользователя devops (без пароля) - name: "Настройка sudo для пользователя devops без пароля" lineinfile: - path: /etc/sudoers.d/devops + path: "{{ devops_sudo_file }}" line: "{{ devops_user.name }} ALL=(ALL) NOPASSWD: {{ devops_sudo.commands }}" create: true mode: '0440' - validate: 'visudo -cf %s' + validate: "{{ devops_sudo_validate }}" become: true # Логирование успешного создания пользователя - name: "Логирование создания пользователя devops" debug: - msg: "Пользователь {{ devops_user.name }} успешно создан с безопасным паролем и SSH доступом" + msg: "Пользователь {{ devops_user.name }} успешно создан с безопасным паролем и SSH доступом на {{ devops_os_name | default('неизвестная') }} ОС" diff --git a/roles/devops/tests/test.yml b/roles/devops/tests/test.yml index 9a28ed5..472fa7e 100644 --- a/roles/devops/tests/test.yml +++ b/roles/devops/tests/test.yml @@ -86,3 +86,5 @@ ✅ Sudo права настроены ✅ Группы пользователя: {{ user_groups.stdout }} ✅ Shell пользователя: {{ user_shell.stdout.split(':')[-1] }} + ✅ ОС: {{ devops_os_name | default('неизвестная') }} + ✅ Группы для ОС: {{ devops_user_groups | default('не определены') }}