Ansible replace. 替换部分正则表达式

Ansible replace. 替换部分正则表达式

我创建了一个剧本来强化我的 Linux 服务器。该过程的一部分是替换默认配置文件中的 umask。因此,我创建了这个任务:

- name: Change the umask for default profiles
  replace:
    path: "{{ profile_file }}"
    regexp: "(\s+)umask"
    replace: "\1 027"
  loop:
    - /etc/profile
    - /etc/bashrc
  loop_control:
    loop_var: profile_file

问题在于它不具备幂等性。每次我运行任务时,它都会替换 umask,即使它是正确的。如果我删除 (\s+),umask 就会写在行首,而不是正确的位置,这当然不是功能问题,但它会破坏文件的可读性。

所以,我想做的是这样的:

regexp: "(\s+)umask 002"
replace: "<something> 027"

哪里可以只给我 umask使用空格然后添加 027。我对 RegExp 非常不熟悉,并且对 Python 中的正则表达式一无所知,因此任何帮助都将不胜感激。

答案1

尝试使用https://regex101.com这是一个学习/调试正则表达式的绝佳工具。

Ansibles 文档针对替换行上的捕获组指出了以下内容: The string to replace regexp matches. May contain backreferences that will get expanded with the regexp capture groups if the regexp matches. If not set, matches are removed entirely.

这应该是可能的,但是问题中的陈述与(\s+)umask您在组 1 中捕获的任何空格匹配,并且umask。因此替换行实际上只包含捕获组一加中的空格027

您很可能希望这样做(\s+umask).*,它将捕获任何空格并将 umask 放入捕获组 1 中。在替换行上,您可以使用\1 027。小心.*匹配整行的其余部分。这可能不是您想要做的。

尽管这不是问题的一部分,但我认为用 4 位数字而不是 3 位数字来指定 umask 会更好。

正则表达式可能看起来像这样,对于该用例来说非常具体: regexp: (\s+umask\s+)([0-7]{4}|[0-7]{3}) replace: \1 0027

相关内容