我正在尝试使用 Ansible 和 systemd 设置一些用户服务。
在 Ubuntu 和 RHEL 7 上我得到了
# systemctl --user status
Failed to get D-Bus connection: Connection refused
对于 Ubuntu,我澄清了错误,这是因为这个:
https://docs.ansible.com/ansible/latest/modules/systemd_module.html
在给定的服务管理器范围内运行 systemctl,可以是默认系统范围(系统)、当前用户范围(用户)或所有用户范围(全局)。要使 systemd 与“用户”配合使用,执行用户必须启动自己的 dbus 实例(systemd 要求)。用户 dbus 进程通常在正常登录期间启动,但不会在 Ansible 任务运行期间启动。否则,您可能会收到“无法连接到总线:没有这样的文件或目录”错误。
基本上,DBus 需要先启动systemd --user
才能工作。我也不确定该怎么做,但我想我可以用其他方法解决这个问题。
然而,目前的主要障碍是:我如何一般性地检查功能是否可用?
我试过了systemctl show
,没有明确的“用户”功能。标志是行中的“+PAM”吗Features
?我知道 systemd 至少部分使用 PAM 来实现它,但我不知道其他功能是否需要它。
我如何检查“我的” systemd--user
是否以可靠的方式提供支持?是否有我可以检查的文件?命令?其他东西?DBus 巫术?
答案1
遗憾的是,我无法再使用 Debian 11 上的 Ansible 2.12 重现该行为,而且我目前没有其他机器,但我的第一个肮脏的解决方案是忽略任何错误并注册响应状态并找出发生了什么。
- name: "Check, if user can handle user property"
ansible.builtin.systemd:
state: "started"
name: "crond"
scope: "user"
ignore_errors: true
changed_when: false
register: systemd_status
- name: "Output status for debugging"
ansible.builtin.debug:
msg: "{{ systemd_status }}"
when:
- "systemd_status.failed | bool"
当您运行 时command: systemd --user status
,这将为您提供具体的响应。但由于 Debian 上缺少故障状态,我无法测试这一点。文档还显示了一个示例。但最后,我认为 systemd 模块实现在这里缺少一些实现细节和文档。
另外,Ansible 上还有一个未解决的问题,请参阅https://github.com/ansible/ansible/issues/72674它通过强制延迟会话为您提供一些可能的解决方法。
我认为上面的提交没有切中要点。如果用户未登录,则没有 XDG_RUNTIME_DIR 指向(目录不存在),因此澄清它应该可访问没有帮助。正如 @ikke-t 所提到的,可以在 systemd 中强制延迟会话(例如 loginctl enable-linger ),但 ansible 应该处理这个问题,要么自动为这些情况启用它,要么在 systemd 模块中允许它(启用/禁用用户延迟)。
在调用 systemd 之前使用 ansible-manual 进行工作:
- name: Ensure lingering enabled
ansible.builtin.command: "loginctl enable-linger {{ user }}"
creates: /var/lib/systemd/linger/{{ user }}