|
7 | 7 | import signal |
8 | 8 | import sys |
9 | 9 |
|
| 10 | +from ansible import __version__ |
10 | 11 | from ansible.executor.task_queue_manager import TaskQueueManager # type:ignore |
11 | 12 | from ansible.parsing.dataloader import DataLoader # type:ignore |
12 | 13 | from ansible.inventory.manager import InventoryManager # type:ignore |
|
15 | 16 | from ansible.vars.manager import VariableManager # type:ignore[import-untyped] |
16 | 17 | from contextlib import contextmanager |
17 | 18 | from datetime import datetime |
| 19 | +from packaging.version import Version |
18 | 20 | from pprint import pformat |
19 | 21 | from suitable._modules import AnsibleModules |
20 | 22 | from suitable.callback import SilentCallbackModule |
@@ -43,6 +45,9 @@ def utcnow() -> datetime: |
43 | 45 | utcnow = datetime.utcnow |
44 | 46 |
|
45 | 47 |
|
| 48 | +PASS_CALLBACK_BY_NAME = Version(__version__) >= Version('2.19') |
| 49 | + |
| 50 | + |
46 | 51 | @contextmanager |
47 | 52 | def ansible_verbosity(verbosity: int) -> Generator[None, None, None]: |
48 | 53 | """ Temporarily changes the ansible verbosity. Relies on a single display |
@@ -219,10 +224,7 @@ def execute(self, *args: Any, **kwargs: Any) -> RunnerResults: |
219 | 224 | 'hosts': 'all', |
220 | 225 | 'gather_facts': 'no', |
221 | 226 | 'tasks': [{ |
222 | | - 'action': { |
223 | | - 'module': self.module_name, |
224 | | - 'args': module_args, |
225 | | - }, |
| 227 | + self.module_name: module_args, |
226 | 228 | 'environment': self.api.environment, |
227 | 229 | }] |
228 | 230 | } |
@@ -265,6 +267,21 @@ def execute(self, *args: Any, **kwargs: Any) -> RunnerResults: |
265 | 267 | 'passwords': getattr(self.api.options, 'passwords', {}), |
266 | 268 | 'stdout_callback': callback |
267 | 269 | } |
| 270 | + if PASS_CALLBACK_BY_NAME: |
| 271 | + from ansible.plugins.loader import callback_loader # type: ignore |
| 272 | + del kwargs['stdout_callback'] |
| 273 | + callback_name = 'suitable.callback.silent' |
| 274 | + kwargs['stdout_callback_name'] = callback_name |
| 275 | + # HACK: This is really not pretty, but creating a working |
| 276 | + # ansible collection, just so the plugin finder can |
| 277 | + # find our callback and create an instance does not |
| 278 | + # seem worth the required effort |
| 279 | + orig_get = callback_loader.get |
| 280 | + callback_loader.get = lambda name, *a, **kw: ( |
| 281 | + callback |
| 282 | + if name == 'suitable.callback.silent' |
| 283 | + else orig_get(name, *a, **kw) |
| 284 | + ) |
268 | 285 |
|
269 | 286 | if set_global_context: |
270 | 287 | del kwargs['options'] |
@@ -296,6 +313,8 @@ def execute(self, *args: Any, **kwargs: Any) -> RunnerResults: |
296 | 313 | raise |
297 | 314 | finally: |
298 | 315 | if task_queue_manager is not None: |
| 316 | + if PASS_CALLBACK_BY_NAME: |
| 317 | + callback_loader.get = orig_get |
299 | 318 | task_queue_manager.cleanup() |
300 | 319 |
|
301 | 320 | if set_global_context: |
|
0 commit comments