web-dev-qa-db-fra.com

Moyen approprié de concaténer des chaînes de variables

J'ai besoin de créer une nouvelle variable à partir du contenu d'autres variables. Actuellement, j'utilise quelque chose comme ceci:

- command: echo "{{ var1 }}-{{ var2 }}-{{ var3 }}"
  register: newvar

Le problème est:

  • L'utilisation de {{ var1 }}...{{ varN }} apporte des chaînes trop longues et un code très laid.
  • L'utilisation de {{ newvar.stdout }} un peu mieux mais déroutant.
  • L'utilisation de set_fact module caches fait entre les exécutions. Ce n'est pas approprié pour moi.

N 'y a-t-il pas une autre solution?

33
Timofey Stolbov

Bonne question. Mais je pense qu'il n'y a pas de bonne réponse qui corresponde à vos critères. Le mieux que je puisse penser est d'utiliser un fichier vars supplémentaire.

Une tâche comme celle-ci:

- include_vars: concat.yml

Et en concat.yml vous avez votre définition:

newvar: "{{ var1 }}-{{ var2 }}-{{ var3 }}"
27
udondan

Comme les chaînes sont des listes de caractères en Python, nous pouvons concaténer des chaînes de la même manière que nous concaténons des listes (avec le signe +):

{{ var1 + '-' + var2 + '-' + var3 }}

Si vous voulez diriger la chaîne résultante vers un filtre, assurez-vous de mettre les bits entre parenthèses:

par exemple. Pour concaténer nos 3 vars et obtenir un hash sha512:

{{ (var1 + var2 + var3) | hash('sha512') }}

Note: cela fonctionne sur Ansible 2.3. Je ne l'ai pas testé sur les versions précédentes.

20
user187557

Aussi simple que de rejoindre des listes dans python lui-même.

ansible -m debug -a msg="{{ '-'.join(('list', 'joined', 'together')) }}" localhost

localhost | SUCCESS => {
  "msg": "list-joined-together" }

Fonctionne de la même manière en utilisant des variables:

ansible -m debug -a msg="{{ '-'.join((var1, var2, var3)) }}" localhost
10
user9996458