web-dev-qa-db-fra.com

Citations dans le fichier de ligne ansible

Quand j’utilise lineinfile dans ansible, cela n’écrit pas ', " caractères lineinfile: 'dest=/home/xyz state=present line="CACHES="default""'

il donne CACHES=default.__ mais le résultat souhaité est CACHES="default"

Comment y parvenir?

14
eldos

il semble que vous puissiez échapper aux guillemets:

- lineinfile: dest=/tmp/xyz state=present line="CACHES=\"default\""

Cela donne cette sortie:

$ cat /tmp/xyz
CACHES="default"

Vous n'avez pas besoin d'échapper aux guillemets simples qui se trouvent entre guillemets doubles:

- lineinfile: dest=/tmp/xyz state=present line="CACHES=\"default\" foo='x'"
cat /tmp/xyz
CACHES="default" foo='x'

source: spécification YAML , stackoverflow answer

18
tedder42

Ansible 1.9.2 contient un bogue ( https://github.com/ansible/ansible/issues/10864 ) qui n'insère pas de guillemets d'échappement au début ou à la fin de la ligne.

Par exemple, les suivants

- nom: /home/core/linetest
 lineinfile: dest = "/ home/core/linetest" line = "\" ma\"ok \" dans\"" 

donnera la première et la dernière double guillemets manquants (même si vous y avez échappé).

 #/home/core/linetest 
 ma "ok" in 

Pour compenser ce bogue, vous pouvez ajouter un préfixe aux guillemets de début et de fin, puis le supprimer.

- nom: PREFIX premier et dernier échappés des guillemets doubles avec 'KUCF' 
 lineinfile: dest = "/ home/core/linetest" line = "KUCF \" main\"KUCF" 

- nom: supprime le préfixe 'KUCF' 
 replace: dest = "/ home/core/linetest" regexp = "KUCF" replace = "" 

qui devrait vous donner

 #/home/core/linetest 
 "main" 

Assurez-vous que votre PREFIX choisi ne sera jamais utilisé dans le contexte du fichier de destination. En général, plus le PREFIX est long et aléatoire, moins il risque d’affronter le contenu existant dans votre fichier de destination.

Vous pouvez également mettre à niveau votre Ansible vers la dernière branche.

4
Lord Mosuma

Si le contenu à substituer est dans une variable plus haute dans le livre de jeu, il semble que vous deviez échapper aux caractères d'échappement au lieu des guillemets, quelque chose comme ceci

---
- hosts: Tomcat

  vars:
    classpath: "CLASSPATH=\\\"$CATALINA_HOME/bin/foo.jar\\\""

  tasks:

    - lineinfile: dest="/Tomcat/bin/setenv.sh" line="{{ classpath }}" state=present

se termine avec une ligne comme celle-ci dans le fichier résultant

CLASSPATH="$CATALINA_HOME/bin/foo.jar"
1
Mark K.

Juste pour faire suite à cela, les exemples ci-dessus ne fonctionnaient pas pour moi lorsque j'essayais de créer un fichier batch sur une fenêtre Windows à l'aide de win_lineinfile. Le fichier était en cours de création, la ligne était insérée, mais les guillemets et les barres obliques inverses étaient terriblement formatés. C'était avec ansible 2.4. Ce que j’ai finalement fini par faire, à la suggestion de mes collègues, c’était un modèle en ligne jinja;

- name: insert our batch file contents
  win_copy:
    dest: C:\QAAutomation\files\posauto.bat
    force: yes
    content: |
      {% raw %}"C:\Program Files (x86)\NUnit 2.6.3\bin\nunit-console.exe" "C:\QAAutomation\files\1POS Automation\Application Files\Bin\Automation.dll" > "c:\QAAutomation\results\nunit-console-output.txt" {% endraw %}
0
MLindsay