it-swarm.com.de

Ansible Playbooks vs Roles

Nach den Ansible-Dokumenten ist ein Playbook :

... die Basis für ein wirklich einfaches Konfigurationsmanagement und ein Multi-Machine-Deployment-System, wie es noch kein anderes gibt und das sich sehr gut für die Bereitstellung komplexer Anwendungen eignet.

Und wiederum laut denselben Dokumenten sind a Rollen :

... Möglichkeiten zum automatischen Laden bestimmter vars_files, Tasks und Handler basierend auf einer bekannten Dateistruktur. Das Gruppieren von Inhalten nach Rollen ermöglicht auch das einfache Teilen von Rollen mit anderen Benutzern.

Die Unterscheidung zwischen diesen und ihren verschiedenen Anwendungsfällen ist mir jedoch nicht sofort klar. Zum Beispiel, wenn ich mein /etc/ansible/hosts Datei sieht so aus:

[databases]
mydb01.example.org
mydb02.example.org

[mail_servers]
mymail01.example.org
mymail_dr.example.org

... was ist das dann "[databases] "entry ... a role? Oder der Name einer Playbook-YAML-Datei irgendwo? Oder etwas anderes?!?

Wenn mir jemand die Unterschiede erklären könnte, würde sich mein Verständnis von Ansible erheblich verbessern!

  • Spielbuch gegen Rolle gegen [databases] und ähnliche Einträge in /etc/ansible/hosts
  • Wenn Playbooks in YAML-Dateien definiert sind, wo sind dann Rollen definiert?
  • Abgesehen von der ansible.cfg Wie kann ich Ansible auf dem Ansible-Server mit verfügbaren Playbooks/Rollen hinzufügen/konfigurieren? Zum Beispiel, wenn ich ansible-playbook someplaybook.yaml, woher weiß Ansible, wo sich das Playbook befindet?
84
smeeb

Playbook vs Role vs [Datenbanken] und ähnliche Einträge in/etc/ansible/hosts

[databases] Ist ein einzelner Name für eine Gruppe von Hosts. Sie können mehrere Hosts mit einem einzigen Namen referenzieren.

Die Rolle besteht aus einer Reihe von Aufgaben und zusätzlichen Dateien, mit denen der Host für eine bestimmte Rolle konfiguriert werden kann .

Playbook ist eine Zuordnung zwischen Hosts und Rollen.

Beispiel aus Dokumentation beschreibt ein Beispielprojekt. Es enthält zwei Dinge:

  • Spielbücher. site.yml, webservers.yml, fooservers.yml Sind Spielbücher.
  • Rollen: roles/common/ Und roles/webservers/ Enthalten Definitionen der Rollen common und webservers entsprechend.

Im Playbook (webservers.yml) Haben Sie etwas wie:

---
- hosts: webservers <- this group of hosts defined in /etc/ansible/hosts, databases and mail_servers in example from your question
  roles: <- this is list of roles to assign to these hosts
     - common
     - webservers

Wenn Playbooks in YAML-Dateien definiert sind, wo sind dann Rollen definiert?

