我创建了一个剧本来强化我的 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