1
0

Secrets: add role for secret deploy

This commit is contained in:
2025-08-04 08:06:58 +03:00
parent af39ca9de8
commit 21b52a1887
4 changed files with 132 additions and 0 deletions

55
roles/secrets/README.md Normal file
View File

@@ -0,0 +1,55 @@
# Secrets Role
Ansible роль для сохранения секретов на удаленной машине.
## Описание
Роль позволяет безопасно сохранять секреты на удаленной машине в виде файлов с ограниченными правами доступа. Поддерживает сохранение переменных как файлов и копирование существующих файлов.
## Параметры
### Обязательные параметры
- `secrets_dest` - директория, куда будут сохранены секреты в виде файлов
- `secrets_user` - имя пользователя, который будет владеть директорией и файлами
- `secrets_group` - группа, которая будет владеть директорией и файлами (по умолчанию равна `secrets_user`)
### Опциональные параметры
- `secrets_vars` - список переменных, из которых будут извлечены секреты (по умолчанию: `[]`)
- `secrets_files` - список файлов, которые будут скопированы "как есть" (по умолчанию: `[]`)
- `secrets_dir_mode` - права доступа для директории (по умолчанию: `0750`)
- `secrets_file_mode` - права доступа для файлов с секретами (по умолчанию: `0400`)
## Функциональность
1. Создает директорию `secrets_dest` если она не существует
2. Сохраняет каждую переменную из `secrets_vars` как файл с таким же именем
3. Копирует файлы из `secrets_files` в директорию назначения
4. Устанавливает права доступа `0400` для всех файлов с секретами
5. Назначает указанного пользователя и группу владельцами директории и файлов
## Пример использования
```yaml
- name: Save application secrets
include_role:
name: secrets
vars:
secrets_dest: /opt/myapp/secrets
secrets_user: myapp
secrets_group: myapp
secrets_vars:
- database_password
- api_key
- jwt_secret
secrets_files:
- /path/to/ssl/certificate.pem
- /path/to/ssl/private.key
```
## Безопасность
- Все файлы с секретами создаются с правами `0400` (только чтение для владельца)
- Директория создается с правами `0750` (полный доступ для владельца, чтение и выполнение для группы)
- Используется `no_log: true` для предотвращения вывода секретов в логи Ansible

View File

@@ -0,0 +1,9 @@
---
# Default variables for secrets role
secrets_dest: ""
secrets_user: ""
secrets_group: "{{ secrets_user }}"
secrets_vars: []
secrets_files: []
secrets_dir_mode: "0750"
secrets_file_mode: "0400"

View File

@@ -0,0 +1,22 @@
---
galaxy_info:
author: 'Anton Vakhrushev'
description: Ansible role for saving secrets on remote machine
license: MIT
min_ansible_version: '2.9'
platforms:
- name: Ubuntu
versions:
- all
- name: Debian
versions:
- all
- name: EL
versions:
- all
galaxy_tags:
- secrets
- security
- files
dependencies: []

View File

@@ -0,0 +1,46 @@
---
# tasks file for secrets role
- name: "Validate secrets_dest parameter"
ansible.builtin.fail:
msg: "secrets_dest is required but not defined"
when: secrets_dest is not defined or secrets_dest == ""
- name: "Validate secrets_user parameter"
ansible.builtin.fail:
msg: "secrets_user is required but not defined"
when: secrets_user is not defined or secrets_user == ""
- name: "Validate secrets_group parameter"
ansible.builtin.fail:
msg: "secrets_group is required but not defined"
when: secrets_group is not defined or secrets_group == ""
- name: "Create secrets destination directory"
ansible.builtin.file:
path: "{{ secrets_dest }}"
state: directory
owner: "{{ secrets_user }}"
group: "{{ secrets_group }}"
mode: "{{ secrets_dir_mode }}"
- name: "Save variables as secret files"
ansible.builtin.copy:
content: "{{ lookup('vars', item) }}"
dest: "{{ secrets_dest }}/{{ item }}"
owner: "{{ secrets_user }}"
group: "{{ secrets_group }}"
mode: "{{ secrets_file_mode }}"
loop: "{{ secrets_vars }}"
when: secrets_vars | length > 0
no_log: true
- name: "Copy secret files"
ansible.builtin.copy:
src: "{{ item }}"
dest: "{{ secrets_dest }}/{{ item | basename }}"
owner: "{{ secrets_user }}"
group: "{{ secrets_group }}"
mode: "{{ secrets_file_mode }}"
loop: "{{ secrets_files }}"
when: secrets_files | length > 0