Was ist der Unterschied zwischen Standardwerten und Variablen in einer Ansible-Rolle?

151

Beim Erstellen einer neuen Ansible-Rolle erstellt die Vorlage sowohl varsein defaultsVerzeichnis als auch ein Verzeichnis mit einer leeren main.ymlDatei. Bei der Definition meiner Rolle kann ich Variablendefinitionen in eine dieser Rollen einfügen, die in meinen Aufgaben verfügbar sind.

Was ist der Unterschied zwischen dem Einfügen der Definitionen in defaultsund vars? Was soll hineingehen defaultsund was soll hineingehen vars? Ist es sinnvoll, beide für dieselben Daten zu verwenden?

Ich weiß, dass es einen Unterschied in der Priorität / Priorität zwischen den beiden gibt, aber ich würde gerne verstehen, was wohin gehen soll.

Angenommen, meine Rolle würde eine Liste von Verzeichnissen auf dem Zielsystem erstellen. Ich möchte eine Liste der zu erstellenden Standardverzeichnisse bereitstellen, möchte dem Benutzer jedoch erlauben, diese bei Verwendung der Rolle zu überschreiben.

So würde das aussehen:

---
- directories:
  - foo
  - bar
  - baz

Ich könnte dies entweder in die defaults/main.ymloder in die setzen vars/main.yml, aus Sicht der Ausführung würde es keinen Unterschied machen - aber wohin sollte es gehen?

nwinkler
quelle

Antworten:

113

Die Ansible-Dokumentation zur Priorität von Variablen fasst dies zusammen:

Wenn mehrere gleichnamige Variablen an verschiedenen Orten definiert sind, gewinnen sie in einer bestimmten Reihenfolge:

  • Zusätzliche Variablen (-e in der Befehlszeile) gewinnen immer
  • dann kommen Verbindungsvariablen, die im Inventar definiert sind (ansible_ssh_user usw.)
  • dann kommt "fast alles andere" (Befehlszeilenschalter, im Spiel befindliche Variablen, enthaltene Variablen, Rollenvariablen usw.)
  • Dann kommt der Rest der im Inventar definierten Variablen
  • Dann kommen Fakten über ein System
  • dann "Rollennormen", die am "standardmäßigsten" sind und an Priorität verlieren.

Angenommen, Sie haben eine "Tomcat" -Rolle, mit der Sie Tomcat auf einer Reihe von Webhosts installieren. Sie benötigen jedoch unterschiedliche Versionen von Tomcat auf einigen Hosts, müssen in anderen Fällen als unterschiedliche Benutzer ausgeführt werden usw. Die defaults/main.ymlDatei sieht möglicherweise so aus etwas wie das:

tomcat_version: 7.0.56
tomcat_user: tomcat

Da dies nur Standardwerte sind, bedeutet dies, dass sie verwendet werden, wenn diese Variablen für den betreffenden Host nirgendwo anders definiert sind. Sie können diese über Extra-Vars, über Fakten in Ihrer Inventardatei usw. überschreiben, um unterschiedliche Werte für diese Variablen anzugeben.

Bearbeiten: Beachten Sie, dass die obige Liste für Ansible 1.x ist. In Ansible 2.x wurde die Liste erweitert. Wie immer enthält die Ansible-Dokumentation eine detaillierte Beschreibung der Variablenpriorität für 2.x.

Bruce P.
quelle
4
Danke, das ist eine ausgezeichnete Seite - das habe ich gesucht. Ich gehe viel detaillierter darauf ein, was defaultsund was varsweiter unten eingegeben werden soll.
Nwinkler
42
Hervorzuheben ist: Rollenvars haben einen bösen Vorrang . Nach meiner Erfahrung sind sie höher als Vars, was wirklich ärgerlich ist.
Tedder42
5 Jahre später, aber ... Ich neige dazu, es so zu sehen: Rollenstandards sind Dinge, von denen ich erwarte, dass ein Benutzer der Rolle sie irgendwo in ihren Variablen überschreibt. Mit Role Vars (OTOH) kann ich das Hardcodieren von Informationen in einer Aufgabe vermeiden, sie werden jedoch wahrscheinlich nur zum Testen überschrieben und von einem Rollenbetreuer geändert. Beispielsweise würde ein anfänglicher Administrator-Benutzername standardmäßig verwendet, Abhängigkeitsversionen jedoch in vars.
ntwrkguru
41

