[英]Ansible lineinfile duplication using insertafter
我正在尝试使用ansibles lineinfile
将条目添加到我的/etc/hosts
文件中。 我希望逻辑是,如果找到条目127.0.0.1 mysite.local
则不执行任何操作,否则将其插入到127.0.1.1
行127.0.1.1
127.0.0.1 localhost
127.0.1.1 mypc
127.0.0.1 mysite.local
我可以在部分工作后进行插入,但是似乎实际的正则表达式搜索无法找到现有条目,因此我不断重复插入127.0.0.1 mysite.local
文档确实会说;
修改线时,正则表达式通常应匹配线的初始状态以及被线替换后的状态,以确保幂等。
但是我不确定这对我的正则表达式如何适用。 目前我的戏是;
- name: Add the site to hosts
lineinfile:
path: /etc/hosts
# Escape special chars
regex: "^{{ domain|regex_escape() }}"
line: "127.0.0.1 {{ domain }}"
insertafter: '127\.0\.1\.1'
firstmatch: yes
become: yes
domain
是mysite.local
。
我已经看了这个答案,但是我很确定自从文档状态以来,我不能使用backrefs
。
这个标志稍微改变了模块的操作。 insertbefore和insertafter将被忽略,并且如果regexp与文件中的任何地方都不匹配,则文件将保持不变。
我试过了;
regex: '127\.0\.0\.1\s+?{{ domain|regex_escape() }}'
也没有运气
根据此链接 ,lineinfile扫描文件并一次应用正则表达式一行,这意味着您不能使用浏览整个文件的正则表达式。 我不熟悉lineinfile工具,但是如果可以使用上面链接中使用的“替换”工具,则可以根据需要使用以下Python正则表达式进行匹配:
\A((?:(?!127\.0\.0\.1\s)[\s\S])*?)(?:\Z|127\.0\.0\.1\s+(?!{{ domain|regex_escape() }})\S+\n|(127\.0\.1\.1\s+\S+(?![\s\S]*\n127\.0\.0\.1\s)\n))
替换为:“ \\ 1 \\ 2127.0.0.1 {{域}} \\ n”
非捕获组处理三种不同的情况:
第二种情况是通过避免匹配“ 127.0.0.1”条目(如果已经存在)来解决幂等性。
似乎是firstmatch: yes
正在打破事情。 它适用于以下任务(我将空格替换为Tab以获得漂亮的外观,但空格也可以正常工作):
- name: Add the site to hosts
lineinfile:
path: /etc/hosts
# Escape special chars
regexp: "{{ domain|regex_escape() }}"
line: "127.0.0.1{{ '\t' }}{{ domain }}"
insertafter: '127\.0\.1\.1'
医生说:
insertafter:...如果将正则表达式同时传递给regexp和insertafter,则仅在找不到与regexp匹配的情况下才使用insertafter。
任务中的正则表达式扩展为
regex: ^mysite\.local
找不到此正则表达式,因为没有以“ mysite.local”开头的行。 因此,执行insertafter并在127.0.1.1之后插入“行”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.