Кавычки в ansible lineinfile

когда я использую lineinfile в анзибль не писать!--1-->, " символы lineinfile: 'dest=/home/xyz state=present line="CACHES="default""'

это CACHES=default но желаемый результат CACHES="default"

как этого добиться?

4 ответов


похоже, вы можете избежать кавычек:

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

что дает этот выход:

$ cat /tmp/xyz
CACHES="default"

вам не нужно бежать одинарные кавычки внутри двойных кавычек:

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

источник: спецификация YAML, stackoverflow ответ


Ansible 1.9.2 содержит ошибку (https://github.com/ansible/ansible/issues/10864), который не может вставить экранированные двойные кавычки в начале или конце строки.

Е. Г., следующие

- name: /home/core/linetest
  lineinfile: dest="/home/core/linetest" line="\"ma\"ok\"in\""

приведет к отсутствию первых и последних двойных кавычек (даже если вы избежали этого).

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

чтобы компенсировать эту ошибку, вы можете добавить префикс в начальные и конечные двойные кавычки, а затем удалить он.

- name: PREFIX first and last escaped double quotes with 'KUCF'
  lineinfile: dest="/home/core/linetest" line="KUCF\"main\"KUCF"

- name: remove 'KUCF' PREFIX
  replace: dest="/home/core/linetest" regexp="KUCF" replace=""

, который должен дать вам

#/home/core/linetest
"main"

убедитесь, что выбранный вами префикс никогда не будет использоваться в контексте файла назначения. В общем, чем длиннее и случайнее префикс, тем меньше вероятность его столкновения с существующим контентом в целевом файле.

кроме того, вы можете обновить свой Ansible до последней ветви.


Если заменяемый контент находится в переменной выше в playbook, кажется, что вам нужно избежать escape-символов вместо кавычек, что-то вроде этого

---
- hosts: tomcat

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

  tasks:

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

заканчивается такой строкой в результирующем файле

CLASSPATH="$CATALINA_HOME/bin/foo.jar"

просто следуйте этому, выше примеры не работали для меня при попытке создать пакетный файл в окне windows с помощью win_lineinfile. Файл создавался, строка вставлялась, но кавычки и обратные косые черты были отформатированы ужасно. Это было с ansible 2.4. То, что я, наконец, закончил делать по предложению коллег, было некоторым встроенным шаблоном 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\filesPOS Automation\Application Files\Bin\Automation.dll" > "c:\QAAutomation\results\nunit-console-output.txt" {% endraw %}