【问题标题】:blockinfile Ansible module does not insert at the given regexblockinfile Ansible 模块未在给定的正则表达式处插入
【发布时间】:2020-02-06 05:07:32
【问题描述】:

下面是test.conf,我希望在行结束标记之前添加一个块,即在以</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>'

我在在线 python 编辑器 https://regex101.com 上检查了我的 test.conf 和正则表达式 ^[^#]*&lt;\/VirtualHost&gt;,它得到了正确的匹配行。 在线正则表达式测试器和调试器:PHP、PCRE、Python、Golang 和 JavaScript 在线正则表达式测试器,带有 PHP、PCRE、Python、Golang 和 JavaScript 突出显示的调试器。 正则表达式101.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>

您能否建议我的剧本有什么问题以及如何让它发挥作用?

【问题讨论】:

    标签: regex insert ansible ansible-2.x


    【解决方案1】:

    这是因为 ansible specifies in the fine manual marker: 正是它所说的——它知道托管块从哪里开始和结束的方式。由于您选择使用在整个文件中找到但与托管块部分无关的文本,因此 ansible 只是耸了耸肩并给出了GIGO

    他们甚至有一个专门的警告,关于从marker: 中遗漏{mark} 模板参数:

    使用不带 {mark} 变量的自定义标记可能会导致在后续 playbook 运行时重复插入块。

    如果您将marker: 更改为marker: "#*#*#*" 之类的内容,它将开始工作......或者至少可以工作一次。

    【讨论】:

    • 我更改了marker: false 以使其工作,但是,它不是幂等的,并且每次我运行块都会在结束标记之前添加。任何解决方案将不胜感激。
    • 我想我已经说清楚了两件事:第一,不要使用marker: false 这意味着什么?!其次,您将希望照他们说的做并使用包含{mark} 的标记节,以便ansible 可以识别块并幂等地运行。我不明白你为什么还要指定marker:,因为它们的默认值已经以配置文件中的行注释字符开头
    • 所以我的理解是如果没有BEGINENDmarker 属性中的{mark},就没有幂等性。请确认理解是否正确,或者您是否可以分享一个我们没有标记BEGIN END但它是幂等的示例?
    猜你喜欢
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多