当我在ansible中使用lineinfile
时,它不会写'
,"
个字符
lineinfile: 'dest=/home/xyz state=present line="CACHES="default""'
它正在给CACHES=default
但所需的输出为CACHES="default"
如何实现这一目标?
答案 0 :(得分:17)
看来你可以逃避引号:
- 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'
答案 1 :(得分:4)
Ansible 1.9.2包含一个错误(https://github.com/ansible/ansible/issues/10864),它无法在该行的开头或结尾插入转义双引号。
例如,以下
- name: /home/core/linetest lineinfile: dest="/home/core/linetest" line="\"ma\"ok\"in\""
会导致丢失第一个和最后一个双引号(即使你将其转义)。
#/home/core/linetest ma"ok"in
为了弥补这个错误,您可以在起始和结束双引号中添加PREFIX,然后将其删除。
- 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=""
应该给你
#/home/core/linetest "main"
确保您所选的PREFIX永远不会在目标文件的上下文中使用。通常,PREFIX越长越随机,它与目标文件中现有内容冲突的可能性就越小。
或者,您可以将Ansible升级到最新分支。
答案 2 :(得分:1)
如果要替换的内容位于剧本中较高的变量中,则似乎需要转义转义字符而不是引号,如下所示
---
- 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"
答案 3 :(得分:0)
只需对此进行跟进,上面的示例在尝试使用win_lineinfile在Windows框中创建批处理文件时对我不起作用。正在创建文件,正在插入行,但引号和反斜杠的格式非常糟糕。这是与ansible 2.4。根据同事的建议,我最终最终做的是一些内联的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 %}