Sie werden in Verzeichnissen roles/* Definiert. Rollen werden hauptsächlich mit YAML-Dateien definiert, können aber auch Ressourcen beliebigen Typs enthalten (files/, templates/). Entsprechend Dokumentation ist die Rollendefinition folgendermaßen aufgebaut:

  • Wenn rolls/x/tasks/main.yml vorhanden ist, werden die darin aufgelisteten Aufgaben zum Spiel hinzugefügt
  • Wenn rolls/x/handlers/main.yml vorhanden ist, werden die darin aufgeführten Handler zum Spiel hinzugefügt
  • Wenn rolls/x/vars/main.yml vorhanden ist, werden die darin aufgelisteten Variablen zum Spiel hinzugefügt
  • Wenn rolls/x/meta/main.yml vorhanden ist, werden alle darin aufgeführten Rollenabhängigkeiten zur Liste der Rollen hinzugefügt (1.3 und höher).
  • Alle Kopieraufgaben können auf Dateien in den Rollen/x/files/verweisen, ohne sie relativ oder absolut pfaden zu müssen
  • Alle Skript-Tasks können auf Skripte in den Rollen/x/files/verweisen, ohne sie relativ oder absolut pfaden zu müssen
  • Alle Vorlagen-Tasks können auf Dateien in den Rollen/x/templates/verweisen, ohne sie relativ oder absolut pfaden zu müssen
  • Alle Include-Aufgaben können auf Dateien in den Rollen/x/tasks/verweisen, ohne sie relativ oder absolut pfaden zu müssen

Die wichtigste Datei ist roles/x/tasks/main.yml, Hier definieren Sie Aufgaben, die ausgeführt werden, wenn die Rolle ausgeführt wird.

Wie kann ich Ansible mit verfügbaren Playbooks/Rollen hinzufügen/konfigurieren, abgesehen von der ansible.cfg, die auf dem Ansible-Server gespeichert ist? Wenn ich zum Beispiel ansible-playbook someplaybook.yaml starte, woher weiß Ansible, wo sich das Playbook befindet?

$ ansible-playbook someplaybook.yaml

Sucht nach einem Playbook im aktuellen Verzeichnis.

$ ansible-playbook somedir/somedir/someplaybook.yaml

Sucht nach einem Playbook im Verzeichnis somedir/somedir/.

Es liegt in Ihrer Verantwortung, Ihr Projekt mit allen Playbooks und Rollen auf den Server zu stellen. Ansible hat damit nichts zu tun.

89
Yaroslav Admin

Playbook vs Role vs [Datenbanken] und ähnliche Einträge in/etc/ansible/hosts

Rollen sind eine Möglichkeit, Aufgaben in einem Container zusammenzufassen. Sie könnten eine Rolle für die Einrichtung von MySQL haben, eine andere für die Einrichtung von Postfix usw.

Ein Playbook definiert was passiert wo. Hier definieren Sie die Hosts (Hostgruppen, siehe unten) und die Rollen, die diesen Hosts zugewiesen werden.

[databases] Und die anderen Einträge in Ihrem Inventar sind Hostgruppen. Hostgruppen definieren eine Reihe von Hosts, auf denen ein Spiel ausgeführt wird.

Ein Spiel ist eine Reihe von Aufgaben oder Rollen (oder beides) in einem Spielbuch. In den meisten Fällen (und Beispielen) enthält ein Spielbuch nur ein einziges Spiel. Aber Sie können so viele haben, wie Sie möchten. Das heißt, Sie könnten ein Playbook haben, das die Rolle postfix für die Hostgruppe mail_servers Und die Rolle mysql für die Hostgruppe databases ausführt:

- hosts: mail_servers
  roles:
    - postfix

- hosts: databases
  roles:
    - mysql

Wenn Playbooks in YAML-Dateien definiert sind, wo sind dann Rollen definiert?

In Ansible ist so ziemlich alles in YAML definiert, was für Rollen und Playbooks zählt.

Wie kann ich Ansible mit verfügbaren Playbooks/Rollen hinzufügen/konfigurieren, abgesehen von der ansible.cfg, die auf dem Ansible-Server gespeichert ist? Wenn ich zum Beispiel ansible-playbook someplaybook.yaml starte, woher weiß Ansible, wo sich das Playbook befindet?

AFAIK Beim Aufruf von ansible-playbook Müssen Sie den Pfad zum Playbook angeben. Also würde ansible-playbook someplaybook.yaml Erwarten, dass sich someplaybook.yaml In Ihrem aktuellen Verzeichnis befindet. Sie können jedoch den vollständigen Pfad angeben: ansible-playbook /path/to/someplaybook.yaml

32
udondan

Es ist eine terminologische/semantische Frage. Es kann subjektiv sein, obwohl es eine Basisdefinition gibt.

Meine Ansicht ist wie folgt:

Jedes Konfigurationsmanagement-/Bereitstellungssystem verfügt über:

  1. source data - Daten, die zum Erstellen der Konfiguration des Zielhosts verwendet werden
  2. target data - Daten zur Identifizierung der Zielhosts
  3. config changes - Liste/Satz von Regeln/Aktionen, die wir mit source data Über den Zielhost anwenden, basierend auf target data

In Ansible Ausdrücken:

  1. source data - sind die verschiedenen Stellen, an denen Daten abgelegt werden können - group_vars, playbook, role, usw. Diese Stellen wirken sich auf die Priorität aus (wenn eine Variable vorhanden ist) Der gleiche Name wird an verschiedenen Stellen neu definiert. Es gibt sehr spezielle Regeln für den Wert der Variablen während der Ausführung von ansible/ansible-playbook
  2. target data - ist das Inventar (und es ist auch möglich, Inventar-/Hostgruppenvariablen innerhalb des Inventars zu definieren!)
  3. config changes - Ansible hat 4 Abstraktionsstufen:
    1. aufgabe - Einzelaktion
    2. aufgabenliste - Liste der Aktionen
    3. role - Liste von Aktionen (oder Listen), die nach demselben Thema gruppiert sind. In der Regel arbeiten alle Ziele auf demselben Host/derselben Hostgruppe
    4. playbook - Liste von Spielen, die jeweils auf einer möglicherweise anderen Hostgruppe ausgeführt werden und mehrere role s/task s/Aufgabenlisten (und spezielle Aufgaben wie handlers) anwenden

Unter dem Aspekt "Software" sollte die Rolle generisch genug sein, um wiederverwendet zu sein.

Auch in einigen (ziemlich großen) Organisationen werden "Rollen" von Gruppe A geliefert, während sie in von Gruppe B verwalteten Playbooks verwendet werden.

zusammenfassung

All dies ermöglicht die Gruppierung ähnlicher Konfigurationen - in eine role. Gruppieren verwandter Subsysteme/Komponenten zu einem playbook. Erwähnenswert ist auch, dass 1 YAML-Element in einem Playbook (einschließlich hosts: Und entweder oder tasks, pre_tasks, post_tasks, roles) heißt ein play

Nun zu deiner Frage:

Ja, es ist zunächst verwirrend.

Normalerweise verbindest du deinen source data Mit der Semantik deiner Rolle. Wenn du also siehst, dass die Rolle setup_db In einem Spiel auf eine verwandte Hostgruppe angewendet wird (zB db_hosts), Aber eine play kann über mehrere Hostgruppen laufen. Es ist nur eine Frage der Konvention vs. Flexibilität.

P.S.

Bitte schreiben Sie mir zurück, ob dies zur Verwirrung beigetragen oder geklärt hat. Vielen Dank.

9
mvk_il

Denken Sie auch daran, dass ein Playbook mehr als eine Rolle aufrufen kann, wenn eine Metadatei verwendet wird, die die verschiedenen Rollen betreffen soll.

Beispiel Playbook: dual_role-playbook.yml

- name: Some Action for two roles
  hosts: localhost

  vars_files:
    - roles/dual_role/meta/main.yml

  roles:
    - dual_role/container-1
    - dual_role/container-2

Das Schema für Rollenordner und Dateien sieht folgendermaßen aus:

dual_role-playbook.yml
  -- roles
     -- dual_role
        -- meta/main.yml
        -- container-1
           -- tasks/main.yml
           -- templates/template.j2
        -- container-2
           -- tasks/main.yml
           -- templates/template.j2
0
Jose H. Rosa

Einfach gesagt:

Ein Playbook ist wie das Hauptprogramm, es enthält vollständige Anweisungen zum Beenden des Jobs. Bei großen Projekten ist es jedoch nicht wünschenswert, tatsächlich jedes Detail darin zu vermerken. Du brauchst also eine Rolle.

Eine Rolle ist eine Unterroutine und erreicht gewöhnlich ein Ziel, z. Richten Sie einen Datenbankserver ein. Sie können es in das Verzeichnis roles/ Stellen oder Rollen von Drittanbietern herunterladen, indem Sie URIs in rolesfile.yml Bereitstellen und ansible-galaxy anfordern, um sie für Sie herunterzuladen.

Der [database] Ist eine Hostgruppe, die in der Inventardatei definiert ist und die Hosts auflistet, die zur Gruppe database gehören. Sie können auch eine Gruppe von Webservern angeben, indem Sie beispielsweise Folgendes angeben

[web]
web1.example.com
web2.example.com

Die Gruppe web oder database kann dann in Playbooks oder Rollen verwendet werden, um die anzuwendenden Hosts anzugeben.

Die Gruppen können auch in Befehl ansible verwendet werden, um Ad-hoc-Befehle auszuführen.

0
Ding-Yi Chen