【问题标题】:Ansible regex escape dollar characterAnsible 正则表达式转义美元字符
【发布时间】:2016-03-01 08:18:10
【问题描述】:

我正在尝试使用 Ansible 修改配置文件中的 URL 值

$CONSOLE_URI = "http://172.18.18.103/controller/";

我正在使用 lineinfile 模块,但它不起作用,我试图用双反斜杠转义 $,但它也不起作用。

 - lineinfile: dest=/etc/log.conf regexp='^\\$CONSOLE_URI' line='$CONSOLE_URI=http://google.com';

【问题讨论】:

  • 你使用的是什么 Ansible 版本?
  • 我使用的是 Ansible 2.1.0 版
  • 所以直接从 github 开发分支,对吧?
  • 我已经从github克隆了,git clone git://github.com/ansible/ansible.git --recursive
  • 是的,那就是devel分支,不一定是稳定的。最新的 Ansible 版本是 2.0.1.0

标签: regex ansible ansible-2.x


【解决方案1】:

我认为您的正则表达式是正确的。我刚刚对此进行了测试,写入文件的行实际上包含引号。这是/etc/log.conf的内容:

'$CONSOLE_URI=http://google.com';

如果这是您的意图,我不相信,您当然需要在正则表达式中添加引号。

不要问我为什么单引号有时有效,有时无效。在这种情况下,您需要对 line 使用双引号,而对于 regexp,单引号起作用...

- lineinfile: dest=/etc/log.conf regexp='^\\$CONSOLE_URI' line="$CONSOLE_URI=http://google.com"

无论如何,我强烈建议使用 YAML 语法而不是 key=value 语法。我发现后者非常难以阅读,而 Ansible 完全是关于可读性的。在正确的 YAML 语法中,您还可以几乎完全丢弃引号,如果您使用包含单引号和双引号的更复杂的命令,这将有很大帮助,然后您必须再次转义。所以理想情况下(我认为)你的任务应该是这样的:

- lineinfile:
    dest: /etc/log.conf
    regexp: ^\$CONSOLE_URI
    line: $CONSOLE_URI=http://google.com

在这种情况下,您只需将$ 转义一次。

这是使用 Ansible 2.0.0.2 测试的。

PS:不确定您的行的 ; 是否应该在文件中。

【讨论】:

  • 感谢您的帮助和解释,它成功了!
  • 单引号有效。谢谢。
猜你喜欢
  • 2020-07-24
  • 2018-01-16
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 2012-03-31
  • 2023-03-18
  • 2010-12-22
相关资源
最近更新 更多