Ansible playbook diff: Sledování změn v automatizaci
Ansible je jeden z nejpopulárnějších nástrojů pro automatizaci konfigurace serverů a deploymentu aplikací. S rostoucí komplexitou infrastruktury roste i potřeba sledovat změny v playbookách a rolích. Jedna špatně upravená proměnná může zastavit produkci, smazat důležitá data nebo otevřít bezpečnostní díru. Tento článek vás provede technikami a nástroji pro efektivní porovnávání Ansible konfigurací.
Co je Ansible a proč potřebujete diff?
Ansible je open-source nástroj pro automatizaci IT operací. Místo manuálního přihlašování na servery a spouštění příkazů definujete požadovaný stav v YAML souborech – playbookách.
Typická Ansible struktura:
# playbook.yml
---
- name: Deploy web application
hosts: webservers
become: yes
vars:
app_version: "2.1.0"
app_port: 8080
tasks:
- name: Install required packages
apt:
name:
- nginx
- python3
- python3-pip
state: present
update_cache: yes
- name: Deploy application
copy:
src: "{{ app_source }}"
dest: "/opt/webapp/"
owner: www-data
mode: '0755'
notify: Restart nginx
handlers:
- name: Restart nginx
service:
name: nginx
state: restarted
Proč je diff kritický pro Ansible?
1. Idempotence není vždy zaručena Ansible by měl být idempotentní (opakované spuštění = stejný výsledek), ale některé moduly nebo špatně napsané tasky mohou způsobit problémy.
2. YAML je citlivý na formátování Mezera navíc nebo špatné odsazení může zcela změnit význam konfigurace:
# SPRÁVNĚ - položky seznamu
packages:
- nginx
- python3
# ŠPATNĚ - string místo seznamu
packages:
nginx
python3
3. Kaskádové závislosti Změna jedné role může ovlivnit desítky serverů. Potřebujete vidět celý dopad.
4. Security sensitive Ansible často pracuje s přístupovými údaji, klíči a citlivými konfiguracemi.
Základní nástroje pro Ansible diff
1. Git diff pro YAML soubory
Nejzákladnější přístup je verzovat playbook v Gitu a používat standardní diff:
# Zobrazení změn v playbooku
git diff HEAD~1 playbook.yml
# Porovnání dvou větví
git diff main..feature/new-deployment roles/
# Diff s kontextem pro lepší čitelnost
git diff -U10 playbook.yml
Tip pro lepší YAML diff v Gitu:
Přidejte do .gitattributes:
*.yml diff=yaml
*.yaml diff=yaml
A do .gitconfig:
[diff "yaml"]
textconv = python3 -c "import sys, yaml; print(yaml.safe_dump(yaml.safe_load(open(sys.argv[1])), default_flow_style=False, sort_keys=True))"
Toto normalizuje YAML před porovnáním – seřadí klíče a sjednotí formátování.
2. Ansible-lint pro detekci problémů
Ansible-lint není přímo diff nástroj, ale pomáhá identifikovat problematické změny:
# Instalace
pip install ansible-lint
# Kontrola playbooku
ansible-lint playbook.yml
# Kontrola celého projektu
ansible-lint
# Výstup v JSON pro další zpracování
ansible-lint -f json playbook.yml
Integrace s pre-commit hookem:
# .pre-commit-config.yaml
repos:
- repo: https://github.com/ansible/ansible-lint
rev: v6.22.0
hooks:
- id: ansible-lint
files: \.(yml|yaml)$
3. Ansible --diff a --check mód
Ansible má vestavěnou podporu pro zobrazení změn:
# Dry-run s výpisem změn
ansible-playbook playbook.yml --check --diff
# Pouze diff (aplikuje změny)
ansible-playbook playbook.yml --diff
# Diff pro konkrétní host
ansible-playbook playbook.yml --check --diff --limit webserver01
Výstup ukazuje, co se změní:
TASK [Deploy configuration] ***
--- before: /etc/nginx/nginx.conf
+++ after: /home/ansible/nginx.conf.j2
@@ -10,7 +10,7 @@
listen 80;
- server_name old.example.com;
+ server_name new.example.com;
location / {
Pokročilé techniky pro Ansible diff
1. Porovnání role před a po změně
Role jsou znovupoužitelné jednotky konfigurace. Porovnání celé role:
# Struktura role
roles/webserver/
├── defaults/
│ └── main.yml
├── handlers/
│ └── main.yml
├── tasks/
│ └── main.yml
├── templates/
│ └── nginx.conf.j2
└── vars/
└── main.yml
# Diff celé role
git diff main..feature/update-webserver -- roles/webserver/
# Jen defaults (výchozí proměnné)
git diff main..feature/update-webserver -- roles/webserver/defaults/
2. Diff inventory souborů
Inventory definuje, na kterých serverech se playbook spustí:
# inventory/production.yml
all:
children:
webservers:
hosts:
web01.example.com:
ansible_host: 192.168.1.10
web02.example.com:
ansible_host: 192.168.1.11
databases:
hosts:
db01.example.com:
ansible_host: 192.168.1.20
db_role: primary
Porovnání inventory mezi prostředími:
# Vizuální diff
diff -y inventory/staging.yml inventory/production.yml
# Nebo pomocí našeho nástroje
# Vložte oba soubory do PorovnejText.cz
3. Diff group_vars a host_vars
Proměnné pro skupiny a jednotlivé hosty:
# Struktura
group_vars/
├── all.yml # Proměnné pro všechny hosty
├── webservers.yml # Proměnné pro webservery
└── databases.yml # Proměnné pro databáze
host_vars/
├── web01.yml # Proměnné pro konkrétní host
└── db01.yml
# Diff všech proměnných
git diff HEAD~5..HEAD -- group_vars/ host_vars/
4. Ansible Vault diff
Pro šifrované soubory (vault) je diff složitější:
# Nastavení diff pro vault soubory
# .gitattributes
*.vault.yml diff=ansible-vault
# .gitconfig
[diff "ansible-vault"]
textconv = ansible-vault view
# Vyžaduje nastavený ANSIBLE_VAULT_PASSWORD_FILE
export ANSIBLE_VAULT_PASSWORD_FILE=~/.vault_pass
# Diff s dešifrováním
git diff HEAD~1 secrets.vault.yml
Best practices pro Ansible diff workflow
1. Strukturované code review
Pull request šablona pro Ansible změny:
## Popis změny
<!-- Co tato změna dělá? -->
## Ovlivněné servery
<!-- Které skupiny/hosty budou ovlivněny? -->
- [ ] production/webservers
- [ ] staging/all
## Testování
- [ ] Spuštěn `ansible-lint`
- [ ] Spuštěn `--check --diff` na staging
- [ ] Ověřeny změněné soubory na cílovém serveru
## Rollback plán
<!-- Jak vrátit změny, pokud něco selže? -->
## Checklist
- [ ] Vault secrets nejsou commitnuty v plaintextu
- [ ] Handlers jsou korektně pojmenované
- [ ] Tags jsou přidány pro selektivní spuštění
2. Automatické kontroly v CI/CD
GitHub Actions workflow:
# .github/workflows/ansible-check.yml
name: Ansible Validation
on:
pull_request:
paths:
- '**.yml'
- '**.yaml'
- 'roles/**'
- 'playbooks/**'
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install ansible ansible-lint yamllint
- name: Run yamllint
run: yamllint .
- name: Run ansible-lint
run: ansible-lint
- name: Syntax check
run: |
for playbook in playbooks/*.yml; do
ansible-playbook "$playbook" --syntax-check
done
diff-report:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Generate diff report
run: |
echo "## Ansible Changes" >> $GITHUB_STEP_SUMMARY
echo "```diff" >> $GITHUB_STEP_SUMMARY
git diff origin/main...HEAD -- '*.yml' '*.yaml' >> $GITHUB_STEP_SUMMARY
echo "```" >> $GITHUB_STEP_SUMMARY
3. Staging před production
Vždy testujte změny na staging prostředí:
# 1. Dry-run na staging
ansible-playbook -i inventory/staging.yml playbook.yml --check --diff
# 2. Aplikace na staging
ansible-playbook -i inventory/staging.yml playbook.yml --diff
# 3. Verifikace
ansible -i inventory/staging.yml webservers -m command -a "systemctl status nginx"
# 4. Až po ověření - production
ansible-playbook -i inventory/production.yml playbook.yml --diff
4. Verzování a tagging
# Tagování před každou production změnou
git tag -a "deploy-$(date +%Y%m%d-%H%M)" -m "Production deployment"
# Rychlý rollback
git revert HEAD
ansible-playbook playbook.yml
# Nebo návrat ke konkrétnímu tagu
git checkout deploy-20260120-1430
ansible-playbook playbook.yml
Časté chyby při Ansible diff
1. Ignorování whitespace změn
YAML je na whitespace citlivý:
# Toto NENÍ stejné
tasks:
- name: Task
command: echo hello
tasks:
- name: Task
command: echo hello
# (druhá verze má trailing whitespace)
Řešení: Používejte .editorconfig:
[*.{yml,yaml}]
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
insert_final_newline = true
2. Nekonzistentní uvozovky
# Nekonzistentní styl
version: "1.0"
name: 'My App'
port: 8080
# Konzistentní styl
version: "1.0"
name: "My App"
port: 8080
3. Změna pořadí tasků
Pořadí tasků v Ansible záleží! Diff by měl vždy zobrazit změny pořadí:
# Před
tasks:
- name: Install packages
apt: name=nginx
- name: Start service
service: name=nginx state=started
# Po (špatné pořadí!)
tasks:
- name: Start service
service: name=nginx state=started # Selže - nginx ještě není nainstalován
- name: Install packages
apt: name=nginx
4. Skryté změny v Jinja2 šablonách
Templates často obsahují logiku:
# templates/nginx.conf.j2
{% for server in webservers %}
upstream backend_{{ server.name }} {
server {{ server.ip }}:{{ server.port | default(8080) }};
}
{% endfor %}
Tip: Diff templates vždy pečlivě kontrolujte – změna v šabloně ovlivní všechny servery.
Specializované nástroje pro Ansible diff
1. Ansible-diff (komunitní nástroj)
# Instalace
pip install ansible-diff
# Použití
ansible-diff playbook.yml --before HEAD~1 --after HEAD
2. AWX / Ansible Tower diff
Pokud používáte AWX nebo Ansible Tower:
- Job Templates mají historii spuštění
- Survey variables jsou logovány
- Inventory sync zobrazuje změny
3. Ansible Navigator
Moderní náhrада za ansible-playbook s lepším TUI:
# Instalace
pip install ansible-navigator
# Spuštění s diff
ansible-navigator run playbook.yml --mode stdout -- --check --diff
Příklady z praxe
Příklad 1: Aktualizace verze aplikace
Před:
# group_vars/webservers.yml
app_version: "2.0.5"
app_config:
debug: false
workers: 4
Po:
# group_vars/webservers.yml
app_version: "2.1.0"
app_config:
debug: false
workers: 8 # Zvýšeno pro novou verzi
cache_ttl: 3600 # Nová konfigurace
Diff výstup:
--- a/group_vars/webservers.yml
+++ b/group_vars/webservers.yml
@@ -1,5 +1,6 @@
-app_version: "2.0.5"
+app_version: "2.1.0"
app_config:
debug: false
- workers: 4
+ workers: 8 # Zvýšeno pro novou verzi
+ cache_ttl: 3600 # Nová konfigurace
Příklad 2: Bezpečnostní audit změn
Kontrolní seznam pro security review:
# Vyhledání změn v privilegovaných operacích
git diff HEAD~10 -- '*.yml' | grep -E "(become:|become_user:|shell:|command:|raw:)"
# Kontrola změn v firewall pravidlech
git diff HEAD~10 -- roles/firewall/
# Změny v SSH konfiguraci
git diff HEAD~10 -- roles/*/templates/*sshd*
Příklad 3: Multi-environment diff
Porovnání staging vs production proměnných:
#!/bin/bash
# compare-envs.sh
echo "=== Rozdíly staging vs production ==="
for file in group_vars/*.yml; do
filename=$(basename "$file")
staging="inventory/staging/group_vars/$filename"
production="inventory/production/group_vars/$filename"
if [[ -f "$staging" && -f "$production" ]]; then
echo "--- $filename ---"
diff -u "$staging" "$production" || true
echo ""
fi
done
Integrace s PorovnejText.cz
Pro rychlé vizuální porovnání Ansible konfigurací použijte náš Code Diff nástroj:
Výhody:
- Syntax highlighting pro YAML
- Okamžité porovnání bez instalace
- Vše běží lokálně – citlivé konfigurace zůstávají v prohlížeči
- Export výsledků pro dokumentaci
Workflow:
- Zkopírujte starší verzi playbooku/role do levého pole
- Vložte novější verzi do pravého pole
- Ihned vidíte barevně zvýrazněné změny
- Exportujte pro code review nebo dokumentaci
Shrnutí a doporučení
Efektivní sledování změn v Ansible konfiguracích vyžaduje kombinaci nástrojů a procesů:
Používejte Git jako základ:
- Verzujte vše včetně inventory
- Nastavte git attributes pro lepší YAML diff
- Tagujte před každým deploymentem
Automatizujte kontroly:
- ansible-lint v CI/CD
- yamllint pro konzistenci formátování
- --check --diff před každým nasazením
Bezpečnost především:
- Ansible Vault pro citlivé údaje
- Code review pro všechny změny
- Audit log kdo, co, kdy změnil
Testujte před produkcí:
- Staging prostředí pro ověření
- --check --diff pro náhled změn
- Rollback plán pro každou změnu
Investice do kvalitního diff workflow se vyplatí v podobě stabilnější infrastruktury, rychlejší detekce problémů a lepší spolupráce v týmu.
Potřebujete rychle porovnat Ansible playbook nebo YAML konfiguraci? Použijte PorovnejText.cz – okamžité porovnání kódu s barevným zvýrazněním přímo ve vašem prohlížeči. Vše běží lokálně, žádná data se neodesílají na server.
Vyzkoušejte PorovnejText.cz zdarma
Nejrychlejší český nástroj pro porovnání textů. Vše probíhá ve vašem prohlížeči, žádná registrace není potřeba.
Porovnat texty nyní →Související články
Jak kontroluju config soubory před deployem
Jedna špatná změna v YAML a máte outage. Tady je jak porovnávám konfigurace mezi prostředími.
Porovnávání server configů - jak to dělám já
Praktický DevOps návod na porovnávání konfigurací. Od nginx přes Kubernetes po automatizaci v CI/CD.
.env soubory - jak je porovnávat bez security průšvihu
Praktický návod na správu environment variables. Jak diffovat mezi dev, staging a produkcí bezpečně.