- YAML inventory с мультигруппами в create.yml - Vault preflight проверки в converge.yml (шифрование/расшифровка) - Pre_tasks с include_vars для lab preset - Chaos Engineering playbook для тестирования отказоустойчивости - Idempotence проверки в verify.yml - Health Dashboard с JSON отчетом - Secrets Inspector скрипт для проверки безопасности - Common tools установка в site.yml Новые команды: - make chaos - запуск Chaos Engineering тестов - make check-secrets - проверка безопасности секретов - make idempotence - проверка идемпотентности Обновления в файлах: - molecule/universal/create.yml: добавлена генерация YAML inventory - molecule/universal/molecule.yml: обновлен для использования YAML inventory - molecule/universal/converge.yml: добавлены vault preflight проверки - molecule/universal/verify.yml: добавлены idempotence и health dashboard - files/playbooks/chaos.yml: новый Chaos Engineering playbook - files/playbooks/site.yml: добавлены common tools - scripts/secret_scan.sh: новый Secrets Inspector - Makefile: добавлены новые команды - README.md: обновлена документация Преимущества: - Мультигруппы в YAML inventory для сложных конфигураций - Автоматическая проверка и нормализация vault файлов - Тестирование отказоустойчивости через Chaos Engineering - Проверка идемпотентности для качества ролей - Health Dashboard для мониторинга состояния лаборатории - Secrets Inspector для безопасности - Установка common tools для всех хостов Автор: Сергей Антропов Сайт: https://devops.org.ru
		
			
				
	
	
		
			80 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
| ---
 | ||
| # Запуск ролей в универсальной лаборатории
 | ||
| # Автор: Сергей Антропов
 | ||
| # Сайт: https://devops.org.ru
 | ||
| 
 | ||
| - hosts: localhost
 | ||
|   gather_facts: false
 | ||
|   vars:
 | ||
|     # Перечисли файлы/глобы с секретами (можно добавлять свои пути)
 | ||
|     vault_targets:
 | ||
|       - /ansible/vault/secrets.yml
 | ||
|       - /ansible/files/playbooks/group_vars/*/vault.yml
 | ||
|       - /ansible/files/playbooks/host_vars/*/vault.yml
 | ||
|       - /ansible/roles/**/vars/vault.yml
 | ||
| 
 | ||
|   pre_tasks:
 | ||
|     - name: Load lab preset (vars)
 | ||
|       include_vars:
 | ||
|         file: "{{ lab_spec }}"
 | ||
| 
 | ||
|   tasks:
 | ||
|     - name: Install collections in controller
 | ||
|       community.docker.docker_container_exec:
 | ||
|         container: ansible-controller
 | ||
|         command: bash -lc "ansible-galaxy collection install -r /ansible/files/requirements.yml || true"
 | ||
| 
 | ||
|     # --- Preflight Vault: если файл уже открыт, шифруем и снова расшифровываем ---
 | ||
|     - name: Preflight vault — normalize state (encrypt if plaintext, then decrypt)
 | ||
|       community.docker.docker_container_exec:
 | ||
|         container: ansible-controller
 | ||
|         command: >
 | ||
|           bash -lc '
 | ||
|           set -euo pipefail;
 | ||
|           shopt -s nullglob globstar;
 | ||
|           for p in {{ vault_targets | map('quote') | join(' ') }}; do
 | ||
|             for f in $p; do
 | ||
|               if [ ! -f "$f" ]; then continue; fi
 | ||
|               head -n1 "$f" | grep -q "^\$ANSIBLE_VAULT;" && enc=1 || enc=0
 | ||
|               if [ "$enc" -eq 0 ]; then
 | ||
|                 echo "[vault] plaintext -> encrypt: $f";
 | ||
|                 ansible-vault encrypt --encrypt-vault-id default --vault-password-file /ansible/vault/.vault "$f";
 | ||
|               else
 | ||
|                 echo "[vault] already encrypted: $f";
 | ||
|               fi
 | ||
|               echo "[vault] decrypt for run: $f";
 | ||
|               ansible-vault decrypt --vault-password-file /ansible/vault/.vault "$f";
 | ||
|             done
 | ||
|           done
 | ||
|           '
 | ||
| 
 | ||
|     - name: Run external playbook (your roles live in /ansible/roles)
 | ||
|       community.docker.docker_container_exec:
 | ||
|         container: ansible-controller
 | ||
|         command: >
 | ||
|           bash -lc "
 | ||
|             ANSIBLE_ROLES_PATH=/ansible/roles
 | ||
|             ansible-playbook -i {{ lookup('env','MOLECULE_EPHEMERAL_DIRECTORY') }}/inventory/hosts.yml /ansible/files/playbooks/site.yml
 | ||
|           "
 | ||
| 
 | ||
|     # --- Пост-этап: всегда шифруем обратно ---
 | ||
|     - name: Post-run vault — re-encrypt everything
 | ||
|       community.docker.docker_container_exec:
 | ||
|         container: ansible-controller
 | ||
|         command: >
 | ||
|           bash -lc '
 | ||
|           set -euo pipefail;
 | ||
|           shopt -s nullglob globstar;
 | ||
|           for p in {{ vault_targets | map('quote') | join(' ') }}; do
 | ||
|             for f in $p; do
 | ||
|               if [ ! -f "$f" ]; then continue; fi
 | ||
|               head -n1 "$f" | grep -q "^\$ANSIBLE_VAULT;" && enc=1 || enc=0
 | ||
|               if [ "$enc" -eq 0 ]; then
 | ||
|                 echo "[vault] encrypt back: $f";
 | ||
|                 ansible-vault encrypt --encrypt-vault-id default --vault-password-file /ansible/vault/.vault "$f" || true;
 | ||
|               fi
 | ||
|             done
 | ||
|           done
 | ||
|           '
 | ||
|       ignore_errors: true
 |