модуль blockinfile Ansible не вставляется по заданному регулярному выражению - PullRequest
0 голосов
/ 06 февраля 2020

Ниже приведен файл test.conf, в котором я буду sh добавлять блок перед тегами закрытия строки, т.е. перед строкой, начинающейся с </VirtualHost>

cat test.conf

#
##<VirtualHost _default_:443>
<VirtualHost *:443>
#ProxyPreserveHost On
</VirtualHost>

Ниже моя книга игр для добавления блока:

cat /tmp/test.yml

---
- name: "Play 1"
  hosts: localhost
  tasks:

    - name: Debug
      blockinfile:
        path: "/tmp/test.conf"
        marker: "#"
        state: present
        block: |
            <FilesMatch "^.*\.(css|html?|js|pdf|txt|xml|xsl|gif|ico|jpe?g|png)$">
             Require all granted
            </FilesMatch>
        insertbefore: '^[^#]*</VirtualHost>'

Я проверил свой test.conf и регулярное выражение ^[^#]*<\/VirtualHost> онлайн python редактор https://regex101.com, и он соответствует правильной строке. Онлайн тестер и отладчик регулярных выражений: PHP, PCRE, Python, Golang и JavaScript Онлайн тестер регулярных выражений, отладчик с подсветкой для PHP, PCRE, Python, Golang и JavaScript. regex101.com

Файл изменяется, и блок вставляется в неправильном месте, как показано ниже:

TASK [Debug] ************************************************************************************************************************************************
changed: [localhost]

PLAY RECAP **************************************************************************************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

cat /tmp/test.conf

#
<FilesMatch "^.*\.(css|html?|js|pdf|txt|xml|xsl|gif|ico|jpe?g|png)$">
 Require all granted
</FilesMatch>
#
##<VirtualHost _default_:443>
<VirtualHost *:443>
#ProxyPreserveHost On
</VirtualHost>

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

1 Ответ

1 голос
/ 06 февраля 2020

Это потому, что ansible указывает в прекрасном руководстве , что marker: - это именно то, что написано - то, как он знает, где начинаются и заканчиваются управляемые блоки. Поскольку вы решили использовать текст, который находится в вашем файле, но не связан с разделами управляемого блока, ansible просто пожал плечами и дал GI GO.

У них даже есть специальное предупреждение об исключении параметра шаблона magi c {mark} из marker::

Использование пользовательского маркера без переменной {mark} может привести к многократной вставке блока в последующие playbook запускается.

Если вы измените marker: на что-то вроде marker: "#*#*#*", оно начнет работать ... или, по крайней мере, будет работать один раз.

...