Ansible with_dict l'utilisation du modèle
J'ai la tâche suivante:
- name: copy server.xml
template: src=server.xml dest=/var/containers/{{ item.key }}/conf
with_dict: containers
Et j'ai également ajouté les conteneurs dictionnaire dans mon group_vars
containers:
frontend:
http_port: 8080
backend:
http_port: 8081
Enfin voici les extrait de server.xml
<Connector port="{{ http_port }}" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
Ce que je veux est que la http_port est utilisé dans le modèle de module. Mais à la place je reçois et d'erreur:
fatale: [localhost] => {'msg': "AnsibleUndefinedVariable: Une ou plusieurs variables indéfinies: 'http_port' n'est pas définie", "échoué": True}
Est-ce possible? Comment puis-je tirer parti d'un article de valeurs à des variables de substitution?
vous avez besoin d'énumérer au moins un extrait de
Je ne sais pas comment portable cette solution est, mais le fait de remplacer {{ http_port }} avec {{ item.de la valeur.http_port }} résout le problème
Je suis assez sûr que c'est la façon standard de le faire autant que je sache.
server.xml
; c'est ce qui est défectueux.Je ne sais pas comment portable cette solution est, mais le fait de remplacer {{ http_port }} avec {{ item.de la valeur.http_port }} résout le problème
Je suis assez sûr que c'est la façon standard de le faire autant que je sache.
OriginalL'auteur user1432403 | 2014-09-24
Vous devez vous connecter pour publier un commentaire.
À l'aide de
{{ item.value.http_port }}
est exactement la bonne solution.Lorsque vous passez with_dict, il parcourt la tâche de passage de chacun des éléments dans vos contenants dictionnaire comme
{{ item }}
, où l'élément a une clé et quelles que soient les valeurs que l'élément de dictionnaire contient - dans votre cas, les paires clé/valeur, où les clés sont http_port et les valeurs sont ces deux nombres entiers - mais vous pouvez passer au sérieux complexes imbriquées les dictionnaires où il devient encore plus important à l'accès des choses avec la{{ item.value.http_port }}
syntaxe que vous est venu avec.La chose à se méfier que vous obtenez plus complexe modèle d'utilisation est de savoir comment mélanger des trucs et définir les valeurs par défaut et utiliser si-états lorsque vous avez quelques variables supplémentaires de modèle pour un hôte (ou d'un conteneur, ou quoi que ce soit), mais pas l'autre.
À s'élancer sur elle, de lire sur Jinja2, la langue Ansible interprète modèles. Un bon exemple serait quelque chose comme la distribution de fichiers via le protocole SSL sur votre frontend ici, mais pas le backend. Utilisez la syntaxe comme
{{ foo | default('bar') }}
pour éviter Ansible mettre en colère à propos de vous essayer d'utiliser des variables non définies, et si-états, afin de s'assurer que vous êtes seulement de templating les trucs dont vous avez besoin.Un croquis - dire que vous avez:
Dans ce cas, vous imaginant avait une tâche de copie du fichier de clés sur le système de fichiers si nécessaire, vous pouvez utiliser quelque chose le long des lignes de:
Heureux de template!
OriginalL'auteur nikobelia