From d2cf823190ceebbe2c66be71f4906dfd4be4bfab Mon Sep 17 00:00:00 2001 From: Andrew Sayers Date: Fri, 17 Jan 2025 17:56:35 +0000 Subject: [PATCH 1/4] Allow the user to configure the syslog severity level See also https://github.com/ansible/proposals/issues/214 C# EventLogEntryType values do not map neatly to syslog-style severity levels, so this option is ignored in C#. --- lib/ansible/config/base.yml | 8 ++++++++ lib/ansible/module_utils/basic.py | 4 +++- lib/ansible/module_utils/common/parameters.py | 1 + lib/ansible/module_utils/csharp/Ansible.Basic.cs | 1 + lib/ansible/plugins/action/__init__.py | 3 +++ 5 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/ansible/config/base.yml b/lib/ansible/config/base.yml index 7a6b7dd5187..b794b79af94 100644 --- a/lib/ansible/config/base.yml +++ b/lib/ansible/config/base.yml @@ -2048,6 +2048,14 @@ TARGET_LOG_INFO: vars: - name: ansible_target_log_info version_added: "2.17" +TARGET_LOG_SEVERITY: + name: logging severity + default: LOG_INFO + description: Default syslog-style log level to use when Ansible logs to the remote target. + env: [{name: ANSIBLE_TARGET_LOG_SEVERITY}] + ini: + - {key: target_log_severity, section: defaults} + TASK_TIMEOUT: name: Task Timeout default: 0 diff --git a/lib/ansible/module_utils/basic.py b/lib/ansible/module_utils/basic.py index 03f41cd9287..d8cc452ba0e 100644 --- a/lib/ansible/module_utils/basic.py +++ b/lib/ansible/module_utils/basic.py @@ -395,6 +395,7 @@ class AnsibleModule(object): self._socket_path = None self._shell = None self._syslog_facility = 'LOG_USER' + self._target_log_severity = 'LOG_INFO' self._verbosity = 0 # May be used to set modifications to the environment for any # run_command invocation @@ -1255,8 +1256,9 @@ class AnsibleModule(object): try: module = 'ansible-%s' % self._name facility = getattr(syslog, self._syslog_facility, syslog.LOG_USER) + level = getattr(syslog, self._target_log_severity, syslog.LOG_INFO) syslog.openlog(str(module), 0, facility) - syslog.syslog(syslog.LOG_INFO, msg) + syslog.syslog(level, msg) except (TypeError, ValueError) as e: self.fail_json( msg='Failed to log to syslog (%s). To proceed anyway, ' diff --git a/lib/ansible/module_utils/common/parameters.py b/lib/ansible/module_utils/common/parameters.py index 129bb05178a..49ccbe741b8 100644 --- a/lib/ansible/module_utils/common/parameters.py +++ b/lib/ansible/module_utils/common/parameters.py @@ -86,6 +86,7 @@ PASS_VARS: dict[str, t.Any] = { 'no_log': ('no_log', False), 'remote_tmp': ('_remote_tmp', None), 'target_log_info': ('_target_log_info', None), + 'target_log_severity': ('_target_log_severity', 'LOG_INFO'), 'selinux_special_fs': ('_selinux_special_fs', ['fuse', 'nfs', 'vboxsf', 'ramfs', '9p', 'vfat']), 'shell_executable': ('_shell', '/bin/sh'), 'socket': ('_socket_path', None), diff --git a/lib/ansible/module_utils/csharp/Ansible.Basic.cs b/lib/ansible/module_utils/csharp/Ansible.Basic.cs index eac8361f5dd..77c556b1cc6 100644 --- a/lib/ansible/module_utils/csharp/Ansible.Basic.cs +++ b/lib/ansible/module_utils/csharp/Ansible.Basic.cs @@ -75,6 +75,7 @@ namespace Ansible.Basic { "socket", null }, { "syslog_facility", null }, { "target_log_info", "TargetLogInfo" }, + { "target_log_severity", null }, { "tracebacks_for", "_tracebacksFor" }, { "tmpdir", "tmpdir" }, { "verbosity", "Verbosity" }, diff --git a/lib/ansible/plugins/action/__init__.py b/lib/ansible/plugins/action/__init__.py index 590f7dcc58b..b10ea4aa43c 100644 --- a/lib/ansible/plugins/action/__init__.py +++ b/lib/ansible/plugins/action/__init__.py @@ -1027,6 +1027,9 @@ class ActionBase(ABC, _AnsiblePluginInfoMixin): # allow user to insert string to add context to remote logging module_args['_ansible_target_log_info'] = C.config.get_config_value('TARGET_LOG_INFO', variables=task_vars) + # set the syslog-style severity to be used in the module + module_args['_ansible_target_log_severity'] = C.config.get_config_value('TARGET_LOG_SEVERITY', variables=task_vars) + module_args['_ansible_tracebacks_for'] = _traceback.traceback_for() def _execute_module(self, module_name=None, module_args=None, tmp=None, task_vars=None, persist_files=False, delete_remote_tmp=None, wrap_async=False, From 551294d802a57f6692313e47fed2846d4cb8e0f8 Mon Sep 17 00:00:00 2001 From: Andrew Sayers Date: Fri, 17 Jan 2025 18:06:02 +0000 Subject: [PATCH 2/4] Set systemd journal priority like syslog severity --- lib/ansible/module_utils/basic.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/ansible/module_utils/basic.py b/lib/ansible/module_utils/basic.py index d8cc452ba0e..a5ebc708e16 100644 --- a/lib/ansible/module_utils/basic.py +++ b/lib/ansible/module_utils/basic.py @@ -1313,6 +1313,8 @@ class AnsibleModule(object): name = "_%s" % name journal_args.append((name, value)) + priority = getattr(syslog, self._target_log_severity, syslog.LOG_INFO) + try: if HAS_SYSLOG: # If syslog_facility specified, it needs to convert @@ -1323,9 +1325,11 @@ class AnsibleModule(object): syslog.LOG_USER) >> 3 journal.send(MESSAGE=u"%s %s" % (module, journal_msg), SYSLOG_FACILITY=facility, + PRIORITY=priority, **dict(journal_args)) else: journal.send(MESSAGE=u"%s %s" % (module, journal_msg), + PRIORITY=priority, **dict(journal_args)) except OSError: # fall back to syslog since logging to journal failed From ec13cfa1b1ff443b4041ee55c14bec09d952a973 Mon Sep 17 00:00:00 2001 From: Andrew Sayers Date: Fri, 17 Jan 2025 17:35:43 +0000 Subject: [PATCH 3/4] Set syslog_facility in parameters.py to match basic.py lib/ansible/module_utils/basic.py sets self._syslog_facility = 'LOG_USER'. 'INFO' is not a valid facility, so this probably never worked as expected. --- lib/ansible/module_utils/common/parameters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ansible/module_utils/common/parameters.py b/lib/ansible/module_utils/common/parameters.py index 49ccbe741b8..4d92de4dd03 100644 --- a/lib/ansible/module_utils/common/parameters.py +++ b/lib/ansible/module_utils/common/parameters.py @@ -90,7 +90,7 @@ PASS_VARS: dict[str, t.Any] = { 'selinux_special_fs': ('_selinux_special_fs', ['fuse', 'nfs', 'vboxsf', 'ramfs', '9p', 'vfat']), 'shell_executable': ('_shell', '/bin/sh'), 'socket': ('_socket_path', None), - 'syslog_facility': ('_syslog_facility', 'INFO'), + 'syslog_facility': ('_syslog_facility', 'LOG_USER'), 'tmpdir': ('_tmpdir', None), 'tracebacks_for': ('_tracebacks_for', frozenset()), 'verbosity': ('_verbosity', 0), From f7e15f04b5510aeb6a7e392eef02c64a274b7e64 Mon Sep 17 00:00:00 2001 From: Andrew Sayers Date: Tue, 21 Jan 2025 16:10:20 +0000 Subject: [PATCH 4/4] Add changelog fragment --- changelogs/fragments/84574-target_log_severity.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 changelogs/fragments/84574-target_log_severity.yml diff --git a/changelogs/fragments/84574-target_log_severity.yml b/changelogs/fragments/84574-target_log_severity.yml new file mode 100644 index 00000000000..a8ef787f28a --- /dev/null +++ b/changelogs/fragments/84574-target_log_severity.yml @@ -0,0 +1,6 @@ +breaking_changes: + - >- + Ansible's systemd logs now contain a PRIORITY field (default value: 5). + Downstream programs that inspect Ansible's systemd logs should be updated + if they expect the PRIORITY field to be missing + (https://github.com/ansible/ansible/pull/84574).