Ansible lineinfile не распознает регулярное выражение

#regex #macos #ansible

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

Вопрос:

Файл для редактирования

 #CentOS-Base.repo
#
[base]
name=CentOS-$releasever - Base

[updates]
name=CentOS-$releasever - Updates

[contrib]
name=CentOS-$releasever - Contrib
 

Задача Ansible

 - name: PostgreSQL | Yum | exclude old version
  remote_user: root
  sudo: no
  lineinfile: dest=/etc/yum.repos.d/CentOS-Base.repo
              line='exclude=postgresql*'
              insertafter={{ item }}
  with_items:
    - ^[base]
    - ^[updates]
 

Результаты:

Строка добавляется в файл только один раз, и она добавляется в EOF, а не в следующей строке после [base] и [updates] .

Я совершенно уверен, что регулярное выражение является допустимым (проверено на https://pythex.org / ).

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

1. согласно вашей ссылке ^[base] не соответствует [base] , но [base] соответствует.

Ответ №1:

Вместо lineinfile module рассмотрите возможность использования ini_file module . Таким образом, вам не придется ломать голову над выражениями регулярных выражений.

Управляйте (добавляйте, удаляйте, изменяйте) отдельными настройками в файле в стиле INI без необходимости управлять файлом в целом, скажем, шаблоном или сборкой. Добавляет недостающие разделы, если они не существуют.

Пример:

 # Ensure "fav=lemonade is in section "[drinks]" in specified file
- ini_file: dest=/etc/conf section=drinks option=fav value=lemonade mode=0600 backup=yes

- ini_file: dest=/etc/anotherconf
            section=drinks
            option=temperature
            value=cold
            backup=yes
 

Ответ №2:

Использование lineinfile несколько раз для одного и того же файла — это запах кода в Ansible.Вместо этого используйте copy или template .

Однако вот один из способов, которым вы можете это сделать. Обратите внимание, что это больше строк, чем было бы командой file copy .

 - name: PostgreSQL | Yum | exclude old version
  lineinfile: dest=test.repo
              line="1nexclude=postgresql*"
              insertafter="[{{ item }}]"
              regexp="([{{ item }}])"
              backrefs=true
  with_items:
    - base
    - updates