Regex 无法使用Ansible正则表达式从文件中删除条目
注:我正在寻找Ansible的解决方案。以下是问题说明: 我有一个文件filedet.yml,如下所示,但实时此yaml可能包含更多IP和文件详细信息Regex 无法使用Ansible正则表达式从文件中删除条目,regex,grep,ansible,regex-negation,regex-group,Regex,Grep,Ansible,Regex Negation,Regex Group,注:我正在寻找Ansible的解决方案。以下是问题说明: 我有一个文件filedet.yml,如下所示,但实时此yaml可能包含更多IP和文件详细信息 --- 10.9.9.111: /tmp/test.jar: hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb /tmp/best.jar: hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb 10.8.8.44: /tmp/co
---
10.9.9.111:
/tmp/test.jar:
hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb
/tmp/best.jar:
hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb
10.8.8.44:
/tmp/conf/extra/httpd-ssl.conf:
hash: 1746f03d57491b27158b0d3a48fca8b5fa85c0c2
/tmp/conf/httpd.conf:
hash: 1746f03d57491b27158b0d3a48fca8b5fa85c0c2
我希望提取特定的IP和文件详细信息,以便使用state:缺席
属性将其从yaml中删除。因此,所需的正则表达式应返回以下值:
10.9.9.111:
/tmp/test.jar:
hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954e
/tmp/best.jar:
hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb
我决定将开始模式设置为“10.9.9.111”,搜索直到没有空格或换行符,这意味着直到它到达下一个IP
我准备了下面的正则表达式,它在上显示了正确的、所需的全文匹配。请参阅快照
正则表达式查询如下:
[^#](^10.9.9.111:)(.|\n)*^(?!( |\n))
同样的正则表达式可以很好地处理grep-Pzo
并返回所需的字符串。但是,正则表达式无法使用ansible的lineinfle
模块,因为它不会生成任何结果
我希望这个正则表达式或任何其他解决方案与Ansible一起工作,这样我就可以从yaml中删除给定的IP及其文件详细信息
Ansible:
- name: "Remove entry from file."
lineinfile:
path: "/app/filedet.yaml"
regexp: "[^#](^10.9.9.111:)(.|\n)*^(?!( |\n))"
state: absent
你能告诉我这里有什么问题吗
问:“我希望提取IP和文件详细信息。”
A:使用。比如说
- include_vars:
file: filedet.yml
name: my_dict
- debug:
msg: "{{ my_dict['10.9.9.111'] }}"
$ cat filedet.yml.j2
{% for item in my_dict_keys %}
{{ item }}:
{{ my_dict[item]|to_nice_yaml|indent(2) }}
{% endfor %}
给予
Q:“从文件中删除条目。” A:使用模板。比如说
- include_vars:
file: filedet.yml
name: my_dict
- debug:
msg: "{{ my_dict['10.9.9.111'] }}"
$ cat filedet.yml.j2
{% for item in my_dict_keys %}
{{ item }}:
{{ my_dict[item]|to_nice_yaml|indent(2) }}
{% endfor %}
下面的任务
- set_fact:
my_dict_keys:
- "10.8.8.44"
- template:
src: filedet.yml.j2
dest: filedet.yml
给予
注:
- 为此目的使用
是个坏主意lineinfle
- 问题中的数据不是有效的YAML。关键是重复
在POSIX*RES中,正则表达式中间的回旋匹配一个规则的回旋;它失去了作为一个特殊角色的意义。IIRC a POSIX grep不能执行多行匹配
grep
一次只检查一行;没有办法用这个工具来指定应该跨越换行符的匹配项。这能回答你的问题吗?我不是在寻找grep的解决方案,而是在寻找一个能与Ansiblegrep-Pzo一起工作的正则表达式。但是我怎样才能让它与Ansible的Lineinfle一起工作呢?你能让模板包含所有ip和文件详细信息吗?除了我想在本例中删除的10.9.9.111No之外。我不能。模板是很好的,因为它是。相反,你可以先测试你想要什么,然后用所有相关的细节更新你的问题。你能看一看吗?这里有一篇新的文章,描述精妙:
10.9.9.111:
/tmp/test.jar:
hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb
/tmp/test.jar:
hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb