#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