19

当我lineinfile在 ansible 中使用时,它不是写作'"字符 lineinfile: 'dest=/home/xyz state=present line="CACHES="default""'

它正在提供,CACHES=default 但所需的输出是CACHES="default"

如何做到这一点?

4

4 回答 4

24

看来您可以转义引号:

- 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 答案

于 2014-06-09T21:14:08.540 回答
6

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
可以在

为了弥补这个错误,您可以在开始和结束双引号中添加一个 PREFIX,然后将其删除。

- 名称:前缀第一个和最后一个转义双引号,带有“KUCF”
  lineinfile: dest="/home/core/linetest" line="KUCF\"main\"KUCF"

- 名称:删除“KUCF”前缀
  替换:dest="/home/core/linetest" regexp="KUCF" replace=""

这应该给你

#/home/core/linetest
“主要的”

确保您选择的 PREFIX 永远不会在目标文件的上下文中使用。一般来说,前缀越长越随机,它与目标文件中现有内容冲突的可能性就越小。

或者,您可以将 Ansible 升级到最新的分支。

于 2015-09-01T17:46:30.400 回答
2

如果要替换的内容位于剧本中较高的变量中,则似乎您需要转义转义字符而不是引号,如下所示

---
- 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"
于 2015-01-05T19:39:54.350 回答
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 %}
于 2017-10-18T00:54:06.787 回答