feat: добавлена роль devops и оптимизирована структура проекта
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled

- Создана роль devops с функциями:
  * Создание пользователя devops
  * Генерация безопасного пароля (30 символов)
  * Настройка SSH доступа по ключу
  * Добавление в sudoers без пароля
  * Полная документация и тесты

- Оптимизирована структура проекта:
  * Удален Dockerfile из корня (сборка из dockerfiles/ansible-controller)
  * Заменены внешние образы на локальные ansible-controller
  * Обновлен Makefile для использования локальных образов
  * Зашифрован vault/secrets.yml с помощью ansible-vault

- Добавлена документация:
  * Руководство по работе с vault (docs/vault-guide.md)
  * Подробная документация роли devops
  * Примеры использования и тесты

- Улучшена безопасность:
  * Все секреты зашифрованы
  * Обновлен .gitignore для vault файлов
  * Добавлены инструкции по безопасности
This commit is contained in:
Сергей Антропов
2025-10-25 20:06:08 +03:00
parent 5093d38c06
commit 30b69ce0ec
20 changed files with 997 additions and 132 deletions

View File

@@ -6,4 +6,5 @@
- name: Развертывание всех ролей
hosts: all
roles:
- ping
# - ping
- devops

120
roles/devops/QUICKSTART.md Normal file
View File

@@ -0,0 +1,120 @@
# Быстрый старт - Роль devops
## Автор
Сергей Антропов
Сайт: https://devops.org.ru
## Что делает роль
Роль `devops` автоматически:
1. ✅ Создает пользователя `devops`
2. ✅ Генерирует безопасный пароль (30 символов)
3. ✅ Настраивает SSH доступ по ключу
4. ✅ Добавляет права sudo без пароля
5. ✅ Создает домашнюю директорию
## Быстрый запуск
### 1. Базовое использование
```bash
ansible-playbook -i inventory/hosts.ini roles/deploy.yml
```
### 2. С SSH ключом из vault
```bash
ansible-playbook -i inventory/hosts.ini roles/deploy.yml \
--ask-vault-pass \
-e "devops_ssh_public_key={{ devops_ssh_keys.public_key }}"
```
### 3. Только роль devops
```bash
ansible-playbook -i inventory/hosts.ini roles/devops/playbook.yml
```
## Проверка результата
После выполнения проверьте:
```bash
# Проверка пользователя
ansible all -i inventory/hosts.ini -m shell -a "id devops"
# Проверка sudo прав
ansible all -i inventory/hosts.ini -m shell -a "sudo -l -U devops"
# Проверка SSH директории
ansible all -i inventory/hosts.ini -m shell -a "ls -la /home/devops/.ssh/"
```
## Настройка SSH ключа
1. Добавьте ваш SSH ключ в `vault/secrets.yml`:
```yaml
devops_ssh_keys:
public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC7vbqajDhA... your@email.com"
```
2. Запустите playbook с передачей ключа:
```bash
ansible-playbook -i inventory/hosts.ini roles/deploy.yml \
--ask-vault-pass \
-e "devops_ssh_public_key={{ devops_ssh_keys.public_key }}"
```
## Кастомизация
### Изменить имя пользователя
```yaml
vars:
devops_user:
name: "myuser"
home: "/home/myuser"
```
### Изменить длину пароля
```yaml
vars:
devops_password:
length: 40
```
### Добавить группы
```yaml
vars:
devops_user:
groups: ["sudo", "docker", "wheel", "adm"]
```
## Безопасность
- 🔒 Пароль генерируется автоматически и не сохраняется в логах
- 🔑 SSH доступ только по ключу (если настроен)
- 🛡️ Пользователь добавлен в sudoers с правами NOPASSWD
- 📁 SSH директория имеет правильные права доступа (700)
## Troubleshooting
### Проблема: Пользователь не создан
```bash
# Проверьте права sudo
ansible all -i inventory/hosts.ini -m shell -a "sudo whoami"
```
### Проблема: SSH не работает
```bash
# Проверьте права на SSH директорию
ansible all -i inventory/hosts.ini -m shell -a "ls -la /home/devops/.ssh/"
```
### Проблема: Sudo не работает
```bash
# Проверьте sudoers файл
ansible all -i inventory/hosts.ini -m shell -a "sudo visudo -c"
```
## Поддержка
- 📧 Email: через сайт https://devops.org.ru
- 📖 Документация: `roles/devops/README.md`
- 🧪 Тесты: `roles/devops/tests/test.yml`

