systemd가 --user를 지원하는지 확실하게 확인할 수 있는 방법이 있습니까?

systemd가 --user를 지원하는지 확실하게 확인할 수 있는 방법이 있습니까?

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

기본 시스템 범위(system), 현재 사용자 범위(user) 또는 모든 사용자 범위(전역)로 지정된 서비스 관리자 범위 내에서 systemctl을 실행합니다. systemd가 'user'와 작동하려면 실행 중인 사용자가 자체 dbus 인스턴스를 시작해야 합니다(systemd 요구 사항). 사용자 dbus 프로세스는 일반적으로 일반 로그인 중에 시작되지만 Ansible 작업 실행 중에는 시작되지 않습니다. 그렇지 않으면 '버스에 연결하지 못했습니다: 해당 파일이나 디렉터리가 없습니다'라는 오류가 발생할 수 있습니다.

systemd --user기본적으로 DBus가 작동하려면 먼저 시작해야 합니다 . 어떻게 해야 할지 잘 모르겠지만, 다른 방법으로 문제를 해결할 수 있을 것 같습니다.

그러나 현재 가장 큰 장애물은 다음과 같습니다. 일반적으로 기능의 가용성을 어떻게 확인합니까?

시도해 보았는데 systemctl show명시적인 "사용자" 기능이 없습니다. 플래그가 해당 Features행의 "+PAM"입니까? 나는 systemd가 PAM을 구현하기 위해 적어도 부분적으로 PAM을 사용한다는 것을 알고 있지만 다른 기능에 필요한지는 모르겠습니다.

--user"내" systemd가 안정적인 방식으로 지원되는지 어떻게 확인할 수 있나요 ? 확인할 수 있는 파일이 있나요? 명령? 다른 것? 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구체적인 응답을 얻을 수 있습니다. 하지만 데비안에는 실패 상태가 없기 때문에 테스트할 수 없습니다. 또한 문서에는 예제가 나와 있습니다. 그러나 결국 systemd 모듈 구현은 여기에서 일부 구현 세부 사항과 문서를 놓친 것 같습니다.

또한 Ansible에 대한 공개 문제가 있습니다.https://github.com/ansible/ansible/issues/72674느린 세션을 강제하여 몇 가지 가능한 해결 방법을 제공합니다.

위의 커밋이 요점을 놓치고 있다고 생각합니다. 사용자가 로그인하지 않은 경우 가리킬 XDG_RUNTIME_DIR이 없으므로(디렉토리가 존재하지 않음) 액세스 가능해야 한다고 명시하는 것은 도움이 되지 않습니다. @ikke-t에서 언급했듯이 느린 세션은 systemd에서 강제로 실행될 수 있지만(예: loginctl 활성화-linger) ansible은 이러한 경우 자동으로 활성화하거나 systemd 모듈에서 허용(활성화/비활성화)하여 이를 처리해야 합니다. 사용자가 머뭇거림).

systemd를 호출하기 전에 ansible-manual 작업을 수행합니다.

- name: Ensure lingering enabled
  ansible.builtin.command: "loginctl enable-linger {{ user }}"
    creates: /var/lib/systemd/linger/{{ user }}

관련 정보