Невозможно удалить запись из файла, используя Ansible регулярное выражение - PullRequest
0 голосов
/ 28 января 2020

Примечание: я ищу решение для 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

I wi sh to извлечь конкретный IP-адрес и сведения о файле, чтобы его можно было удалить из yaml с помощью атрибута state: absent. Таким образом, желаемое регулярное выражение должно возвращать следующее:

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))

enter image description here

Тот же регулярный оператор прекрасно работает с grep -Pzo и возвращает желаемое строка. Однако регулярное выражение не работает с модулем ansible lineinfile, поскольку не дает никаких результатов.

я хочу, чтобы это регулярное выражение или любое другое решение работало с Ansible, чтобы я мог удалить данный IP-адрес и сведения о файле из yaml

Ansible:

   - name: "Remove entry from file."
     lineinfile:
       path: "/app/filedet.yaml"
       regexp: "[^#](^10.9.9.111:)(.|\n)*^(?!( |\n))"
       state: absent

Подскажите, пожалуйста, в чем здесь проблема?

1 Ответ

0 голосов
/ 28 января 2020

Q: "I wi sh для извлечения IP-адреса и сведений о файле."

A: Используйте include_vars . Например,

    - include_vars:
        file: filedet.yml
        name: my_dict
    - debug:
        msg: "{{ my_dict['10.9.9.111'] }}"

give

    "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
...