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.