ansible
Rollen
Zoeken…
Rollen gebruiken
Ansible gebruikt het concept van rollen om modulaire code beter toe te staan en jezelf niet te herhalen.
Een rol is gewoon een mappenstructuur waarvan Ansible weet waar vars-bestanden, taken en handlers moeten worden geladen. Een voorbeeld kan er ongeveer zo uitzien:
apache/
├── defaults
│ └── main.yml
├── files
│ ├── mod-pagespeed-stable_current_i386.deb
│ ├── mod-pagespeed-stable_current_i386.rpm
│ ├── mod-pagespeed-stable_current_amd64.deb
| └── mod-pagespeed-stable_current_x86_64.rpm
├── tasks
│ ├── debian.yml
│ ├── main.yml
│ └── redhat.yml
├── templates
│ ├── httpd.conf.j2
│ └── sites-available
│ └── virthualhost.conf.j2
└── vars
├── debian
└── redhat
Je kunt de rol vervolgens gebruiken met een eenvoudig speelboek dat er zo uitziet:
- hosts: webservers
roles:
- apache
Wanneer u Ansible tegen dit playbook uitvoert, zal het alle hosts in de webservers
targeten en de hierboven gedefinieerde apache
rol uitvoeren, automatisch alle standaardvariabelen voor de rol laden en alle taken in tasks/main.yml
. Ansible weet ook te zoeken naar bepaalde soorten bestanden op rolvriendelijke locaties:
Als rollen / x / taken / main.yml bestaat, worden de daarin vermelde taken aan het spel toegevoegd
Als er functies / x / handlers / main.yml bestaan, worden de daarin vermelde handlers aan het spel toegevoegd
Als er functies / x / vars / main.yml bestaan, worden de daarin vermelde variabelen aan het spel toegevoegd
Als rollen / x / meta / main.yml bestaat, worden alle daarin opgenomen rolafhankelijkheden toegevoegd aan de lijst met rollen (1.3 en hoger)
Elke kopie, script, sjabloon of taken (in de rol) kan verwijzen naar bestanden in rollen / x / {bestanden, sjablonen, taken} / (afhankelijk van de taak) zonder ze relatief of absoluut te hoeven paden
Rolafhankelijkheden
Met rollen kunt u ook andere rollen als afhankelijkheid definiëren door een meta/main.yml
bestand met een dependencies
te maken:
dependencies:
- role: common
Het is ook mogelijk om een waarde door te geven aan een parameter / variabele in de afhankelijke rol:
dependencies:
- { role: common, some_parameter: 3 }
Of voer de afhankelijke rol zelfs voorwaardelijk uit:
dependencies:
- { role: common, some_parameter: 3 }
- { role: sshd, enable_sshd: false,
when: environment == 'production' }
Afhankelijke rollen worden altijd uitgevoerd vóór de rollen die ervan afhankelijk zijn. Ze worden ook maar één keer uitgevoerd. Als twee rollen dezelfde zijn als hun afhankelijkheid, wordt deze alleen de eerste keer uitgevoerd.
Stel je de rollen role1, role2 en role3 voor met de volgende meta/main.yml
's:
role1 / meta / main.yml:
dependencies:
- role: role3
role2 / meta / main.yml:
dependencies:
- role: role3
Bij het uitvoeren van role1 en role2 in hetzelfde playbook (waarbij role1 wordt aangeroepen voor role2), zou de uitvoeringsvolgorde als volgt zijn:
role3 -> role1 -> role2
U kunt dit gedrag overschrijven door allow_duplicates: yes
in meta/main.yml
van role1 en role2. De resulterende uitvoeringsorder zou zijn:
role3 -> role1 -> role3 -> role2
Scheidingsspecifieke taken en variabelen scheiden binnen een rol
We kunnen distributie specifieke taken en variabelen gemakkelijk scheiden in verschillende speciale .yml-bestanden. Ansible helpt ons om de distributie van de doelhosts automatisch te identificeren via {{ ansible_distribution }}
en {{ ansible_distribution_version }}
, dus we moeten de toegewezen toegewezen .yml-bestanden gewoon een naam geven.
Voor Ubuntu Xenial zou de basisrol dir tree er dan ongeveer zo uitzien:
role
├── tasks
│ ├── main.yml
│ └── Ubuntu16.04.yml
└── vars
└── Ubuntu16.04.yml
Binnen de tasks/main.yml
we nu automatisch de juiste variabelen en taken voor de distributie van de doelhosts opnemen.
taken / main.yml
---
- name: include distribution specific vars
include_vars: "{{ ansible_distribution }}{{ ansible_distribution_version }}.yml"
- name: include distribution specific install
include: "{{ ansible_distribution }}{{ ansible_distribution_version }}.yml"
Binnen tasks/Ubuntu16.06.yml
en vars/Ubuntu16.04.yml
we nu respectievelijk taken en variabelen voor Ubuntu Xenial definiëren.