Ansibleでlineinfile
を使用する場合、'
、"
文字lineinfile: 'dest=/home/xyz state=present line="CACHES="default""'
CACHES=default
ただし、目的の出力はCACHES="default"
これを達成する方法は?
引用符をエスケープできるようです:
- 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
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を最新のブランチにアップグレードすることもできます。
置換されるコンテンツがプレイブックの上位の変数にある場合、引用符の代わりにエスケープ文字をエスケープする必要があるようです。
---
- 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"
これに続くだけですが、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 %}