无法在 WSL 2 Ubuntu20.04 上通过 Ansible 启动服务
Cannot start service via Ansible on WSL 2 Ubuntu20.04
我正在尝试 运行 使用 Ubuntu20.04 在 WSL 2 上运行 Ansible 剧本。
大多数任务工作正常,但是所有管理服务的任务(例如启动 nginx)都失败了。
Ansible 代码:
- name: NGINX - enable and start nginx service
systemd:
name: nginx
enabled: yes
state: started
我在命令行中收到以下错误:
TASK [ansible-role-nginx : NGINX - enable and start nginx service]
fatal: [webapp]: FAILED! => {"changed": false, "msg": "Service is in unknown state", "status": {}}
关于 WSL 2 系统的信息:
uname -a:
Linux CPX-TRWO066I0YQ 5.4.72-microsoft-standard-WSL2 #1 SMP Wed Oct 28 23:40:43 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
lsb_release-a:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.2 LTS
Release: 20.04
Codename: focal
ansible --version:
ansible 2.9.16
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/ubuntu/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python3.8/dist-packages/ansible
executable location = /usr/local/bin/ansible
python version = 3.8.5 (default, May 27 2021, 13:30:53) [GCC 9.3.0]
systemd --version:
systemd 245 (245.4-4ubuntu3.6)
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=hybrid
当我通过命令启动服务时:sudo service nginx start
- 它工作正常。
如果您对此案例有任何建议或解决方案,请告诉我。
您 运行实际上遇到了两个问题。首先,您似乎专门使用了 Ansible systemd module。这是行不通的,因为 WSL 不支持 systemd 需要大量努力。
自从 WSL Ubuntu 20.04 发行版以来,正如您所注意到的,确实 提供了对 service
命令的回退,您 应该 能够简单地将它与 Ansible service module 交换掉。例如:
- name: NGINX - enable and start nginx service
service:
name: nginx
enabled: yes
state: started
但是您将 运行 进入第二个问题——WSL 不提供任何类型的“启动脚本”支持。正如我们已经提到的,不支持 systemd,但也不支持旧的 SysVInit。 WSL 使用它自己的初始化系统作为 PID 1 bootstrap 本机 Windows 服务和 WSL/Linux.
之间的互操作性
所以“启用”标志不会做任何事情。
问题真的是你想什么时候启动服务:
- 什么时候 Windows 启动?
- 用户何时登录?
- 第一次手动启动 WSL 实例时(例如,通过 Windows 终端调用)?
前两个应该可以使用 Windows 任务管理器脚本 运行 类似于 wsl -u root service nginx start
。 “登录”绝对是一个更简单的用例。我注意到 Windows 终止 WSL 实例的一些问题,如果它不是在用户会话中启动的话。如果您 运行 参与其中,则有一个可能的解决方法,但我建议单独 question/answer 来解决它。
在第一次调用 WSL 时启动 nginx
将涉及:
- 设置
sudoers
(当然是通过 visudo
)以允许您的用户 运行 sudo service nginx start
无需密码。
- 编辑您的启动文件(例如
.bash_profile
)以包含类似 service nginx status || sudo service nginx start
. 的内容
我正在尝试 运行 使用 Ubuntu20.04 在 WSL 2 上运行 Ansible 剧本。 大多数任务工作正常,但是所有管理服务的任务(例如启动 nginx)都失败了。
Ansible 代码:
- name: NGINX - enable and start nginx service
systemd:
name: nginx
enabled: yes
state: started
我在命令行中收到以下错误:
TASK [ansible-role-nginx : NGINX - enable and start nginx service]
fatal: [webapp]: FAILED! => {"changed": false, "msg": "Service is in unknown state", "status": {}}
关于 WSL 2 系统的信息:
uname -a:
Linux CPX-TRWO066I0YQ 5.4.72-microsoft-standard-WSL2 #1 SMP Wed Oct 28 23:40:43 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
lsb_release-a:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.2 LTS
Release: 20.04
Codename: focal
ansible --version:
ansible 2.9.16
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/ubuntu/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python3.8/dist-packages/ansible
executable location = /usr/local/bin/ansible
python version = 3.8.5 (default, May 27 2021, 13:30:53) [GCC 9.3.0]
systemd --version:
systemd 245 (245.4-4ubuntu3.6)
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=hybrid
当我通过命令启动服务时:sudo service nginx start
- 它工作正常。
如果您对此案例有任何建议或解决方案,请告诉我。
您 运行实际上遇到了两个问题。首先,您似乎专门使用了 Ansible systemd module。这是行不通的,因为 WSL 不支持 systemd 需要大量努力。
自从 WSL Ubuntu 20.04 发行版以来,正如您所注意到的,确实 提供了对 service
命令的回退,您 应该 能够简单地将它与 Ansible service module 交换掉。例如:
- name: NGINX - enable and start nginx service
service:
name: nginx
enabled: yes
state: started
但是您将 运行 进入第二个问题——WSL 不提供任何类型的“启动脚本”支持。正如我们已经提到的,不支持 systemd,但也不支持旧的 SysVInit。 WSL 使用它自己的初始化系统作为 PID 1 bootstrap 本机 Windows 服务和 WSL/Linux.
之间的互操作性所以“启用”标志不会做任何事情。
问题真的是你想什么时候启动服务:
- 什么时候 Windows 启动?
- 用户何时登录?
- 第一次手动启动 WSL 实例时(例如,通过 Windows 终端调用)?
前两个应该可以使用 Windows 任务管理器脚本 运行 类似于 wsl -u root service nginx start
。 “登录”绝对是一个更简单的用例。我注意到 Windows 终止 WSL 实例的一些问题,如果它不是在用户会话中启动的话。如果您 运行 参与其中,则有一个可能的解决方法,但我建议单独 question/answer 来解决它。
在第一次调用 WSL 时启动 nginx
将涉及:
- 设置
sudoers
(当然是通过visudo
)以允许您的用户 运行sudo service nginx start
无需密码。 - 编辑您的启动文件(例如
.bash_profile
)以包含类似service nginx status || sudo service nginx start
. 的内容