2016-08-25 1 views
2

Wie erhalte ich den Wert einer Variablen aus dem Inventar, wenn die Variable entweder in der Inventardatei oder im Verzeichnis group_vars enthalten sein könnte?Ansible: Wie erhält man den Wert einer Variablen aus der Inventar- oder group_vars-Datei?

Zum Beispiel könnte region=place-a irgendwo in der Inventardatei oder in einer Datei in der group_vars sein. Ich möchte, dass ein Befehl in der Lage ist, diesen Wert mithilfe von ansible oder etwas abrufen diesen Wert abrufen. wie:

$ ansible -i /somewhere/production/web --get-value region 
place-a 

Das würde mir mit Bereitstellungen helfen und wissen, in welcher Region bereitgestellt wird.

.

Eine längere Erklärung zu klären, sieht mein Inventar Struktur wie folgt aus:

/somewhere/production/web 
/somewhere/production/group_vars/web 

Der Inhalt mit den Variablen der Inventardatei, /somewhere/production/web wie folgt aussieht:

[web:children] 
web1 ansible_ssh_host=10.0.0.1 
web2 ansible_ssh_host=10.0.0.2 

[web:vars] 
region=place-a 

Ich konnte die Wert aus der Inventardatei durch einfaches Parsen der Datei. etwa so:

$ awk -F "=" '/^region/ {print $2}' /somewhere/production/web 
place-a 

Aber diese Variable in der group_vars Datei sein könnte, auch. Zum Beispiel:

$ cat /somewhere/production/group_vars/web 
region: place-a 

Oder es könnte wie ein Array aussehen:

$ cat /somewhere/production/group_vars/web 
region: 
    - place-a 

ich nicht suchen wollen und alle möglichen Dateien zu analysieren.

Hat Ansible eine Möglichkeit, die Werte zu erhalten? So ähnlich wie mit --list-hosts?

$ ansible web -i /somewhere/production/web --list-hosts 
    web1 
    web2 

Antwort

0

Zunächst einmal müssen Sie in schauen, wie Variable Vorrang in ansible arbeitet.

Die genaue Reihenfolge ist in der documentation10 definiert. Hier eine Zusammenfassung Auszug:

Im Grunde alles, was in den „Rolle defaults“ (die Standardwerte Ordner in der Rolle) geht, ist das formbar und leicht außer Kraft gesetzt. Alles im vars-Verzeichnis der Rolle überschreibt frühere Versionen dieser Variablen im Namespace. Die Idee hier zu folgen ist, dass die expliziter Sie in Geltungsbereich erhalten, desto mehr Vorrang hat es mit Befehlszeile -e Extra Vars immer gewinnen. Host und/oder Inventar Variablen können Rollenstandards übernehmen, aber nicht explizit wie das vars-Verzeichnis oder eine include_vars-Task.

Damit geräumt, der einzige Weg, um zu sehen, welchen Wert eine Variable Mitnahmen ist die debug Aufgabe wie folgt zu verwenden:

- name: debug a variable 
    debug: 
    var: region 

Dadurch wird der Wert der Variablen region ausdrucken.

Mein Vorschlag wäre, einen einzigen Wert Typen zu erhalten, entweder ein string oder ein list zu verhindern Verwirrung über tasks in verschiedenen playbooks.

Man könnte so etwas wie folgt verwenden:

- name: deploy to regions 
    <task_type>: 
    <task_options>: <task_option_value> 
    // use the region variable as you wish 
    region: {{ item }} 
    ... 
    with_items: "{{ regions.split(',') }}" 

In diesem Fall, dass Sie eine Variable regions=us-west,us-east durch Komma getrennt haben könnten. Die with_items Anweisung würde es über die , teilen und die Aufgabe für alle Regionen wiederholen.

Schließlich, NO gibt es keine CLI-Option, um den Wert von Variablen zu erhalten.

+0

> "NEIN es gibt keine CLI-Option, um den Wert von Variablen zu erhalten." Schade, aber danke. Davon wollte ich überzeugt sein. – user3358549

0

Eine andere einfache Lösung für die Variable durch cli von ansible bekommen dies sein könnte:

export tmp_file=/tmp/ansible.$RANDOM ansible -i <inventory> localhost -m copy -a "content={{ $VARIABLE_NAME }} dest=$tmp_file" export VARIBALE_VALUE=$(cat $tmp_file) rm -f $tmp_file

Sieht ziemlich hässlich, aber ist wirklich hilfreich.

0

Die CLI-Version ist wichtig für Leute, die versuchen, ansible mit anderen Systemen zu verbinden. Aufbauend auf der Nutzung des copy Modul an anderer Stelle, wenn Sie eine POSIX haben mktemp und eine Kopie der jq lokal, dann ist das hier ein bash Einzeiler, die den Trick aus der CLI:

export TMP=`mktemp` && ansible localhost -c local -i inventory.yml -m copy -a "content={{hostvars['SOME_HOSTNAME']}} dest=${TMP}" >/dev/null && cat ${TMP}|jq -r .SOME_VAR_NAME && rm ${TMP} 

es Breaking down

# create a tempfile 
export TMP=`mktemp` 

# quietly use Ansible in local only mode, loading inventory.yml 
# digging up the already-merged global/host/group vars 
# for SOME_HOSTNAME, copying them to our tempfile from before 
ansible localhost --connection local \ 
    --inventory inventory.yml --module-name copy \ 
    --args "content={{hostvars['SOME_HOSTNAME']}} dest=${TMP}" \ 
    > /dev/null 

# CLI-embedded ansible is a bit cumbersome. After all the data 
# is exported to JSON, we can use `jq` to get a lot more flexibility 
# out of queries/filters on this data. Here we just want a single 
# value though, so we parse out SOME_VAR_NAME from all the host variables 
# we saved before 
cat ${TMP}|jq -r .SOME_VAR_NAME 
rm ${TMP} 
Verwandte Themen