167
roles/devops/README.md Normal file
View File

@@ -0,0 +1,167 @@
# Роль devops
Роль для создания пользователя devops с безопасным паролем, SSH доступом и правами sudo.
## Автор
Сергей Антропов
Сайт: https://devops.org.ru
## Описание
Эта роль выполняет следующие функции:
1. Создание пользователя `devops`
2. Генерация безопасного пароля длиной 30 символов
3. Назначение пароля пользователю
4. Добавление пользователя в sudoers с правами выполнения команд без пароля
5. Настройка SSH доступа через публичный ключ
## Требования
- Ansible >= 2.9
- Python >= 3.6
- Права root/sudo для выполнения задач
## Переменные
### Основные переменные (defaults/main.yml)
```yaml
# Настройки пользователя devops
devops_user:
name: "devops"
home: "/home/devops"
shell: "/bin/bash"
groups: ["sudo", "docker"]
create_home: true
state: "present"
# Настройки пароля
devops_password:
length: 30
special_chars: true
min_special: 4
min_upper: 4
min_lower: 4
min_digits: 4
# Настройки sudo
devops_sudo:
nopasswd: true
commands: "ALL"
# SSH настройки
devops_ssh:
authorized_keys_file: "/home/devops/.ssh/authorized_keys"
ssh_dir: "/home/devops/.ssh"
ssh_dir_mode: "0700"
authorized_keys_mode: "0600"
```
### Переменные из vault/secrets.yml
```yaml
# SSH ключи для пользователя devops
devops_ssh_keys:
public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC7vbqajDhA... devops@example.com"
```
## Использование
### Базовое использование
```yaml
- hosts: all
become: true
roles:
- devops
```
### С передачей SSH ключа
```yaml
- hosts: all
become: true
vars:
devops_ssh_public_key: "{{ devops_ssh_keys.public_key }}"
roles:
- devops
```
### С кастомными настройками
```yaml
- hosts: all
become: true
vars:
devops_user:
name: "mydevops"
home: "/home/mydevops"
devops_password:
length: 40
roles:
- devops
```
## Безопасность
- Пароль генерируется автоматически с использованием криптографически стойкого алгоритма
- Пароль содержит минимум 4 символа каждого типа (специальные, заглавные, строчные, цифры)
- SSH ключи добавляются в authorized_keys для безопасного доступа
- Пользователь добавляется в sudoers с правами NOPASSWD для удобства использования
## Поддерживаемые ОС
- Ubuntu (focal, jammy)
- Debian (bullseye, bookworm)
- RHEL (8, 9)
- CentOS (8, 9)
- Rocky Linux (8, 9)
- AlmaLinux (8, 9)
## Теги
- `devops` - основная функциональность
- `user-management` - управление пользователями
- `security` - настройки безопасности
- `ssh` - SSH конфигурация
- `sudo` - настройки sudo
## Примеры
### Создание пользователя с SSH ключом
```bash
ansible-playbook -i inventory/hosts.ini playbook.yml \
--ask-vault-pass \
-e "devops_ssh_public_key={{ devops_ssh_keys.public_key }}"
```
### Проверка создания пользователя
```bash
ansible all -i inventory/hosts.ini -m shell -a "id devops"
```
## Troubleshooting
### Проблема с sudoers
Если возникают проблемы с sudoers, проверьте синтаксис:
```bash
sudo visudo -c
```
### Проблема с SSH
Проверьте права доступа к SSH директории:
```bash
ls -la /home/devops/.ssh/
```
Должны быть права 700 для директории и 600 для authorized_keys.
## Лицензия
MIT

View File

