Ansible za konfiguraciju servera: idempotentnost u praksi

Ansible za 1 do 5 servera: inventory, playbookovi, idempotentnost, vault za tajne, i kad je bolji izbor od cloud-inita ili Terriforma.

Ansible DevOps Linux
Ansible za konfiguraciju servera: idempotentnost u praksi

Terraform je dobar za stvaranje resursa. Ansible je dobar za stanje operacijskog sustava i servisa na već postojećim strojevima: paketi, korisnici, sshd, nginx, Docker. Za male tvrtke s nekoliko VPS-ova to je često točka gdje nestaje „ručni SSH checklist“.

Inventory i prvi playbook

# inventory/hosts.yml
all:
  children:
    web:
      hosts:
        app1:
          ansible_host: 203.0.113.10
    db:
      hosts:
        db1:
          ansible_host: 203.0.113.20
  vars:
    ansible_user: deploy
    ansible_python_interpreter: /usr/bin/python3
# site.yml
- name: Osnovni hardening web servera
  hosts: web
  become: true
  tasks:
    - name: Instaliraj potrebne pakete
      ansible.builtin.apt:
        name:
          - ufw
          - fail2ban
          - nginx
        state: present
        update_cache: true

- name: UFW dozvoli OpenSSH i HTTP/S
      community.general.ufw:
        rule: allow
        port: "{{ item }}"
        proto: tcp
      loop: ["22", "80", "443"]

- name: UFW enable
      community.general.ufw:
        state: enabled
ansible-playbook -i inventory/hosts.yml site.yml --check
ansible-playbook -i inventory/hosts.yml site.yml

--check nije savršen dry-run za sve module, ali hvata očite greške prije pravog runa.

Idempotentnost: zašto je bitna

Idempotentan task ostavlja sustav u željenom stanju bez obzira pokrenete li playbook jednom ili deset puta. apt: state=present i copy/template s notifikacijom handlerea su idempotentni. shell: echo x >> file nije: svaki run dodaje novi red.

Preferirajte module (apt, service, user, copy, template, lineinfile) umjesto raw shell-a. Shell koristite kad nema modula, uz creates, removes ili changed_when.

Roles vs jednostavni playbookovi (1 do 5 servera)

Za par strojeva jedan site.yml plus par task fileova često je čitljiviji od premature role strukture. Roles imaju smisla kad dijelite isti nginx/docker setup između projekata ili kad playbook naraste preko „jednog ekrana“.

Ne kopirajte Galaxy role s pedeset varijabli ako trebate samo instalirati Docker.

Docker instalacija: skica s modulima

- name: Dodaj Docker apt key i repo
  # koristite službeni Docker repo postupak za vaš distro;
  # zatim:
  ansible.builtin.apt:
    name:
      - docker-ce
      - docker-ce-cli
      - containerd.io
      - docker-compose-plugin
    state: present

- name: Docker service enabled
  ansible.builtin.service:
    name: docker
    state: started
    enabled: true

nginx config iz templatea

- name: Deploy nginx site
  ansible.builtin.template:
    src: templates/app.conf.j2
    dest: /etc/nginx/sites-available/app.conf
    mode: "0644"
  notify: Reload nginx

handlers:
  - name: Reload nginx
    ansible.builtin.service:
      name: nginx
      state: reloaded

Tajne: ansible-vault

ansible-vault create group_vars/all/vault.yml
ansible-playbook site.yml --ask-vault-pass

U vault stavite lozinke, API tokene, privatne ključeve koje Ansible mora rasporediti. Ne commitajte plaintext secrets. Za CI koristite vault password iz secured secret storea, ne iz logova.

Ansible vs cloud-init vs Terraform

cloud-init odličan je za first-boot (user, ssh key, hostname), loš kao dugoročni config management. Terraform / OpenTofu pokriva providere, DNS, firewalle u cloudu, VM lifecycle. Vidi Terraform i OpenTofu. Ansible drži ponovljivo stanje unutar VM-a: paketi, datoteke, servisi.

Čest pattern: Terraform napravi VPS, cloud-init stavi SSH key, Ansible dovrši hardening i stack. Hardening checklistu držite usklađenom s Linux VPS hardening.

Organizacija repoa za mali tim

ansible/
  ansible.cfg
  inventory/hosts.yml
  group_vars/all/vault.yml   # encrypted
  site.yml
  templates/
  files/
# ansible.cfg (skraćeno)
[defaults]
inventory = inventory/hosts.yml
host_key_checking = True
retry_files_enabled = False
interpreter_python = auto_silent

Držite playbooke u Gitu. Produkcijski run dokumentirajte (tko, kada, koji tag/commit). Za ad-hoc „samo jednom“ popravke i dalje koristite SSH, ali rezultat vratite u playbook da se ne izgubi.

Česte greške

shell/command svuda znači gubitak idempotentnosti i čitljivosti. Playbook koji „radi samo prvi put“ (nema state, nema handlere) je zamka. Hardkodirani IP-evi i tajne u taskovima. Pokretanje kao root preko lozinke umjesto SSH key plus become. Ignoriranje --check i staging hosta prije produkcije.

Zaključak

Za 1 do 5 servera Ansible smanjuje ručni drift: inventory, mali playbookovi, moduli umjesto shella, vault za tajne. Kombinirajte s Terraformom za provisioniranje i cloud-initom za first boot. Ako želite da netko složi playbookove za vaš stack, DevOps usluge su tu.