ansible
Rollen
Suche…
Rollen verwenden
Ansible nutzt das Konzept der Rollen modularen Code besser zu ermöglichen und zu vermeiden , sich zu wiederholen.
Eine Rolle ist einfach eine Ordnerstruktur, aus der Ansible weiß, woher VAR-Dateien, Aufgaben und Handler geladen werden. Ein Beispiel könnte ungefähr so aussehen:
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
Sie können die Rolle dann mit einem einfachen Spielbuch verwenden, das wie folgt aussieht:
- hosts: webservers
roles:
- apache
Wenn Sie Ansible für dieses Playbook ausführen, werden alle Hosts in der webservers
und die oben definierte apache
Rolle ausgeführt. Dabei werden automatisch alle Standardvariablen für die Rolle tasks/main.yml
und alle in tasks/main.yml
enthaltenen tasks/main.yml
. Ansible kann auch nach bestimmten Dateitypen in rollenfreundlichen Speicherorten suchen:
Wenn die Rollen / x / Aufgaben / main.yml vorhanden sind, werden die darin aufgeführten Aufgaben zum Spiel hinzugefügt
Wenn die Rollen / x / handlers / main.yml vorhanden sind, werden die darin aufgeführten Handler zum Spiel hinzugefügt
Wenn die Rollen / x / vars / main.yml vorhanden sind, werden die darin aufgelisteten Variablen zum Spiel hinzugefügt
Wenn Rollen / x / meta / main.yml vorhanden sind, werden alle darin aufgeführten Rollenabhängigkeiten der Liste der Rollen hinzugefügt (1.3 und höher).
Jede Kopie, jedes Skript, jede Vorlage oder Include-Aufgaben (in der Rolle) können auf Dateien in den Rollen / x / {Dateien, Vorlagen, Aufgaben} / (Verzeichnis ist abhängig von der Aufgabe) verweisen, ohne sie relativ oder absolut zu pflegen
Rollenabhängigkeiten
meta/main.yml
von Rollen können Sie auch andere Rollen als Abhängigkeit definieren, indem Sie eine meta/main.yml
Datei mit einem dependencies
meta/main.yml
:
dependencies:
- role: common
Es ist auch möglich, einen Wert an einen Parameter / eine Variable in der abhängigen Rolle zu übergeben:
dependencies:
- { role: common, some_parameter: 3 }
Oder führen Sie die abhängige Rolle sogar bedingt aus:
dependencies:
- { role: common, some_parameter: 3 }
- { role: sshd, enable_sshd: false,
when: environment == 'production' }
Abhängige Rollen werden immer vor den von ihnen abhängigen Rollen ausgeführt. Sie werden auch nur einmal ausgeführt. Wenn zwei Rollen dieselbe als Abhängigkeit angeben, wird sie nur beim ersten Mal ausgeführt.
Stellen Sie sich die Rollen role1, role2 und role3 mit den folgenden meta/main.yml
's vor:
role1 / meta / main.yml:
dependencies:
- role: role3
role2 / meta / main.yml:
dependencies:
- role: role3
Bei der Ausführung von Rolle1 und Rolle2 im gleichen Spielbuch (wobei Rolle1 vor Rolle2 aufgerufen wurde), lautet die Ausführungsreihenfolge wie folgt:
role3 -> role1 -> role2
Sie können dieses Verhalten überschreiben, indem Sie allow_duplicates: yes
in meta/main.yml
von role1 und role2. Die resultierende Ausführungsreihenfolge wäre:
role3 -> role1 -> role3 -> role2
Trennen von verteilungsspezifischen Aufgaben und Variablen innerhalb einer Rolle
Verteilungsspezifische Aufgaben und Variablen lassen sich problemlos in verschiedene dedizierte .yml-Dateien aufteilen. Ansible hilft uns dabei, die Verteilung der Ziel-Hosts über {{ ansible_distribution }}
und {{ ansible_distribution_version }}
automatisch zu identifizieren. {{ ansible_distribution_version }}
wir nur die .yml-Dateien der Distribution entsprechend benennen.
Für Ubuntu Xenial würde die grundlegende Rolle dir tree dann ungefähr so aussehen:
role
├── tasks
│ ├── main.yml
│ └── Ubuntu16.04.yml
└── vars
└── Ubuntu16.04.yml
In die tasks/main.yml
können jetzt automatisch die richtigen Variablen und Aufgaben für die Verteilung der Ziel-Hosts tasks/main.yml
.
Aufgaben / 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"
In den tasks/Ubuntu16.06.yml
und vars/Ubuntu16.04.yml
können jetzt Aufgaben und Variablen für Ubuntu Xenial definiert werden.