lineinfile 是否支持多行匹配?

Are multiline matches supported in lineinfile?

我想匹配(并删除或替换为一个注释行)一行:

daemon.*;mail.*;\
        news.err;\
        *.=debug;*.=info;\
        *.=notice;*.=warn       |/dev/xconsole

我试图在 lineinfile 中将它们与 daemon(?:.|\n)*xconsole 匹配,但匹配似乎没有发生:添加了替换行,但旧行仍然存在:

  - name: remove xconsole from rsyslog.conf
    lineinfile:
      dest: /etc/rsyslog.conf
      regexp: daemon(?:.|\n)*xconsole
      state: absent
      # also tried to add the next line to replace with a comment
      #line: "# removed by ansible"

是否支持这样的块?

注意:我知道 blockinfile 非常适合管理分隔块的 addition/removal。我不相信他们使用非 ansible 插入的块(通过正则表达式匹配)。

否,lineinfile逐行搜索表达式,参见module's source code

如果您需要 remove/replace 文本,请使用 replace 模块 – 它使用多行正则表达式,例如:

 - name: remove xconsole from rsyslog.conf
    replace:
      dest: /etc/rsyslog.conf
      # ensure regex is lazy!
      regexp: daemon[\S\s]*?xconsole
      replace: "# removed by ansible"