来自 Ansible 文档:
支持的 init 系统包括 BSD init、OpenRC、SysV、Solaris SMF、systemd、upstart。
Ansible 尝试按照什么顺序运行服务?如果在 /etc/init 中既有服务 X 的 init.d 脚本,又有 upstart 脚本,该怎么办?
答案1
正如ansible.builtin.service 的文档:
范围:
use
服务模块实际上使用系统特定模块,通常通过自动检测,此设置可以强制使用特定模块。
因此官方的答案是 Ansible 内部决定使用什么。
进一步来说:
通常它使用“ansible_service_mgr”事实的值,当未找到匹配项时,它会返回到旧的“service”模块。
因此,Ansible 通常使用 Ansible 事实“ansible_service_mgr”,该事实告诉它要使用哪个 init 系统。如果失败,则使用“service”模块,该模块具有自己的自动检测逻辑(见下文)。
'ansible_service_mgr' 是在事实/系统/service_mgr.py,通过检查各种系统属性(例如操作系统名称和某些文件的存在)。
至于回退到旧的“服务”模块:查看 ist 代码(Github 上的 modules/service.py),看来ansible分两步进行检测:
- 检测正在运行的平台和可能的发行版(通过常见/sys_info.py,获取平台子类)
- 委托给 Service 类的特定平台子类,例如 LinuxService、FreeBsdService 等。
然后,这些特定于平台的子类将尝试检测要使用的初始化系统。例如,LinuxService 将按顺序尝试以下初始化系统:
- systemd
- 暴发户
- OpenRC
- SysV 初始化
然而,最好不要依赖它,因为它没有官方记录并且可能会发生变化。