DevOps

Ansible playbook diff: Sledování změn v automatizaci

6. února 2026
11 min čtení
ansible diffautomatizaceplaybookDevOpsconfiguration managementYAML

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:

  1. Job Templates mají historii spuštění
  2. Survey variables jsou logovány
  3. 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:

  1. Zkopírujte starší verzi playbooku/role do levého pole
  2. Vložte novější verzi do pravého pole
  3. Ihned vidíte barevně zvýrazněné změny
  4. 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í →