I föregående inlägg gick vi igenom grunderna i Ansible — inventory, playbooks och modules. Du kan nu automatisera uppgifter på dina maskiner. Men vad händer när din site.yml växer sig till 300 rader och du vill återanvända samma nginx-konfiguration i tre olika projekt? Då är det dags för Roles.
En Ansible Role är ett strukturerat sätt att paketera relaterade tasks, variabler, filer och mallar i en återanvändbar enhet. Tänk på det som ett npm-paket eller ett Python-bibliotek — fast för din infrastruktur.
Utan roles tenderar playbooks att växa sig stora och svårhanterliga. Du kopierar och klistrar in tasks mellan filer. Du hittar inte var du definierade den där variabeln. En kollega (eller du själv om tre månader) förstår ingenting.
Roles löser det genom att tvinga dig att strukturera din kod i väldefinierade mappar med tydliga ansvarsområden. En role för nginx. En för Docker. En för grundläggande serverkonfiguration. Kombinera dem sedan som byggklossar i dina playbooks.
En Role är i grunden bara en mapp med en specifik struktur som Ansible känner igen automatiskt. Du behöver inte ange sökvägar — Ansible hittar allt självt så länge du följer konventionen.
tasks/main.yml — lägg till resten när du behöver det.Ansible har ett inbyggt kommando som skapar hela strukturen åt dig:
Öppna roles/nginx/tasks/main.yml och fyll i dina uppgifter:
Handlers körs bara när en task triggar dem — perfekt för omstarter:
roles/ bredvid din playbook, eller i ~/.ansible/roles/ globalt.Det här förvirrar många i början. Ansible har en tydlig prioritetsordning för variabler, och defaults och vars spelar olika roller i den:
defaults/main.yml — Lägsta prioritet. Dessa värden används om inget annat anges. Det är dina "inbyggda standardvärden" som du tänker dig ska gå att överskriva utifrån.
vars/main.yml — Högre prioritet. Dessa är mer "fasta" värden för rolen som du inte vill att andra ska råka överskriva av misstag.
defaults/. Lägg interna konstanter i vars/.En av de kraftfullaste funktionerna i Roles är templates. Istället för att kopiera en statisk konfigfil kan du använda en Jinja2-mall som fylls i med dina variabler vid körning. Filer i templates/ har ändelsen .j2.
När Ansible kör template:-modulen ersätts {{ variabel }} med de faktiska värdena från dina defaults eller vars. Samma template — olika resultat beroende på miljö.
{% if nginx_ssl %} ... {% endif %}. Kraftfullt när konfigurationen ska skilja sig åt mellan servrar.Det riktiga värdet med Roles syns när du börjar kombinera dem. Här är ett mer realistiskt hemmalabb-exempel där en ny server sätts upp från grunden:
Ansible Galaxy är ett community-nav med tusentals färdiga Roles som du kan ladda ner och använda direkt. Behöver du installera Docker, konfigurera UFW-brandvägg, eller sätta upp en Postfix-mailserver? Det finns troligtvis redan en vältestad role för det.
Jeff Geerling (geerlingguy) är en av de mest kända Ansible-bidragsgivarna — hans roles för Docker, nginx, PHP och MySQL håller hög kvalitet och underhålls aktivt. Ett bra ställe att börja titta.
Ibland beror en role på en annan — din wordpress-role kräver kanske att både nginx och mysql är installerade först. Det kan du deklarera i meta/main.yml så att Ansible sköter ordningen automatiskt:
Här är ett konkret exempel på en common-role som du kan köra mot varje ny server i ditt hemmalab för att säkerställa en konsekvent grundkonfiguration:
admin_user och admin_ssh_key i din defaults/main.yml eller i ett gruppvariabelfil under group_vars/all.yml i ditt projektrot.// Snabbkoll: Vad har du lärt dig?
- En Role är en strukturerad mapp med tasks, handlers, templates, vars och defaults
- Skapa ny role-struktur snabbt med
ansible-galaxy init - Defaults kan överskridas utifrån — vars är mer "interna" och har högre prioritet
- Templates med Jinja2 skapar dynamiska konfigfiler från variabler
- Kombinera flera roles i samma playbook som byggklossar
- Ansible Galaxy har tusentals färdiga, välunderhållna roles att ladda ner
- Deklarera Role-beroenden i meta/main.yml — Ansible sköter ordningen
Med Roles börjar din Ansible-kod likna riktig mjukvaru-arkitektur — modulär, testbar och återanvändbar. Det är det som skiljer en Ansible-nybörjare från någon som faktiskt kan underhålla sin infrastruktur på lång sikt.
Lägg allt i Git. Namnge dina roles tydligt. Dokumentera variablerna i defaults/main.yml med kommentarer. Sedan kan du (och andra) sätta upp en ny server på minuter, inte timmar.