我正在嘗試使用 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,可以是預設系統作用域 (system)、目前使用者作用域 (user) 或所有使用者作用域 (global)。為了使 systemd 能夠與「使用者」一起工作,執行使用者必須啟動自己的 dbus 實例(systemd 要求)。使用者 dbus 程序通常在正常登入期間啟動,但在 Ansible 任務運行期間不會啟動。否則,您可能會收到“無法連接到總線:沒有此類檔案或目錄”錯誤。
基本上DBus需要啟動才能systemd --user
運作。我也不知道該怎麼做,但我想我可以透過其他方式解決這個問題。
然而,現在的主要障礙是:一般來說,我如何檢查功能的可用性?
我嘗試過systemctl show
,沒有明確的「使用者」功能。標誌是Features
行中的“+PAM”嗎?我知道 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 }}