Ansible と systemd を使用していくつかのユーザー サービスを設定しようとしています。
UbuntuとRHEL 7では
# systemctl --user status
Failed to get D-Bus connection: Connection refused
Ubuntu の場合、エラーの原因を明確にしました。次のようになります:
特定のサービス マネージャー スコープ内で、デフォルトのシステム スコープ (system)、現在のユーザーのスコープ (user)、またはすべてのユーザーのスコープ (global) のいずれかとして systemctl を実行します。systemd が 'user' で動作するには、実行中のユーザーが独自の 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にも未解決の問題があります。参考:強制的にセッションを延長することで、いくつかの回避策が提供されます。
上記のコミットは要点を見逃していると思います。ユーザーがログインしていない場合、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 }}