@@ -0,0 +1,34 @@
---
# Переменные по умолчанию для роли devops
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Настройки пользователя devops
devops_user:
name: "devops"
home: "/home/devops"
shell: "/bin/bash"
groups: ["sudo", "docker"]
create_home: true
state: "present"
# Настройки пароля
devops_password:
length: 30
special_chars: true
min_special: 4
min_upper: 4
min_lower: 4
min_digits: 4
# Настройки sudo
devops_sudo:
nopasswd: true
commands: "ALL"
# SSH настройки
devops_ssh:
authorized_keys_file: "/home/devops/.ssh/authorized_keys"
ssh_dir: "/home/devops/.ssh"
ssh_dir_mode: "0700"
authorized_keys_mode: "0600"

64
roles/devops/examples.yml Normal file
View File

@@ -0,0 +1,64 @@
---
# Примеры использования роли devops
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Пример 1: Базовое использование
- name: "Базовое создание пользователя devops"
hosts: all
become: true
roles:
- devops
# Пример 2: С передачей SSH ключа из vault
- name: "Создание пользователя devops с SSH ключом"
hosts: all
become: true
vars:
devops_ssh_public_key: "{{ devops_ssh_keys.public_key }}"
roles:
- devops
# Пример 3: С кастомными настройками
- name: "Создание пользователя с кастомными настройками"
hosts: all
become: true
vars:
devops_user:
name: "mydevops"
home: "/home/mydevops"
groups: ["sudo", "docker", "wheel"]
devops_password:
length: 40
min_special: 6
min_upper: 6
min_lower: 6
min_digits: 6
devops_ssh:
ssh_dir: "/home/mydevops/.ssh"
authorized_keys_file: "/home/mydevops/.ssh/authorized_keys"
roles:
- devops
# Пример 4: С дополнительными группами
- name: "Создание пользователя с дополнительными группами"
hosts: all
become: true
vars:
devops_user:
groups: ["sudo", "docker", "wheel", "adm", "systemd-journal"]
roles:
- devops
# Пример 5: Только для определенных хостов
- name: "Создание пользователя на серверах разработки"
hosts: dev_servers
become: true
vars:
devops_user:
name: "developer"
home: "/home/developer"
devops_sudo:
commands: "ALL, !/usr/bin/passwd root"
roles:
- devops

View File

@@ -0,0 +1,25 @@
---
# Обработчики для роли devops
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Обработчик для перезапуска SSH сервиса после изменения authorized_keys
- name: "Перезапуск SSH сервиса"
service:
name: ssh
state: restarted
become: true
when: ansible_os_family != "RedHat"
- name: "Перезапуск SSH сервиса (RedHat/CentOS)"
service:
name: sshd
state: restarted
become: true
when: ansible_os_family == "RedHat"
# Обработчик для проверки sudo конфигурации
- name: "Проверка sudo конфигурации"
command: visudo -c
become: true
changed_when: false

View File

@@ -0,0 +1,28 @@
---
galaxy_info:
author: Сергей Антропов
description: Роль для создания пользователя devops с безопасным паролем и SSH доступом
company: https://devops.org.ru
license: MIT
min_ansible_version: "2.9"
platforms:
- name: Ubuntu
versions:
- focal
- jammy
- name: Debian
versions:
- bullseye
- bookworm
- name: EL
versions:
- "8"
- "9"
galaxy_tags:
- devops
- usermanagement
- security
- ssh
- sudo
dependencies: []

50
roles/devops/playbook.yml Normal file
View File

@@ -0,0 +1,50 @@
---
# Пример playbook для роли devops
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: "Создание пользователя devops с безопасным паролем и SSH доступом"
hosts: all
become: true
gather_facts: true
vars:
# Переменная для SSH ключа (должна быть передана из vault)
devops_ssh_public_key: "{{ devops_ssh_keys.public_key }}"
roles:
- devops
post_tasks:
- name: "Проверка создания пользователя devops"
command: "id {{ devops_user.name }}"
register: user_check
failed_when: user_check.rc != 0
changed_when: false
- name: "Проверка SSH директории"
stat:
path: "{{ devops_ssh.ssh_dir }}"
register: ssh_dir_check
- name: "Проверка authorized_keys"
stat:
path: "{{ devops_ssh.authorized_keys_file }}"
register: auth_keys_check
when: devops_ssh_public_key is defined
- name: "Проверка sudo прав"
command: "sudo -l -U {{ devops_user.name }}"
register: sudo_check
become: true
changed_when: false
- name: "Вывод результатов проверки"
debug:
msg: |
Пользователь {{ devops_user.name }} создан: {{ user_check.rc == 0 }}
SSH директория создана: {{ ssh_dir_check.stat.exists }}
{% if devops_ssh_public_key is defined %}
authorized_keys создан: {{ auth_keys_check.stat.exists }}
{% endif %}
Sudo права настроены: {{ sudo_check.rc == 0 }}

