我正在尝试使用Ubuntu20.4在WSL2上运行Ansible剧本。大多数任务都能正常工作,但所有管理服务的任务(例如启动nginx(都会失败。
可靠代码:
- 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--版本:
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——版本:
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模块。这是行不通的,因为如果不付出大量努力,WSL就无法支持systemd。
正如您所注意到的,由于WSL Ubuntu 20.04发行版确实提供了对service
命令的回退,因此应该能够简单地将其与Ansible服务模块交换。例如:
- name: NGINX - enable and start nginx service
service:
name: nginx
enabled: yes
state: started
但接下来你会遇到第二个问题——WSL没有提供任何类型的";启动脚本";支持正如我们已经提到的,systemd不受支持,但旧的SysVInit也不受支持。WSL使用自己的init系统作为PID1来引导本机Windows服务和WSL/Linux之间的互操作性。
因此;启用";flag什么都不会做。
真正的问题是你想在什么时候启动服务:
- Windows何时启动
- 用户何时登录
- 当WSL实例第一次手动启动时(例如,通过Windows终端调用(
前两个应该可以通过运行类似wsl -u root service nginx start
的Windows任务管理器脚本来实现。";登录";绝对是一个更简单的用例。我注意到,如果WSL实例没有在用户会话中启动,Windows会终止它,这会带来一些问题。如果你遇到这种情况,有一个可能的解决方法,但我建议用一个单独的问题/答案来解决
在第一次WSL调用时启动nginx
将涉及:
- 设置
sudoers
(当然是通过visudo
(以允许用户在没有密码的情况下运行sudo service nginx start
- 编辑启动文件(例如
.bash_profile
(以包含类似service nginx status || sudo service nginx start
的内容