无法使用Ansible正则表达式从文件中删除条目

注意:我正在寻找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))

无法使用Ansible正则表达式从文件中删除条目

同一个正则表达式可以与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

请问这里是什么问题?

zhuanjieben 回答:无法使用Ansible正则表达式从文件中删除条目

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
本文链接:https://www.f2er.com/2700773.html

大家都在问