无法在 WSL Ubuntu 20.04.3 LTS(焦点)中使用本地主机上的 Ansible 模块服务启动 Apache2

Posted

技术标签:

【中文标题】无法在 WSL Ubuntu 20.04.3 LTS(焦点)中使用本地主机上的 Ansible 模块服务启动 Apache2【英文标题】:Failed to start Apache2 using Ansible Module Service on Localhost in WSL Ubuntu 20.04.3 LTS (focal) 【发布时间】:2022-01-08 23:50:00 【问题描述】:

我尝试使用 'sudo service' 命令启动 Apache2 服务并且它可以工作,但是当我尝试使用 ansible 服务模块启动 apache2 时,我收到错误消息“服务处于未知状态”。

我确实将我的 ansible 升级到了最新版本。我在 WSL Ubuntu 20.04.3LTS 中工作。而且我确实已经正确设置了 SSH,以便我可以使用 apt、command 和 shell 等模块运行其他 ansible ad-hoc 命令。

有任何线索可能是问题出在哪里吗?

进一步挖掘后,我发现似乎 ansible 在 service_mgr.py 的方法 'is_systemd_managed_offline(module) 中有一个错误,这使得 ansible 认为服务管理器是 systemd 而它实际上是服务(或 sysv init) :

if module.get_bin_path('systemctl'):
            # check if /sbin/init is a symlink to systemd
            # on SUSE, /sbin/init may be missing if systemd-sysvinit package is not installed.
            if os.path.islink('/sbin/init') and os.path.basename(os.readlink('/sbin/init')) == 'systemd':
                return True
        return False

这是因为在我的 WSL Ubuntu 20.04 LTS 上,确实有从 /sbin/init 到 systemd 的链接,如图:

/sbin/init -> /lib/systemd/systemd*

但是,服务管理器实际上应该设置为 sysv init,如果一切正常,它将设置在 service_mgr.py 中 elif 部分代码的末尾:

        elif collected_facts.get('ansible_system') == 'Linux':
            # FIXME: mv is_systemd_managed
            if self.is_systemd_managed(module=module):
                service_mgr_name = 'systemd'
            elif module.get_bin_path('initctl') and os.path.exists("/etc/init/"):
                service_mgr_name = 'upstart'
            elif os.path.exists('/sbin/openrc'):
                service_mgr_name = 'openrc'
            elif self.is_systemd_managed_offline(module=module):
                service_mgr_name = 'systemd'
            elif os.path.exists('/etc/init.d/'):
                service_mgr_name = 'sysvinit'

        if not service_mgr_name:
            # if we cannot detect, fallback to generic 'service'
            service_mgr_name = 'service'

但是,由于上面显示的现有链接,ansible 在 is_system_managed_offline 的 elif 行停止,不会继续到 elif 系列的末尾。

如下图所示,服务管理器显示为init(sysv init):

$ ps -p 1 -o comm=
init

知道如何解决这个问题吗?

//////////解决了///////////////// 通过检查 ansible docs 网站上服务模块的文档,并使用参数 'use' 来强制 ansible 使用 'service' 而不是 'systemd' 作为服务管理器(虽然从 ansible setup 模块来看,ansible 仍然错误地认为 systemd 是我的 WSL Ubuntu 20.04.3 LTS 的服务管理器,因为代码错误如上所示。

希望在 Ansible 的未来版本中,可以解决上面的代码错误(用于检查 Linux 机器上可用的服务管理器的 elif),尤其是考虑到 WSL Ubuntu 和其他 WSL 变体。

一个快速的解决方法是重新排列 elif 顺序,将 'is_systemd_managed_offline' 变体放在 elif 列表的末尾,并将 os.path.exists('/etc/init.d') 在列表中移到更高的位置,如显示:

    elif collected_facts.get('ansible_system') == 'Linux':
            # FIXME: mv is_systemd_managed
            if self.is_systemd_managed(module=module):
                service_mgr_name = 'systemd'
            elif module.get_bin_path('initctl') and os.path.exists("/etc/init/"):
                service_mgr_name = 'upstart'
            elif os.path.exists('/sbin/openrc'):
                service_mgr_name = 'openrc'
            *elif os.path.exists('/etc/init.d/'):
                service_mgr_name = 'sysvinit'
            elif self.is_systemd_managed_offline(module=module):
                service_mgr_name = 'systemd'*

【问题讨论】:

我建议你检查一下:github.com/ansible/ansible/issues/71528 @ikora thx,我已经检查了建议的页面,但我的问题是我没有 systemd,因为我在由它自己的 init 启动的 WSL Ubuntu 上。我不明白的是,为什么我可以通过执行命令“sudo service apache2 start”来启动 apache,但不能通过 ansible adhoc 命令中的 Ansible Service 模块使用 -m service -a "name=apach2 state=started ”。有什么线索吗? 【参考方案1】:

我认为您可以强制您的服务模块使用“服务”而不是 systemctl:

ansible  localhost -m service -a "use=service name=apache2 state=stopped"

Service use reference

【讨论】:

以上是关于无法在 WSL Ubuntu 20.04.3 LTS(焦点)中使用本地主机上的 Ansible 模块服务启动 Apache2的主要内容,如果未能解决你的问题,请参考以下文章

无法在 WSL 2 Ubuntu20.04 上通过 Ansible 启动服务

Jupyter Notebook 无法在 Ubuntu WSL2 中打开

找不到带有 docker 的 Ubuntu WSL

在 WSL2 中:安装了适用于 Windows 10 nodejs 的 Ubuntu 20.04,但 npm 无法正常工作

无法在 WSL Ubuntu 18.04 上安装 R Shiny Server

Ubuntu WSL上权限损坏的文件,无法删除但可以访问[关闭]