2014-06-09 9 views
11

Gdy używam lineinfile w ansibla to nie jest pisanie ', " znaków lineinfile: 'dest=/home/xyz state=present line="CACHES="default""'Cytaty w ansibl lineinfile

to daje CACHES=default ale sygnał wyjściowy jest CACHES="default"

Jak to osiągnąć?

Odpowiedz

15

wydaje się można uciec cytaty:

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

Daje to wyjście:

$ cat /tmp/xyz 
CACHES="default" 

Nie trzeba uciekać apostrofów, które są wewnątrz cudzysłowach:

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

źródło: YAML specification, stackoverflow answer

+0

Bezpośrednie wyjście nie działa. Błąd składni został zgłoszony. – eldos

+0

@eldos, edytuj swoje pytanie i podaj błąd składni. Z powodzeniem wykonałem te linie na nowoczesnej wersji Ansible. – tedder42

1

Jeśli zawartość może być podstawiona jest w zmiennej wyżej w playbook, wydaje się, że trzeba uciec znaków ewakuacyjnych zamiast cytaty, coś w tym

--- 
- hosts: tomcat 

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

    tasks: 

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

kończy się podobną linią to w wynikowym pliku

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

ansibl 1.9.2 zawiera błąd (https://github.com/ansible/ansible/issues/10864), która zawiedzie wstawić uciekły cudzysłowów na początku lub na końcu linii.

przykład następujące

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

spowoduje brakuje pierwszy i ostatni cudzysłowia (nawet jeśli go uciec).

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

Aby zrekompensować ten błąd, można dodać PREFIX do początkowych i końcowych podwójnych cudzysłowów, a następnie usunąć.

 
- 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="" 

które powinny dać

 
#/home/core/linetest 
"main" 

Upewnij się, że wybrane PREFIKSÓW nigdy nie zostaną wykorzystane w kontekście pliku docelowego. Ogólnie rzecz biorąc, im dłuższy i bardziej losowy jest PREFIX, tym mniej prawdopodobne jest, że będzie on kolidował z istniejącą treścią w pliku docelowym.

Alternatywnie, możesz uaktualnić swój Ansible do najnowszego oddziału.

0

Po wykonaniu powyższych czynności powyższe przykłady nie zadziałały, gdy próbowałem utworzyć plik wsadowy w oknie Windows za pomocą metody win_lineinfile. Plik był tworzony, linia była wstawiana, ale cudzysłowy i odwrotne ukośniki zostały sformatowane okropnie. Było to z ansibla 2.4. To, co w końcu skończyłem robiąc sugestię dla robotników, było jakimś inline szablonem 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 %}