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?
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
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.
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"
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 %}