In definierte Rollenvariablen varhaben eine sehr hohe Priorität - sie können nur überschrieben werden, indem sie in der Befehlszeile, in der spezifischen Aufgabe oder in einem Block übergeben werden. Daher sollten fast alle Ihre Variablen in definiert werden defaults.

In dem Artikel " Variable Priorität - Wo Sie Ihre Rollenvariablen platzieren " gibt der Autor ein Beispiel dafür, was eingegeben werden soll vars: Systemspezifische Konstanten, die sich nicht wesentlich ändern. So können Sie haben vars/debian.ymlund vars/centos.ymlmit den gleichen Variablennamen , aber unterschiedliche Werte und sind sie bedingt.

Chiborg
quelle
3

Grundsätzlich ist alles, was in „Rollenstandards“ (dem Standardordner innerhalb der Rolle) enthalten ist, am formbarsten und am leichtesten zu überschreiben. Alles im vars-Verzeichnis der Rolle überschreibt frühere Versionen dieser Variablen im Namespace. Die Idee, der hier zu folgen ist, ist, dass je expliziter Sie in den Geltungsbereich kommen, desto mehr Vorrang hat es, wenn die Befehlszeile - zusätzliche Variablen, die immer gewinnen. Host- und / oder Inventarvariablen können die Rollenstandards für sich gewinnen, jedoch nicht explizite Includes wie das vars-Verzeichnis oder eine include_vars-Task. doc

Pauljolsen
quelle
1

IMHO ist es unpraktisch und nicht sinnvoll , dass ansible Orte so hohe Priorität auf Konfiguration in Vars von Rollen . Die Konfiguration in vars/main.ymlund defaults/main.ymlsollte niedrig sein und wahrscheinlich die gleiche Priorität haben.

Gibt es Beispiele aus dem wirklichen Leben für Fälle, in denen wir diese Art von Verhalten wollen?

Es gibt Beispiele, die wir nicht wollen.

Hier ist zu beachten, dass die Konfiguration in defaults/main.ymlnicht dynamisch sein kann. Konfiguration in vars/main.ymlDose. So können Sie beispielsweise die Konfiguration für ein bestimmtes Betriebssystem und eine bestimmte Version dynamisch einbinden, wie in geerlingguy.postgresql gezeigt

Aber weil die Priorität in Ansible so seltsam und unpraktisch ist, muss geerlingguy Pseudovariablen einführen , wie in variables.yml zu sehen ist

- name: Define postgresql_packages.
  set_fact:
    postgresql_packages: "{{ __postgresql_packages | list }}"
  when: postgresql_packages is not defined

Dies ist ein konkretes Beispiel aus dem wirklichen Leben, das zeigt, dass der Vorrang unpraktisch ist.

Ein weiterer Punkt, den wir hier ansprechen müssen, ist, dass Rollen konfigurierbar sein sollen. Rollen können extern sein und von einer anderen Person verwaltet werden. In der Regel soll die Konfiguration in Rollen keine hohe Priorität haben.

weiß es
quelle
Dies sollte ein Kommentar sein, keine Antwort.
ntwrkguru
-4

Variablen und Standardeinstellungen gehen Hand in Hand. Hier ist ein Beispiel

-name: install package
 yum: name=xyz{{package_version}} state=present

In Ihrer Standarddatei hätten Sie Folgendes:

package_version: 123

Was ansible tun wird, ist, dass es den Wert von nimmt package_versionund ihn neben den Paketnamen setzt, damit er irgendwo wie folgt lautet:

-name: install package
 yum: name=xyz123 state=present

Auf diese Weise wird es installiert xyz123und nicht xyz123.4oder was auch immer sich im großen Repository von xyz befindet.

Am Ende wird es reichen yum install -y xyz123

Grundsätzlich sind die Standardeinstellungen die vorhandenen Werte. Wenn Sie keinen bestimmten Wert für die Variablen festlegen, kann der Speicherplatz nicht leer bleiben.

qubsup
quelle
Downvoted, weil es die Frage nicht anspricht. Offensichtlich defaultswerden sie verwendet, wenn es keine varsdefinierten gibt, aber die Antwort erklärt nicht, warum Sie einen Wert als den einen oder anderen definieren würden, was das OP gefragt hat. Vergleiche mit der folgenden Erklärung.
Thomas Hirsch