Как добавить элемент, если он еще не присутствует в списке?

#regex #ansible

#регулярное выражение #ansible

Вопрос:

Я пытаюсь добавить путь к списку путей, разделенных запятыми, в текстовом файле через Ansible.

В моем текстовом файле есть (или нет) свойство paths , которое содержит список путей. т.Е. пути = пути 1, пути 2, пути
3 Я хочу быть уверенным, что путь (pathX) присутствует в списке, независимо от его позиции, и добавить его в конец, если нет (или создать новую строку пути= pathX, если нет строки)

Я безуспешно пытался использовать модуль lineinfile с отрицательным прогнозом регулярного выражения

     lineinfile:
      path: /myfile
      state: present
      regexp: '^(paths =([s,] (?!pathX)[w=/-."] )*)([s,]*[w=/-."] )*$'
      line: '13, pathX'
      backrefs: yes
  

когда путей нет, я хочу вставить paths = pathX
когда paths = path1 я хочу иметь paths = path1, pathX
когда paths = path1, pathX я хочу иметь paths = path1, pathX
когда paths = pathX, path1 я хочу иметь paths = pathX, path1 (или path1, pathX что-то еще)

Ответ №1:

Это немного грубо, но это работает:

 ---
- name: Fix line
  hosts: localhost
  connection: local

  tasks:
  - name: get line from file
    command: grep '^paths = ' file
    register: grep
    failed_when: false

  - name: Add line if not present
    lineinfile:
      path: file
      state: present
      line: "paths = pathX"
    when: grep.rc != 0

  - name: Ensure pathX is in line
    lineinfile:
      path: file
      regexp: '^paths = path1'
      state: present
      line: "paths = path1, pathX"
    when: "'paths = path1' in grep.stdout"

  - name: Ensure path1 is in line
    lineinfile:
      path: file
      regexp: '^paths = pathX'
      state: present
      line: "paths = pathX, path1"
    when: "'paths = pathX' in grep.stdout"
  

Вам не обязательно делать все в одной задаче.

Комментарии:

1. Я знаю ;), но я хотел узнать, как работает регулярное выражение с отрицательным прогнозом, и может (или нет) решить мою проблему