web-dev-qa-db-fra.com

Comment spécifier une valeur de liste comme variable dans le fichier d'inventaire ansible?

J'ai besoin de quelque chose comme (fichier d'inventaire ansible):

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

Cependant, ansible ne reconnaît pas les "locales" comme une liste.

40
rmuller

Vous pouvez passer une liste ou un objet comme celui-ci:

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

Avec des variables complexes, il est préférable de les définir dans un fichier Host_vars plutôt que dans le fichier d'inventaire, car les fichiers Host_vars prennent en charge la syntaxe YAML.

Essayez de créer un Host_vars/127.0.0.1 fichier avec le contenu suivant:

timezone: Europe/Amsterdam
locales:
    - en_US
    - nl_NL
23
Lorin Hochstein

La réponse de Ryler est bonne dans ce cas spécifique, mais j'ai rencontré des problèmes en utilisant d'autres variantes avec le module de modèle.

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

Est son exemple original et fonctionne très bien.

Les variantes suivantes fonctionnent avec le modèle. Fondamentalement, s'il s'agit d'une chaîne, vous devez vous rappeler d'utiliser les guillemets internes ou la structure entière est analysée comme une chaîne unique. Si ce ne sont que des chiffres ou "Vrai" ou "Faux" (pas "oui") alors tout va bien. Dans cette variante, je ne pouvais pas le faire fonctionner avec le modèle s'il avait des guillemets externes.

Je n'ai pas fait de vérification exhaustive des cas d'utilisation interne qu'ils font et ne cassent pas autre que le module de modèle.

J'utilise 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"]'
10
Sparky

vous pouvez essayer de diviser

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

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