2013-09-02 11 views

risposta

65

È possibile passare un elenco o un oggetto come questo:

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

@ryanyuyu Non solo non è lo stesso codice della domanda, ma è anche la soluzione esatta che l'OP stava cercando. L'hai provato? Ryler ha fatto, così ho fatto io: e funziona. Questa dovrebbe essere la risposta accettata e non downvoted. – udondan

+4

Sì, puoi anche confermare che questo funziona. Questo è utile per l'utilizzo con una dichiarazione "with_items", ad esempio. Puoi persino creare oggetti simili a dict come questo. Lo uso per definire gli utenti e le password di autenticazione nginx in un file di inventario: nginx_auth = '[{"utente": "utente1", "pass": "pass1"}, {"utente": "utente2", "pass ":" pass2 "}] ' –

+0

È la soluzione più accurata possibile per i file ini?Cosa succede se hai 20+ elementi e 5 host con cui configurarlo? Sarei felice di saperlo ma questo funziona per ora. – JohnnyQ

20

Con le variabili complesse, è meglio definirle in un file host_vars piuttosto che nel file di inventario, poiché i file host_vars supportano la sintassi YAML.

provare a creare un file di host_vars/127.0.0.1 con il seguente contenuto:

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

Grazie, questo è il mio attuale modo di lavorare :) La tua risposta implica che non è possibile specificare una variabile di lista in un file di inventario (e --extra-vars)? – rmuller

+0

@rmuller Non so se sia possibile specificare le variabili di lista nei file ini o sulla riga di comando. Probabilmente otterrai una risposta più rapida se chiedi la mailing list. –

+0

@rmuller Mi piacerebbe anche saltare sul canale IRC#ansible, i ragazzi sono normalmente pronti ad aiutare :-) – jabclab

-2

È possibile personalizzato un filtro, per dividere stringa da elencare

Github ansible example mostrano come creare filtro personalizzato.

4

si può provare a dividere

#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

risposta di Ryler è buono in questo caso specifico, ma mi sono imbattuto in problemi con altre varianti con il modulo modello.

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

È il suo esempio originale e funziona bene.

Le seguenti varianti funzionano con il modello. Fondamentalmente se si tratta di una stringa, è necessario ricordare di utilizzare le virgolette interne o l'intera struttura viene analizzata come una singola stringa. Se sono solo numeri o "Vero" o "Falso" (non "sì"), allora stai bene. In questa variante non potrei farlo funzionare con template se avesse citazioni esterne.

Non ho eseguito un controllo completo dei casi di uso interno che fanno e non si rompono se non il modulo modello.

Sto usando 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

Questo ulteriore bit di informazioni mi ha aiutato a risolvere un fastidioso arbitrario problema di analisi delle variabili. Grazie! –

+0

Un po 'di informazioni extra: penso che le differenze si verifichino a causa dei diversi percorsi di parsing. In un [gruppo: vars] tutto viene passato direttamente come INI_PARSER-> YAML_PARSER, comprese le doppie virgolette. Quindi il parser YAML lo interpreta come una stringa. Dopo un nome host, passa a un parser simile a quello utilizzato con gli argomenti "equals style" su un modulo: INI_PARSER-> ANSIBLE_ARG_PARSER-> YAML_PARSER. In quest'ultimo caso ANSIBLE_ARG_PARSER interpreta la stringa con doppia citazione e passa il contenuto (senza virgolette) al parser YAML. – Sparky

Problemi correlati