ansible lineinfile正则表达式多行

Fat*_*ari 7 regex apache ansible

我正在尝试使用Ansible编辑apache.conf.这是我的conf的一部分:

# Sets the default security model of the Apache2 HTTPD server. It does
# not allow access to the root filesystem outside of /usr/share and /var/www.
# The former is used by web applications packaged in Debian,
# the latter may be used for local directories served by the web server. If
# your system is serving content from a sub-directory in /srv you must allow
# access here, or in any related virtual host.
<Directory />
        Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>

<Directory /usr/share>
        AllowOverride None
        Require all granted
</Directory>

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

#<Directory /srv/>
#       Options Indexes FollowSymLinks
        AllowOverride All
#       Require all granted
#</Directory>
Run Code Online (Sandbox Code Playgroud)

我想改变这个块

<Directory /var/www/>
            Options Indexes FollowSymLinks
            AllowOverride None
            Require all granted
    </Directory>
Run Code Online (Sandbox Code Playgroud)

<Directory /var/www/>
            Options Indexes FollowSymLinks
            AllowOverride All
            Require all granted
    </Directory>
Run Code Online (Sandbox Code Playgroud)

将AllowOverride从None设置为All.我正在使用这个安塞的任务

- name: change htaccess support
  lineinfile:
    dest: /etc/apache2/apache2.conf
    regexp: '\s<Directory /var/www/>\n\sOptions Indexes FollowSymLinks\n\sAllowOverride'
    line: "AllowOverride All"
  tags:
    - test
Run Code Online (Sandbox Code Playgroud)

但是,AllowOverride All始终添加到文件末尾.什么是正确的正则表达式模式来完成这项工作.我不使用ansible模板因为我只改变了一行.

ail*_*nlv 5

我设法通过略微提高@ mattyoung-redhatmatt的答案来做到这一点.事实证明,replace模块处理多行正则表达式和反向引用就好了:

- name: AllowOverride all
  replace:
    dest=/etc/apache2/apache2.conf
    regexp='(<[dD]irectory /var/www/>[^<]*)AllowOverride None'
    replace='\1AllowOverride All'
    backup=yes
  sudo: yes
  notify:
    - restart apache
Run Code Online (Sandbox Code Playgroud)


yda*_*coR 1

Ansible 的lineinfile模块正是这样做的,它处理文件中的单行,并且不支持多行

这给您留下了几个选项来解决这个问题。

与 lineinfile 周围最棘手的事情一样,您最好用模板替换它。

或者,您可以尝试使用blockinfile角色首先删除 ( state=absent) 以下块:

        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
Run Code Online (Sandbox Code Playgroud)

之后<Directory /var/www/>插入 ( state=present) 以下块:

        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
Run Code Online (Sandbox Code Playgroud)

<Directory /var/www/>