Warunki i pętle w Ansible

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.

Przewijanie do góry