View File

@@ -0,0 +1,57 @@
---
# Задачи для роли devops
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Генерация безопасного пароля для пользователя 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_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: /etc/sudoers.d/devops
line: "{{ devops_user.name }} ALL=(ALL) NOPASSWD: {{ devops_sudo.commands }}"
create: true
mode: '0440'
validate: 'visudo -cf %s'
become: true
# Логирование успешного создания пользователя
- name: "Логирование создания пользователя devops"
debug:
msg: "Пользователь {{ devops_user.name }} успешно создан с безопасным паролем и SSH доступом"

View File

@@ -0,0 +1,88 @@
---
# Тесты для роли devops
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: "Тестирование роли devops"
hosts: all
become: true
gather_facts: true
vars:
devops_ssh_public_key: "{{ devops_ssh_keys.public_key }}"
roles:
- devops
post_tasks:
# Тест 1: Проверка существования пользователя
- name: "Проверка существования пользователя devops"
command: "id {{ devops_user.name }}"
register: user_exists
failed_when: user_exists.rc != 0
changed_when: false
# Тест 2: Проверка домашней директории
- name: "Проверка домашней директории"
stat:
path: "{{ devops_user.home }}"
register: home_dir
failed_when: not home_dir.stat.exists
# Тест 3: Проверка SSH директории
- name: "Проверка SSH директории"
stat:
path: "{{ devops_ssh.ssh_dir }}"
register: ssh_dir
failed_when: not ssh_dir.stat.exists
# Тест 4: Проверка authorized_keys (если SSH ключ передан)
- name: "Проверка authorized_keys"
stat:
path: "{{ devops_ssh.authorized_keys_file }}"
register: auth_keys
failed_when: devops_ssh_public_key is defined and not auth_keys.stat.exists
when: devops_ssh_public_key is defined
# Тест 5: Проверка sudo прав
- name: "Проверка sudo прав"
command: "sudo -l -U {{ devops_user.name }}"
register: sudo_rights
become: true
failed_when: sudo_rights.rc != 0
changed_when: false
# Тест 6: Проверка групп пользователя
- name: "Проверка групп пользователя"
command: "groups {{ devops_user.name }}"
register: user_groups
failed_when: user_groups.rc != 0
changed_when: false
# Тест 7: Проверка прав на SSH директорию
- name: "Проверка прав на SSH директорию"
stat:
path: "{{ devops_ssh.ssh_dir }}"
register: ssh_dir_perms
failed_when: ssh_dir_perms.stat.mode != "0" + devops_ssh.ssh_dir_mode
# Тест 8: Проверка shell пользователя
- name: "Проверка shell пользователя"
command: "getent passwd {{ devops_user.name }}"
register: user_shell
failed_when: user_shell.rc != 0
changed_when: false
# Вывод результатов тестов
- name: "Результаты тестов"
debug:
msg: |
✅ Пользователь {{ devops_user.name }} создан
✅ Домашняя директория {{ devops_user.home }} создана
✅ SSH директория {{ devops_ssh.ssh_dir }} создана
{% if devops_ssh_public_key is defined %}
✅ authorized_keys настроен
{% endif %}
✅ Sudo права настроены
✅ Группы пользователя: {{ user_groups.stdout }}
✅ Shell пользователя: {{ user_shell.stdout.split(':')[-1] }}

View File

@@ -0,0 +1,25 @@
---
# Переменные для роли devops
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Список пакетов, необходимых для роли
devops_required_packages:
- openssh-server
- sudo
- passwd
# Настройки безопасности для SSH
devops_ssh_security:
permit_root_login: "no"
password_authentication: "yes"
pubkey_authentication: "yes"
authorized_keys_file: ".ssh/authorized_keys"
# Настройки sudo для безопасности
devops_sudo_security:
requiretty: false
visiblepw: false
always_set_home: true
env_reset: true
env_keep: "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"