Beim Erstellen einer neuen Ansible-Rolle erstellt die Vorlage sowohl vars
ein defaults
Verzeichnis als auch ein Verzeichnis mit einer leeren main.yml
Datei. 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 defaults
und vars
? Was soll hineingehen defaults
und 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.yml
oder in die setzen vars/main.yml
, aus Sicht der Ausführung würde es keinen Unterschied machen - aber wohin sollte es gehen?
defaults
und wasvars
weiter unten eingegeben werden soll.In definierte Rollenvariablen
var
haben 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 werdendefaults
.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 habenvars/debian.yml
undvars/centos.yml
mit den gleichen Variablennamen , aber unterschiedliche Werte und sind sie bedingt.quelle
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
quelle
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.yml
unddefaults/main.yml
sollte 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.yml
nicht dynamisch sein kann. Konfiguration invars/main.yml
Dose. So können Sie beispielsweise die Konfiguration für ein bestimmtes Betriebssystem und eine bestimmte Version dynamisch einbinden, wie in geerlingguy.postgresql gezeigtAber weil die Priorität in Ansible so seltsam und unpraktisch ist, muss geerlingguy Pseudovariablen einführen , wie in variables.yml zu sehen ist
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.
quelle
Variablen und Standardeinstellungen gehen Hand in Hand. Hier ist ein Beispiel
In Ihrer Standarddatei hätten Sie Folgendes:
Was ansible tun wird, ist, dass es den Wert von nimmt
package_version
und ihn neben den Paketnamen setzt, damit er irgendwo wie folgt lautet:Auf diese Weise wird es installiert
xyz123
und nichtxyz123.4
oder 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.
quelle
defaults
werden sie verwendet, wenn es keinevars
definierten 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.