注意:我正在寻找Ansible的解决方案。这是问题描述:
我有一个文件filedet.yml,如下所示,但是实时该Yaml可能包含更多IP和文件详细信息。
---
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: absent
属性将其从yaml中删除。因此,所需的正则表达式应返回以下内容:
10.9.9.111:
/tmp/test.jar:
hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954e
/tmp/best.jar:
hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb
我决定将开始模式设为'10 .9.9.111'并进行搜索,直到没有空格或换行符为止,这意味着直到到达下一个IP。
我准备了以下正则表达式,它在http://regex101.com上显示了正确的所需完整文本匹配。查看快照。
下面的正则表达式查询:
[^#](^10.9.9.111:)(.|\n)*^(?!( |\n))
相同的正则表达式可以与grep -Pzo
一起正常工作,并返回所需的字符串。但是,正则表达式无法与ansible的lineinfile
模块一起使用,因为它未产生任何结果。
我希望此正则表达式或任何其他解决方案与Ansible一起使用,以便可以从Yaml中删除给定的IP及其文件详细信息
Ansible:
- name: "Remove entry from file."
lineinfile:
path: "/app/filedet.yaml"
regexp: "[^#](^10.9.9.111:)(.|\n)*^(?!( |\n))"
state: absent
您能告诉我这里是什么问题吗?
Q:“我希望提取IP和文件详细信息。”
A:使用include_vars。例如
- include_vars:
file: filedet.yml
name: my_dict
- debug:
msg: "{{ my_dict['10.9.9.111'] }}"
给予
"msg": {
"/tmp/best.jar": {
"hash": "e6df90d38fa86f0e289f73d79cd2cfd2a29954eb"
},
"/tmp/test.jar": {
"hash": "e6df90d38fa86f0e289f73d79cd2cfd2a29954eb"
}
}
Q:“从文件中删除条目。”
A:使用模板。例如
$ 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
给予
$ cat filedet.yml
10.8.8.44:
/tmp/conf/extra/httpd-ssl.conf:
hash: 1746f03d57491b27158b0d3a48fca8b5fa85c0c2
/tmp/conf/httpd.conf:
hash: 1746f03d57491b27158b0d3a48fca8b5fa85c0c2
注意:
为此目的使用lineinfile
是个坏主意
问题中的数据不是有效的YAML。关键在重复
10.9.9.111:
/tmp/test.jar:
hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb
/tmp/test.jar:
hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb