web-dev-qa-db-ja.com

ansible lineinfileでの引用

Ansibleでlineinfileを使用する場合、'"文字lineinfile: 'dest=/home/xyz state=present line="CACHES="default""'

CACHES=defaultただし、目的の出力はCACHES="default"

これを達成する方法は?

13
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 answer

18
tedder42

Ansible 1.9.2にはバグ( https://github.com/ansible/ansible/issues/10864 )が含まれており、行の先頭または末尾にエスケープされた二重引用符を挿入できません。

たとえば、次の

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

最初と最後の二重引用符が欠落します(エスケープした場合でも)。

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

このバグを補うために、開始と終了の二重引用符にPREFIXを追加し、その後削除することができます。

-名前:PREKUの最初と最後のエスケープ二重引用符で 'KUCF' 
 lineinfile:dest = "/ home/core/linetest" line = "KUCF \" main\"KUCF" 
 
-名前:削除 'KUCF' PREFIX 
 replace:dest = "/ home/core/linetest" regexp = "KUCF" replace = "" 

あなたに与えるはずです

#/ home/core/linetest 
 "main" 

選択したPREFIXが宛先ファイルのコンテキストで使用されないことを確認してください。一般的に、PREFIXが長くランダムであるほど、宛先ファイルの既存のコンテンツと衝突する可能性は低くなります。

または、Ansibleを最新のブランチにアップグレードすることもできます。

5
Lord Mosuma

置換されるコンテンツがプレイブックの上位の変数にある場合、引用符の代わりにエスケープ文字をエスケープする必要があるようです。

---
- 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.

これに続くだけですが、win_lineinfileを使用してWindowsボックスにバッチファイルを作成しようとすると、上記の例は機能しませんでした。ファイルは作成され、行は挿入されましたが、引用符とバックスラッシュはひどくフォーマットされていました。これは、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