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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow