Secrets: add role for secret deploy
This commit is contained in:
55
roles/secrets/README.md
Normal file
55
roles/secrets/README.md
Normal 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
|
9
roles/secrets/defaults/main.yml
Normal file
9
roles/secrets/defaults/main.yml
Normal 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"
|
22
roles/secrets/meta/main.yml
Normal file
22
roles/secrets/meta/main.yml
Normal 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: []
|
46
roles/secrets/tasks/main.yml
Normal file
46
roles/secrets/tasks/main.yml
Normal 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
|
Reference in New Issue
Block a user