Warunki i pętle w Ansible
Automatyzacja w Ansible nie ogranicza się do wykonywania prostych poleceń. Dzięki warunkom i pętlom można tworzyć dynamiczne i inteligentne playbooki, które dostosowują się do środowiska i danych. W tym artykule omówię użycie instrukcji when oraz pętli loop, with_items i with_dict, a także pokażę praktyczne przykłady zastosowań.
1. Instrukcja warunkowa – when
Instrukcja when pozwala wykonać zadanie tylko wtedy, gdy spełniony jest określony warunek logiczny. Najczęściej używana jest w oparciu o fakty systemowe lub wartości zmiennych.
Przykład: instalacja pakietu tylko w Ubuntu
– name: Install nginx only on Ubuntu
ansible.builtin.package:
name: nginx
state: present
when: ansible_facts[’os_family’] == „Debian”
Przykład: wykonywanie zadania tylko jeśli zmienna jest zdefiniowana
– name: Create backup directory if defined
ansible.builtin.file:
path: „{{ backup_path }}”
state: directory
when: backup_path is defined
Możliwe jest także łączenie warunków:
when: ansible_facts[’distribution’] == „CentOS” and app_enabled | bool
2. Pętle – loop
Pętla loop służy do wielokrotnego wykonywania tego samego zadania dla różnych elementów listy.
Przykład: tworzenie wielu użytkowników
– name: Create multiple users
ansible.builtin.user:
name: „{{ item }}”
state: present
loop:
– janek
– kasia
– tomek
Każdy element listy przekazywany jest kolejno do zmiennej item.
3. Pętle z listami złożonymi (słowniki)
Jeśli dane wejściowe mają postać listy słowników, można w łatwy sposób odwoływać się do ich kluczy.
Przykład: tworzenie użytkowników z parametrami
– name: Create users with parameters
ansible.builtin.user:
name: „{{ item.name }}”
shell: „{{ item.shell }}”
state: present
loop:
– { name: „janek”, shell: „/bin/bash” }
– { name: „kasia”, shell: „/bin/zsh” }
4. with_items i with_dict
Starsze wersje Ansible używały pętli with_items i with_dict. Obecnie są one równoważne z loop, ale nadal często spotykane w istniejących projektach.
Przykład: with_items
– name: Install packages
ansible.builtin.package:
name: „{{ item }}”
state: present
with_items:
– nginx
– git
– curl
Przykład: with_dict
– name: Configure users
ansible.builtin.user:
name: „{{ item.key }}”
shell: „{{ item.value.shell }}”
with_dict:
users:
janek: { shell: „/bin/bash” }
kasia: { shell: „/bin/zsh” }
5. Przykład praktyczny – iteracyjne wdrożenie aplikacji
Wdrożenie kilku aplikacji na serwerach można zrealizować pętlą i warunkami:
– name: Deploy multiple applications
hosts: webservers
vars:
apps:
– { name: „app1”, port: 8080, enabled: true }
– { name: „app2”, port: 9090, enabled: false }
tasks:
– name: Deploy app
ansible.builtin.template:
src: templates/app.conf.j2
dest: „/etc/app/{{ item.name }}.conf”
when: item.enabled | bool
loop: „{{ apps }}”
Dzięki pętlom i warunkom można w prosty sposób wdrażać wiele usług z różnymi parametrami.
Podsumowanie
Warunki i pętle to podstawa logiki w Ansible. Umożliwiają wykonywanie zadań zależnych od środowiska, faktów lub zmiennych. Ich właściwe wykorzystanie znacząco zwiększa elastyczność playbooków i pozwala tworzyć w pełni zautomatyzowane procesy wdrożeniowe.