web-dev-qa-db-fra.com

Concatez plusieurs variables et chaînes dans un livre de jeu

J'essaie la concaténation multiple en préformant with_items pour la section de destination.

En ce moment, cela ressemble à ceci:

- name: create app except+lookup
  copy: content="" dest="{{ dir.comp ~ '/config/con2dd/' ~ item.name ~ 'File.txt' }}" force=no group=devops owner=devops mode: 0755
  with_items:
...

Je reçois:

We could be wrong, but this one looks like it might be an issue with
missing quotes.  Always quote template expression brackets when they 
start a value. For instance:            

    with_items:
      - {{ foo }}

Should be written as:

    with_items:
      - "{{ foo }}"

J'ai essayé plusieurs approches mais aucune n'a abouti à quelque chose qui fonctionne.

Est-il possible de concaténer les variables avec les chaînes?

7
Moshe

Ne mélangez pas les syntaxes YAML pures et clé = valeur pour les paramètres. Et utilisez toujours la syntaxe YAML pour les arguments complexes:

- name: create app except+lookup
  copy:
    content: ""
    dest: "{{ dir.comp }}/config/con2dd/{{ item.name }}File.txt"
    force: no
    group: devops
    owner: devops
    mode: 0755
  with_items:
  ...
7
Konstantin Suvorov

Vous ne citez pas la valeur associée à la clé copy. Pour que cela se produise, le caractère first doit être une citation double (ou simple). L'exemple donné dans les commentaires le fait correctement, mais n'est pas explicite à ce sujet. Une fois qu'un scalaire commence par un non guillemet (les vôtres commencent par les guillemets c de content apparaissant dans le scalaire n'auront plus aucune signification particulière.

En raison d'un bogue dans l'analyseur utilisé par Ansible, le : (espace de deux-points) dans ce scalaire (mode: 0755) pose problème, vous devez mettre entre guillemets tout le scalaire et échapper aux guillemets qui s'y trouvent:

copy: "content=\"\" dest=\"{{ dir.comp ~ '/config/con2dd/' ~ item.name ~ 'File.txt' }}\" force=no group=devops owner=devops mode: 0755"

ou bien utilisez des guillemets simples (qui ont des règles d'échappement différentes:

copy: 'content="" dest="{{ dir.comp ~ ''/config/con2dd/'' ~ item.name ~ ''File.txt'' }}" force=no group=devops owner=devops mode: 0755'

Vous pouvez tester vous-même les scalaires sur this l'analyseur YAML en ligne, il a le même bogue que ce qui empêche Ansible de ne pas analyser votre YAML correctement.

This parser, gère le : dans scalaire correctement et ne produira pas d'erreur avec votre entrée (mais il a d'autres problèmes).

2
Anthon