2013-09-02 4 views

Antwort

65

Sie eine Liste oder ein Objekt wie dies passieren kann:

[example] 
127.0.0.1 timezone="Europe/Amsterdam" locales='["en_US", "nl_NL"]' 
+11

@ryanyuyu Es ist nicht nur nicht der gleiche Code wie in der Frage, es ist auch die genaue Lösung, die das OP gesucht hat. Hast du es getestet? Ryler tat, ich auch: Und es funktioniert. Dies sollte die akzeptierte Antwort sein und nicht abgelehnt werden. – udondan

+4

Ja, kann auch bestätigen, dass das funktioniert. Dies ist zum Beispiel für die Verwendung mit einer "with_items" -Anweisung gut. Sie können sogar dict-ähnliche Objekte wie diese erstellen. Ich benutze dies für die Definition von Nginx Authentication Benutzern und Passwörtern in einer Inventardatei: nginx_auth = '[{"user": "user1", "pass": "pass1"}, {"user": "user2", "pass ":" pass2 "}] ' –

+0

Ist das die sauberste Lösung für Ini-Dateien?Was ist, wenn Sie 20 + Items und 5 Hosts haben, um es zu konfigurieren? Würde mich freuen zu wissen, aber das funktioniert für jetzt. – JohnnyQ

20

Bei komplexen Variablen ist es am besten, sie in einer host_vars-Datei und nicht in der Inventardatei zu definieren, da host_vars-Dateien die YAML-Syntax unterstützen.

Versuchen Sie, eine host_vars/127.0.0.1 Datei mit folgendem Inhalt zu erstellen:

timezone: Europe/Amsterdam 
locales: 
    - en_US 
    - nl_NL 
+0

Danke, das ist meine derzeitige Arbeitsweise :) Bedeutet Ihre Antwort, dass Sie keine Listenvariable in einer Inventardatei (und --extra-vars) angeben können? – rmuller

+0

@rululer Ich weiß nicht, ob es möglich ist, Listenvariablen in Ini-Dateien oder in der Befehlszeile anzugeben. Sie werden wahrscheinlich eine schnellere Antwort erhalten, wenn Sie auf der Ansible-Mailingliste nachfragen. –

+0

@ruller Ich würde auch empfehlen, auf den #ansible IRC Channel zu springen, die Jungs dort sind normalerweise schnell zu helfen :-) – jabclab

-2

Sie können benutzerdefinierte ein Filter, aufzuspalten String

zur Liste

Github ansible example zeigen, wie benutzerdefinierte Filter erstellen.

4

Sie versuchen

#inventory file 
[example] 
127.0.0.1 timezone="Europe/Amsterdam" locales="en_US","nl_NL" 

#role file 
--- 
- debug: msg="{{ item }}" 
    with_items: locales.split(',') 
4

Ryler Antwort aufspalten kann in diesem speziellen Fall gut, aber ich lief in Probleme mit den anderen Varianten mit Vorlagenmodul.

[example] 
127.0.0.1 timezone="Europe/Amsterdam" locales='["en_US", "nl_NL"]' 

Ist sein Originalbeispiel und funktioniert gut.

Die folgenden Variationen funktionieren mit Vorlage. Wenn Sie eine Zeichenkette verwenden, müssen Sie grundsätzlich daran denken, die internen doppelten Anführungszeichen zu verwenden, oder die gesamte Struktur wird als einzelne Zeichenkette analysiert. Wenn es nur Zahlen oder "True" oder "False" (nicht "Ja") ist, dann geht es Ihnen gut. In dieser Variante konnte ich es nicht mit Vorlage arbeiten, wenn es externe Anführungszeichen hatte.

Ich habe keine umfassende Überprüfung der internen Anwendungsfälle, die sie tun und nicht andere als das Vorlagenmodul zu brechen.

Ich benutze Ansible 2.2.1.

[example:vars] 
# these work 
myvar1=["foo", "bar"] 
myvar2=[1,2] 
myvar3=[True,False] 

# These fail, they get interpreted as a single string. 
myvar4=[yes, no] 
myvar5=[foo,bar] 
myvar6='["foo", "bar"]' 
+0

Dieses zusätzliche Bit der Info half mir bei der Behandlung eines lästigen Variablenparsingproblems. Vielen Dank! –

+0

Ein paar zusätzliche Informationen: Ich denke, dass die Unterschiede wegen der verschiedenen Parsing-Routen auftreten. In einer [group: vars] wird alles direkt als INI_PARSER-> YAML_PARSER übergeben, inklusive Anführungszeichen. Also interpretiert der YAML-Parser es als eine Zeichenfolge. Nach einem Hostnamen geht es durch einen ähnlichen Parser zu denen, die mit 'equals style'-Argumenten zu einem Modul verwendet werden: INI_PARSER-> ANSIBLE_ARG_PARSER-> YAML_PARSER. Im letzteren Fall interpretiert ANSIBLE_ARG_PARSER die doppelte Anführungszeichenfolge und übergibt den Inhalt (ohne Anführungszeichen) an den YAML-Parser. – Sparky

Verwandte Themen