2014-06-09 8 views
11

Quando uso lineinfile in ansible non sta scrivendo ', " caratteri lineinfile: 'dest=/home/xyz state=present line="CACHES="default""'Citazioni in lineinfile ansible

sta dando CACHES=default ma l'output desiderato è CACHES="default"

come raggiungere questo obiettivo?

risposta

15

risulta si può sfuggire le virgolette:

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

Che dà questo output:

$ cat /tmp/xyz 
CACHES="default" 

Non hanno bisogno di fuggire virgolette singole che si trovano all'interno virgolette doppie:

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

fonte: YAML specification, stackoverflow answer

+0

L'escape diretto non funziona. Errore di sintassi. – eldos

+0

@eldos, si prega di modificare la domanda e dare l'errore di sintassi. Ho eseguito con successo quelle linee su una versione moderna di Ansible. – tedder42

1

Se il contenuto da sostituire è in una variabile più in alto nel playbook, sembra che avete bisogno di sfuggire i caratteri di escape al posto delle citazioni, qualcosa di simile

--- 
- hosts: tomcat 

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

    tasks: 

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

finisce con una linea come questo nel file risultante

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

Ansible 1.9.2 contiene un bug (https://github.com/ansible/ansible/issues/10864), che non riesce a inserire le virgolette doppie sfuggiti all'inizio o alla fine della linea.

ad esempio il seguente

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

si tradurrà in mancante prima e l'ultima virgolette doppie (anche se è sfuggito).

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

Per compensare questo errore, è possibile aggiungere un prefisso al di inizio e fine virgolette, e successivamente rimuoverlo.

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

che dovrebbe dare

 
#/home/core/linetest 
"main" 

Assicurarsi che il prefisso scelto non verrà mai utilizzato nel contesto del file di destinazione. In generale, più PREFIX è lungo e più casuale, meno è probabile che si scontrerà con il contenuto esistente nel file di destinazione.

In alternativa, è possibile aggiornare il proprio Ansible all'ultima filiale.

0

Solo a seguito di questo, gli esempi di cui sopra non ha funzionato per me quando si tenta di creare un file batch su una finestra di windows utilizzando win_lineinfile. Il file veniva creato, la riga veniva inserita, ma le virgolette e le barre retroverse erano formattate in modo terribile. Questo era con 2.4. Quello che alla fine ho finito per fare un suggerimento da co-lavoratori è stato un po 'di jinja templating in linea;

- 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 %}