it-swarm.com.ru

Цитаты в ответном файле lineinfile

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

он дает CACHES=default но желаемый вывод - CACHES="default"

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

14
eldos

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

- 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

18
tedder42

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

Например, следующее

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

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

 #/Главная/ядро ​​/ linetest 
 Ма "ОК" в 

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

- name: PREFIX первые и последние экранированные двойные кавычки с помощью 'KUCF' 
 lineinfile: dest = "/ home/core/linetest" line = "KUCF \" main\"KUCF" 

- name: удалить 'KUCF' PREFIX 
 replace: dest = "/ home/core/linetest" regexp = "KUCF" replace = "" 

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

 #/Главная/ядро ​​/ linetest 
 "Главный" 

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

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

4
Lord Mosuma

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

Просто продолжение этого, приведенные выше примеры не работали для меня, когда я пытался создать командный файл в окне 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 %}
0
MLindsay