Ansible 正则表达式转义美元字符
Ansible regex escape dollar character
我正在尝试使用 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';
我认为你的正则表达式是正确的。我刚刚对此进行了测试,写入文件的行实际上包含引号。这是/etc/log.conf
的内容:
'$CONSOLE_URI=http://google.com';
如果那是你的意图,我不相信,你当然需要在正则表达式中添加引号。
不要问我为什么单引号有时有效有时无效。在这种情况下,您需要对行使用双引号,而对于正则表达式,单引号有效...
- 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:不确定你的行的 ;
是否应该在文件中。
我正在尝试使用 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';
我认为你的正则表达式是正确的。我刚刚对此进行了测试,写入文件的行实际上包含引号。这是/etc/log.conf
的内容:
'$CONSOLE_URI=http://google.com';
如果那是你的意图,我不相信,你当然需要在正则表达式中添加引号。
不要问我为什么单引号有时有效有时无效。在这种情况下,您需要对行使用双引号,而对于正则表达式,单引号有效...
- 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:不确定你的行的 ;
是否应该在文件中。