首页 > 解决方案 > 用正则表达式替换在 Ansible 中不起作用(替换)

问题描述

我是一个新手,Ansible我正在尝试编写一个剧本来检查一行,如果它没有被注释掉,那就去做。这是我要注释掉的行//$data['refresh_timeout'] = $data['Timeout'];

我检查了 regex101.com 中的搜索语法,regexp似乎工作正常。看来我的问题出在replace. 这是我的代码:

replace:
  path: /var/www/html/application/controllers/welcome.php
  regexp: r'^\s+(\$data\[\'refresh_timeout\'\].*)$'
  replace: r'^\s+// (\$data\[\'refresh_timeout\'\]\1'

我一直在2台服务器上进行测试,在mytest-server2该行已经被注释掉,但在执行时ansible不修改文件mytest-server1(没有注释的行)。这就是我所拥有的:

`TASK [Gathering Facts]************************************************ 
task path: /home/myself/ansible/wui_refresh.yml:5
ok: [mytest-server2] 
ok: [mytest-server1]
META: ran handlers`

`TASK [Check whether /welcome.php contains "// $data['refresh_timeout']"] *****
task path: /home/myself/ansible/wui_refresh.yml:23
ok: [mytest-server1] => {"changed": false, "msg": ""}
ok: [mytest-server2] => {"changed": false, "msg": ""}
META: ran handlers
META: ran handlers`

`PLAY RECAP ***************************************************************
mytest-server2 : ok=2    changed=0    unreachable=0    failed=0
mytest-server1 : ok=2    changed=0    unreachable=0    failed=0`

提前感谢您的帮助

标签: ansible

解决方案


下面的任务完成了这项工作

- replace:
    path: /var/www/html/application/controllers/welcome.php
    regexp: '^\$data\[''refresh_timeout''\] = \$data\[''Timeout''\];'
    replace: '//$data[''refresh_timeout''] = $data[''Timeout''];'

$ cat welcome.php
$data['refresh_timeout'] = $data['Timeout'];

$ cat welcome.php
//$data['refresh_timeout'] = $data['Timeout'];

笔记

  • 单引号样式用于regexpreplace。单引号必须转义 ('')。
  • regexp使用 Python 正则表达式。特殊字符必须转义(\$ ...)
  • 如果行首有一个或多个空格regexp必须以 '^\s+

推荐阅读