Кавычки в доступном линейном файле

Когда я использую lineinfile в ansible, он не пишет ', " символов lineinfile: 'dest=/home/xyz state=present line="CACHES="default""'

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

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


person eldos    schedule 09.06.2014    source источник


Ответы (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

person tedder42    schedule 09.06.2014
comment
прямое экранирование не работает. Возникает синтаксическая ошибка. - person eldos; 10.06.2014
comment
@eldos, пожалуйста, отредактируйте свой вопрос и укажите синтаксическую ошибку. Я успешно выполнил эти строки в современной версии Ansible. - person tedder42; 10.06.2014

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 до последней ветки.

person Lord Mosuma    schedule 01.09.2015

Если заменяемое содержимое находится в переменной выше в 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"
person Mark K.    schedule 05.01.2015

В качестве дополнения к этому, приведенные выше примеры не сработали для меня при попытке создать пакетный файл в окне Windows с помощью win_lineinfile. Файл создавался, строка вставлялась, но кавычки и обратные слэши были отформатированы ужасно. Это было с ansible 2.4. В конце концов, по предложению коллеги я сделал несколько встроенных шаблонов дзиндзя;

- 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 %}
person MLindsay    schedule 18.10.2017