diff --git a/changelogs/fragments/add_systemd_facts.yml b/changelogs/fragments/add_systemd_facts.yml new file mode 100644 index 00000000000..93af448a7f3 --- /dev/null +++ b/changelogs/fragments/add_systemd_facts.yml @@ -0,0 +1,2 @@ +minor_changes: + - facts - add systemd version and features diff --git a/lib/ansible/module_utils/facts/default_collectors.py b/lib/ansible/module_utils/facts/default_collectors.py index 1dcbd7c52a1..af4391576c0 100644 --- a/lib/ansible/module_utils/facts/default_collectors.py +++ b/lib/ansible/module_utils/facts/default_collectors.py @@ -53,6 +53,7 @@ from ansible.module_utils.facts.system.python import PythonFactCollector from ansible.module_utils.facts.system.selinux import SelinuxFactCollector from ansible.module_utils.facts.system.service_mgr import ServiceMgrFactCollector from ansible.module_utils.facts.system.ssh_pub_keys import SshPubKeyFactCollector +from ansible.module_utils.facts.system.systemd import SystemdFactCollector from ansible.module_utils.facts.system.user import UserFactCollector from ansible.module_utils.facts.hardware.base import HardwareCollector @@ -118,7 +119,8 @@ _general = [ EnvFactCollector, LoadAvgFactCollector, SshPubKeyFactCollector, - UserFactCollector + UserFactCollector, + SystemdFactCollector ] # type: t.List[t.Type[BaseFactCollector]] # virtual, this might also limit hardware/networking diff --git a/lib/ansible/module_utils/facts/system/systemd.py b/lib/ansible/module_utils/facts/system/systemd.py new file mode 100644 index 00000000000..154dc73fb2a --- /dev/null +++ b/lib/ansible/module_utils/facts/system/systemd.py @@ -0,0 +1,47 @@ +# Get systemd version and features +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + +from __future__ import annotations + +import ansible.module_utils.compat.typing as t + +from ansible.module_utils.facts.collector import BaseFactCollector +from ansible.module_utils.facts.system.service_mgr import ServiceMgrFactCollector + + +class SystemdFactCollector(BaseFactCollector): + name = "systemd" + _fact_ids = set() # type: t.Set[str] + + def collect(self, module=None, collected_facts=None): + systemctl_bin = module.get_bin_path("systemctl") + if systemctl_bin and ServiceMgrFactCollector.is_systemd_managed(module): + rc, stdout, stderr = module.run_command( + [systemctl_bin, "--version"], + check_rc=False, + ) + + systemd_facts = {} + + if rc != 0: + return systemd_facts + + systemd_facts["systemd"] = {} + systemd_facts["systemd"]["features"] = str(stdout.split("\n")[1]) + systemd_facts["systemd"]["version"] = int(stdout.split(" ")[1]) + + return systemd_facts diff --git a/lib/ansible/modules/setup.py b/lib/ansible/modules/setup.py index d387022fda5..a8928fa5b4f 100644 --- a/lib/ansible/modules/setup.py +++ b/lib/ansible/modules/setup.py @@ -25,7 +25,7 @@ options: V(processor_count), V(python), V(python_version), V(real_user_id), V(selinux), V(service_mgr), V(ssh_host_key_dsa_public), V(ssh_host_key_ecdsa_public), V(ssh_host_key_ed25519_public), V(ssh_host_key_rsa_public), V(ssh_host_pub_keys), V(ssh_pub_keys), V(system), V(system_capabilities), - V(system_capabilities_enforced), V(user), V(user_dir), V(user_gecos), V(user_gid), V(user_id), + V(system_capabilities_enforced), V(systemd), V(user), V(user_dir), V(user_gecos), V(user_gid), V(user_id), V(user_shell), V(user_uid), V(virtual), V(virtualization_role), V(virtualization_type). Can specify a list of values to specify a larger subset. Values can also be used with an initial C(!) to specify that diff --git a/test/integration/targets/systemd/tasks/main.yml b/test/integration/targets/systemd/tasks/main.yml index 503e4d95caf..9444c13d2af 100644 --- a/test/integration/targets/systemd/tasks/main.yml +++ b/test/integration/targets/systemd/tasks/main.yml @@ -121,4 +121,5 @@ - import_tasks: test_unit_template.yml - import_tasks: test_indirect_service.yml - import_tasks: test_enabled_runtime.yml +- import_tasks: test_systemd_version.yml - import_tasks: test_mask.yml diff --git a/test/integration/targets/systemd/tasks/test_systemd_version.yml b/test/integration/targets/systemd/tasks/test_systemd_version.yml new file mode 100644 index 00000000000..2b2fae167c8 --- /dev/null +++ b/test/integration/targets/systemd/tasks/test_systemd_version.yml @@ -0,0 +1,11 @@ +--- +- name: Show Gathered Facts + ansible.builtin.debug: + msg: "{{ ansible_systemd }}" + +- name: Assert the systemd version fact + ansible.builtin.assert: + that: + - ansible_systemd.version | int + - ansible_systemd.version is match('^[1-9][0-9][0-9]$') + - ansible_systemd.features | regex_search('(\\+|-)(PAM|AUDIT)')