无法将模块重写设置为启用:模块重写已启用

Failed to set module rewrite to enabled: Module rewrite already enabled

尝试在 Ubuntu 16.04 上启用已启用的 Apache2 模块时出现以下错误:

Failed to set module rewrite to enabled: Module rewrite already enabled

我的任务

- name: Enable mod_rewrite
  apache2_module:
    state: present
    name: rewrite
    force: true
    ignore_configcheck: true

Ansible 中的错误

TASK [apache : Enable mod_rewrite] ****************************************************************************
fatal: [vps]: FAILED! => {"changed": false, "failed": true, "msg": "Failed to set module rewrite to enabled: Module rewrite already enabled\n", "rc": 0, "stderr": "", "stderr_lines": [], "stdout": "Module rewrite already enabled\n", "stdout_lines": ["Module rewrite already enabled"]}
        to retry, use: --limit @/home/me/ansible_ubuntu/ansible/playbook.retry

我在使用 Ansible 2.4.0

我试过使用 force 参数,然后 ignore_configcheck,都给出了相同的结果。

客户Python:2.7.6 服务器 Python:2.7.12

更新#1

它不应该只是继续说明它已安装而不是停止吗?

更新#2

a2dismod

的输出
me@server:/etc/apache2/sites-available$ a2dismod
Your choices are: access_compat alias auth_basic authn_core authn_file authz_core authz_host authz_user autoindex deflate dir env fastcgi filter headers mime mpm_event negotiation proxy proxy_fcgi rewrite setenvif status
Which module(s) do you want to disable (wildcards ok)?

更新#3

我根据其中一条评论更改了任务以反映模块的全名:

- name: Enable mod_rewrite
  apache2_module:
    state: present
    name: mod_rewrite
    force: true
    ignore_configcheck: true

遇到不同的错误:

TASK [apache : Enable mod_rewrite] ****************************************************************************
fatal: [vps]: FAILED! => {"changed": false, "failed": true, "msg": "Failed to set module mod_rewrite to enabled: ", "rc": 1, "stderr": "ERROR: Module mod_rewrite does not exist!\n", "stderr_lines": ["ERROR: Module mod_rewrite does not exist!"], "stdout": "", "stdout_lines": []}
        to retry, use: --limit @/home/me/ansible_ubuntu/ansible/playbook.retry

更新 #4

解决方案

task.yml中:

- name: Enable mod_rewrite
  apache2_module:
    state: present
    name: rewrite
    force: true
    ignore_configcheck: true

ansible/modules/web_infrastructure/apache2_modules.py

# a2enmod name replacement to apache2ctl -M names
text_workarounds = [
    ('shib2', 'mod_shib'),
    ('evasive', 'evasive20_module'),
    ('rewrite', 'rewrite_module'),
    ('headers', 'headers_module'),
]

您 运行 在 Ubuntu 上使用 Apache 2 well-known problem

有些包在 apache2ctl -M 的输出中有不同的名称,rewrite 也是如此。该命令将其列为 rewrite_module,这让 Ansible 感到困惑。

Ansible 通过提供 workaround with hard-coded pair of names 解决了这个问题。您可以通过添加 ('rewrite', 'rewrite_module'):

直接修改您的模块
text_workarounds = [
    ('shib2', 'mod_shib'),
    ('evasive', 'evasive20_module'),
    ('rewrite', 'rewrite_module'),
]

从 ansible 2.5 开始,您可以使用 identifier

Identifier of the module as listed by apache2ctl -M. This is optional and usually determined automatically by the common convention of appending _module to name as well as custom exception for popular modules.