ansible-core 2.19.3rc1__py3-none-any.whl → 2.19.4rc1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of ansible-core might be problematic. Click here for more details.
- ansible/cli/arguments/option_helpers.py +9 -5
- ansible/cli/doc.py +3 -1
- ansible/collections/list.py +4 -2
- ansible/config/base.yml +2 -0
- ansible/executor/process/worker.py +17 -11
- ansible/executor/task_queue_manager.py +43 -1
- ansible/module_utils/ansible_release.py +1 -1
- ansible/module_utils/powershell/Ansible.ModuleUtils.AddType.psm1 +9 -7
- ansible/modules/package_facts.py +5 -5
- ansible/parsing/mod_args.py +3 -0
- ansible/playbook/block.py +1 -3
- ansible/playbook/helpers.py +15 -13
- ansible/playbook/play.py +3 -13
- ansible/playbook/task.py +42 -7
- ansible/plugins/connection/psrp.py +11 -6
- ansible/plugins/lookup/config.py +19 -36
- ansible/plugins/strategy/__init__.py +1 -1
- ansible/release.py +1 -1
- {ansible_core-2.19.3rc1.dist-info → ansible_core-2.19.4rc1.dist-info}/METADATA +1 -1
- {ansible_core-2.19.3rc1.dist-info → ansible_core-2.19.4rc1.dist-info}/RECORD +29 -29
- {ansible_core-2.19.3rc1.dist-info → ansible_core-2.19.4rc1.dist-info}/WHEEL +0 -0
- {ansible_core-2.19.3rc1.dist-info → ansible_core-2.19.4rc1.dist-info}/entry_points.txt +0 -0
- {ansible_core-2.19.3rc1.dist-info → ansible_core-2.19.4rc1.dist-info}/licenses/COPYING +0 -0
- {ansible_core-2.19.3rc1.dist-info → ansible_core-2.19.4rc1.dist-info}/licenses/licenses/Apache-License.txt +0 -0
- {ansible_core-2.19.3rc1.dist-info → ansible_core-2.19.4rc1.dist-info}/licenses/licenses/BSD-3-Clause.txt +0 -0
- {ansible_core-2.19.3rc1.dist-info → ansible_core-2.19.4rc1.dist-info}/licenses/licenses/MIT-license.txt +0 -0
- {ansible_core-2.19.3rc1.dist-info → ansible_core-2.19.4rc1.dist-info}/licenses/licenses/PSF-license.txt +0 -0
- {ansible_core-2.19.3rc1.dist-info → ansible_core-2.19.4rc1.dist-info}/licenses/licenses/simplified_bsd.txt +0 -0
- {ansible_core-2.19.3rc1.dist-info → ansible_core-2.19.4rc1.dist-info}/top_level.txt +0 -0
|
@@ -44,6 +44,9 @@ class DeprecatedArgument:
|
|
|
44
44
|
option: str | None = None
|
|
45
45
|
"""The specific option string that is deprecated; None applies to all options for this argument."""
|
|
46
46
|
|
|
47
|
+
alternatives: str | None = None
|
|
48
|
+
"""The options to use instead."""
|
|
49
|
+
|
|
47
50
|
def is_deprecated(self, option: str) -> bool:
|
|
48
51
|
"""Return True if the given option is deprecated, otherwise False."""
|
|
49
52
|
return self.option is None or option == self.option
|
|
@@ -58,6 +61,7 @@ class DeprecatedArgument:
|
|
|
58
61
|
Display().deprecated( # pylint: disable=ansible-invalid-deprecated-version
|
|
59
62
|
msg=f'The {option!r} argument is deprecated.',
|
|
60
63
|
version=self.version,
|
|
64
|
+
help_text=f'Use {self.alternatives} instead.' if self.alternatives else None
|
|
61
65
|
)
|
|
62
66
|
|
|
63
67
|
|
|
@@ -419,7 +423,7 @@ def add_inventory_options(parser):
|
|
|
419
423
|
"""Add options for commands that utilize inventory"""
|
|
420
424
|
parser.add_argument('-i', '--inventory', '--inventory-file', dest='inventory', action="append",
|
|
421
425
|
help="specify inventory host path or comma separated host list",
|
|
422
|
-
deprecated=DeprecatedArgument(version='2.23', option='--inventory-file'))
|
|
426
|
+
deprecated=DeprecatedArgument(version='2.23', option='--inventory-file', alternatives="-i or --inventory"))
|
|
423
427
|
parser.add_argument('--list-hosts', dest='listhosts', action='store_true',
|
|
424
428
|
help='outputs a list of matching hosts; does not execute anything else')
|
|
425
429
|
parser.add_argument('-l', '--limit', default=C.DEFAULT_SUBSET, dest='subset',
|
|
@@ -444,10 +448,10 @@ def add_module_options(parser):
|
|
|
444
448
|
|
|
445
449
|
def add_output_options(parser):
|
|
446
450
|
"""Add options for commands which can change their output"""
|
|
447
|
-
parser.add_argument('-o', '--one-line', dest='one_line', action='store_true',
|
|
448
|
-
|
|
449
|
-
parser.add_argument('-t', '--tree', dest='tree', default=None,
|
|
450
|
-
|
|
451
|
+
parser.add_argument('-o', '--one-line', dest='one_line', action='store_true', help='condense output',
|
|
452
|
+
deprecated=DeprecatedArgument(version='2.23', alternatives='callback configuration to enable the oneline callback'))
|
|
453
|
+
parser.add_argument('-t', '--tree', dest='tree', default=None, help='log output to this directory',
|
|
454
|
+
deprecated=DeprecatedArgument(version='2.23', alternatives='callback configuration to enable the tree callback'))
|
|
451
455
|
|
|
452
456
|
|
|
453
457
|
def add_runas_options(parser):
|
ansible/cli/doc.py
CHANGED
|
@@ -237,7 +237,9 @@ class RoleMixin(object):
|
|
|
237
237
|
b_colldirs = list_collection_dirs(coll_filter=collection_filter)
|
|
238
238
|
for b_path in b_colldirs:
|
|
239
239
|
path = to_text(b_path, errors='surrogate_or_strict')
|
|
240
|
-
collname
|
|
240
|
+
if not (collname := _get_collection_name_from_path(b_path)):
|
|
241
|
+
display.debug(f'Skipping invalid path {b_path!r}')
|
|
242
|
+
continue
|
|
241
243
|
|
|
242
244
|
roles_dir = os.path.join(path, 'roles')
|
|
243
245
|
if os.path.exists(roles_dir):
|
ansible/collections/list.py
CHANGED
|
@@ -17,8 +17,10 @@ def list_collections(coll_filter=None, search_paths=None, dedupe=True, artifacts
|
|
|
17
17
|
|
|
18
18
|
collections = {}
|
|
19
19
|
for candidate in list_collection_dirs(search_paths=search_paths, coll_filter=coll_filter, artifacts_manager=artifacts_manager, dedupe=dedupe):
|
|
20
|
-
collection
|
|
21
|
-
|
|
20
|
+
if collection := _get_collection_name_from_path(candidate):
|
|
21
|
+
collections[collection] = candidate
|
|
22
|
+
else:
|
|
23
|
+
display.debug(f'Skipping invalid collection in path: {candidate!r}')
|
|
22
24
|
return collections
|
|
23
25
|
|
|
24
26
|
|
ansible/config/base.yml
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
from __future__ import annotations
|
|
19
19
|
|
|
20
|
+
import errno
|
|
20
21
|
import io
|
|
21
22
|
import os
|
|
22
23
|
import signal
|
|
@@ -103,11 +104,19 @@ class WorkerProcess(multiprocessing_context.Process): # type: ignore[name-defin
|
|
|
103
104
|
self._cliargs = cliargs
|
|
104
105
|
|
|
105
106
|
def _term(self, signum, frame) -> None:
|
|
106
|
-
"""
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
107
|
+
"""In child termination when notified by the parent"""
|
|
108
|
+
signal.signal(signum, signal.SIG_DFL)
|
|
109
|
+
|
|
110
|
+
try:
|
|
111
|
+
os.killpg(self.pid, signum)
|
|
112
|
+
os.kill(self.pid, signum)
|
|
113
|
+
except OSError as e:
|
|
114
|
+
if e.errno != errno.ESRCH:
|
|
115
|
+
signame = signal.strsignal(signum)
|
|
116
|
+
display.error(f'Unable to send {signame} to child[{self.pid}]: {e}')
|
|
117
|
+
|
|
118
|
+
# fallthrough, if we are still here, just die
|
|
119
|
+
os._exit(1)
|
|
111
120
|
|
|
112
121
|
def start(self) -> None:
|
|
113
122
|
"""
|
|
@@ -121,11 +130,6 @@ class WorkerProcess(multiprocessing_context.Process): # type: ignore[name-defin
|
|
|
121
130
|
# FUTURE: this lock can be removed once a more generalized pre-fork thread pause is in place
|
|
122
131
|
with display._lock:
|
|
123
132
|
super(WorkerProcess, self).start()
|
|
124
|
-
# Since setsid is called later, if the worker is termed
|
|
125
|
-
# it won't term the new process group
|
|
126
|
-
# register a handler to propagate the signal
|
|
127
|
-
signal.signal(signal.SIGTERM, self._term)
|
|
128
|
-
signal.signal(signal.SIGINT, self._term)
|
|
129
133
|
|
|
130
134
|
def _hard_exit(self, e: str) -> t.NoReturn:
|
|
131
135
|
"""
|
|
@@ -170,7 +174,6 @@ class WorkerProcess(multiprocessing_context.Process): # type: ignore[name-defin
|
|
|
170
174
|
# to give better errors, and to prevent fd 0 reuse
|
|
171
175
|
sys.stdin.close()
|
|
172
176
|
except Exception as e:
|
|
173
|
-
display.debug(f'Could not detach from stdio: {traceback.format_exc()}')
|
|
174
177
|
display.error(f'Could not detach from stdio: {e}')
|
|
175
178
|
os._exit(1)
|
|
176
179
|
|
|
@@ -187,6 +190,9 @@ class WorkerProcess(multiprocessing_context.Process): # type: ignore[name-defin
|
|
|
187
190
|
# Set the queue on Display so calls to Display.display are proxied over the queue
|
|
188
191
|
display.set_queue(self._final_q)
|
|
189
192
|
self._detach()
|
|
193
|
+
# propagate signals
|
|
194
|
+
signal.signal(signal.SIGINT, self._term)
|
|
195
|
+
signal.signal(signal.SIGTERM, self._term)
|
|
190
196
|
try:
|
|
191
197
|
with _task.TaskContext(self._task):
|
|
192
198
|
return self._run()
|
|
@@ -18,8 +18,10 @@
|
|
|
18
18
|
from __future__ import annotations
|
|
19
19
|
|
|
20
20
|
import dataclasses
|
|
21
|
+
import errno
|
|
21
22
|
import os
|
|
22
23
|
import sys
|
|
24
|
+
import signal
|
|
23
25
|
import tempfile
|
|
24
26
|
import threading
|
|
25
27
|
import time
|
|
@@ -187,8 +189,48 @@ class TaskQueueManager:
|
|
|
187
189
|
# plugins for inter-process locking.
|
|
188
190
|
self._connection_lockfile = tempfile.TemporaryFile()
|
|
189
191
|
|
|
192
|
+
self._workers: list[WorkerProcess | None] = []
|
|
193
|
+
|
|
194
|
+
# signal handlers to propagate signals to workers
|
|
195
|
+
signal.signal(signal.SIGTERM, self._signal_handler)
|
|
196
|
+
signal.signal(signal.SIGINT, self._signal_handler)
|
|
197
|
+
|
|
190
198
|
def _initialize_processes(self, num: int) -> None:
|
|
191
|
-
|
|
199
|
+
# mutable update to ensure the reference stays the same
|
|
200
|
+
self._workers[:] = [None] * num
|
|
201
|
+
|
|
202
|
+
def _signal_handler(self, signum, frame) -> None:
|
|
203
|
+
"""
|
|
204
|
+
terminate all running process groups created as a result of calling
|
|
205
|
+
setsid from within a WorkerProcess.
|
|
206
|
+
|
|
207
|
+
Since the children become process leaders, signals will not
|
|
208
|
+
automatically propagate to them.
|
|
209
|
+
"""
|
|
210
|
+
signal.signal(signum, signal.SIG_DFL)
|
|
211
|
+
|
|
212
|
+
for worker in self._workers:
|
|
213
|
+
if worker is None or not worker.is_alive():
|
|
214
|
+
continue
|
|
215
|
+
if worker.pid:
|
|
216
|
+
try:
|
|
217
|
+
# notify workers
|
|
218
|
+
os.kill(worker.pid, signum)
|
|
219
|
+
except OSError as e:
|
|
220
|
+
if e.errno != errno.ESRCH:
|
|
221
|
+
signame = signal.strsignal(signum)
|
|
222
|
+
display.error(f'Unable to send {signame} to child[{worker.pid}]: {e}')
|
|
223
|
+
|
|
224
|
+
if signum == signal.SIGINT:
|
|
225
|
+
# Defer to CLI handling
|
|
226
|
+
raise KeyboardInterrupt()
|
|
227
|
+
|
|
228
|
+
pid = os.getpid()
|
|
229
|
+
try:
|
|
230
|
+
os.kill(pid, signum)
|
|
231
|
+
except OSError as e:
|
|
232
|
+
signame = signal.strsignal(signum)
|
|
233
|
+
display.error(f'Unable to send {signame} to {pid}: {e}')
|
|
192
234
|
|
|
193
235
|
def load_callbacks(self):
|
|
194
236
|
"""
|
|
@@ -278,10 +278,16 @@ Function Add-CSharpType {
|
|
|
278
278
|
if ($PSCmdlet.ParameterSetName -eq "Module") {
|
|
279
279
|
$temp_path = $AnsibleModule.Tmpdir
|
|
280
280
|
$include_debug = $AnsibleModule.Verbosity -ge 3
|
|
281
|
+
|
|
282
|
+
# AnsibleModule will handle the cleanup after module execution
|
|
283
|
+
# which should be enough time for AVs or other processes to release
|
|
284
|
+
# any locks on the temp files.
|
|
285
|
+
$tmpdir_clean_is_error = $false
|
|
281
286
|
}
|
|
282
287
|
else {
|
|
283
288
|
$temp_path = [System.IO.Path]::GetTempPath()
|
|
284
289
|
$include_debug = $IncludeDebugInfo.IsPresent
|
|
290
|
+
$tmpdir_clean_is_error = $true
|
|
285
291
|
}
|
|
286
292
|
$temp_path = Join-Path -Path $temp_path -ChildPath ([Guid]::NewGuid().Guid)
|
|
287
293
|
|
|
@@ -388,17 +394,13 @@ Function Add-CSharpType {
|
|
|
388
394
|
}
|
|
389
395
|
finally {
|
|
390
396
|
# Try to delete the temp path, if this fails and we are running
|
|
391
|
-
# with a module object
|
|
397
|
+
# with a module object, ignore and let it cleanup later.
|
|
392
398
|
try {
|
|
393
399
|
[System.IO.Directory]::Delete($temp_path, $true)
|
|
394
400
|
}
|
|
395
401
|
catch {
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
$AnsibleModule.Warn("$msg Files may still be present after the task is complete. Error: $_")
|
|
399
|
-
}
|
|
400
|
-
else {
|
|
401
|
-
throw "$msg Error: $_"
|
|
402
|
+
if ($tmpdir_clean_is_error) {
|
|
403
|
+
throw "Failed to cleanup temporary directory '$temp_path' used for compiling C# code. Error: $_"
|
|
402
404
|
}
|
|
403
405
|
}
|
|
404
406
|
}
|
ansible/modules/package_facts.py
CHANGED
|
@@ -278,11 +278,11 @@ class RPM(RespawningLibMgr):
|
|
|
278
278
|
return self._lib.TransactionSet().dbMatch()
|
|
279
279
|
|
|
280
280
|
def get_package_details(self, package):
|
|
281
|
-
return dict(name=package[self._lib.RPMTAG_NAME],
|
|
282
|
-
version=package[self._lib.RPMTAG_VERSION],
|
|
283
|
-
release=package[self._lib.RPMTAG_RELEASE],
|
|
284
|
-
epoch=package[self._lib.RPMTAG_EPOCH],
|
|
285
|
-
arch=package[self._lib.RPMTAG_ARCH],)
|
|
281
|
+
return dict(name=to_text(package[self._lib.RPMTAG_NAME]),
|
|
282
|
+
version=to_text(package[self._lib.RPMTAG_VERSION]),
|
|
283
|
+
release=to_text(package[self._lib.RPMTAG_RELEASE]),
|
|
284
|
+
epoch=to_text(package[self._lib.RPMTAG_EPOCH]),
|
|
285
|
+
arch=to_text(package[self._lib.RPMTAG_ARCH]),)
|
|
286
286
|
|
|
287
287
|
|
|
288
288
|
class APT(RespawningLibMgr):
|
ansible/parsing/mod_args.py
CHANGED
|
@@ -130,6 +130,7 @@ class ModuleArgsParser:
|
|
|
130
130
|
# HACK: why are these not FieldAttributes on task with a post-validate to check usage?
|
|
131
131
|
self._task_attrs.update(['local_action', 'static'])
|
|
132
132
|
self._task_attrs = frozenset(self._task_attrs)
|
|
133
|
+
self._resolved_action = None
|
|
133
134
|
|
|
134
135
|
def _split_module_string(self, module_string: str) -> tuple[str, str]:
|
|
135
136
|
"""
|
|
@@ -344,6 +345,8 @@ class ModuleArgsParser:
|
|
|
344
345
|
raise e
|
|
345
346
|
|
|
346
347
|
is_action_candidate = context.resolved and bool(context.redirect_list)
|
|
348
|
+
if is_action_candidate:
|
|
349
|
+
self._resolved_action = context.resolved_fqcn
|
|
347
350
|
|
|
348
351
|
if is_action_candidate:
|
|
349
352
|
# finding more than one module name is a problem
|
ansible/playbook/block.py
CHANGED
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
|
|
18
18
|
from __future__ import annotations
|
|
19
19
|
|
|
20
|
-
import ansible.constants as C
|
|
21
20
|
from ansible.errors import AnsibleParserError
|
|
22
21
|
from ansible.module_utils.common.sentinel import Sentinel
|
|
23
22
|
from ansible.playbook.attribute import NonInheritableFieldAttribute
|
|
@@ -376,8 +375,7 @@ class Block(Base, Conditional, CollectionSearch, Taggable, Notifiable, Delegatab
|
|
|
376
375
|
filtered_block = evaluate_block(task)
|
|
377
376
|
if filtered_block.has_tasks():
|
|
378
377
|
tmp_list.append(filtered_block)
|
|
379
|
-
elif
|
|
380
|
-
task.evaluate_tags(self._play.only_tags, self._play.skip_tags, all_vars=all_vars)):
|
|
378
|
+
elif task.evaluate_tags(self._play.only_tags, self._play.skip_tags, all_vars=all_vars):
|
|
381
379
|
tmp_list.append(task)
|
|
382
380
|
return tmp_list
|
|
383
381
|
|
ansible/playbook/helpers.py
CHANGED
|
@@ -165,17 +165,29 @@ def load_list_of_tasks(ds, play, block=None, role=None, task_include=None, use_h
|
|
|
165
165
|
subdir = 'tasks'
|
|
166
166
|
if use_handlers:
|
|
167
167
|
subdir = 'handlers'
|
|
168
|
+
try:
|
|
169
|
+
include_target = templar.template(task.args['_raw_params'])
|
|
170
|
+
except AnsibleUndefinedVariable as ex:
|
|
171
|
+
raise AnsibleParserError(
|
|
172
|
+
message=f"Error when evaluating variable in import path {task.args['_raw_params']!r}.",
|
|
173
|
+
help_text="When using static imports, ensure that any variables used in their names are defined in vars/vars_files\n"
|
|
174
|
+
"or extra-vars passed in from the command line. Static imports cannot use variables from facts or inventory\n"
|
|
175
|
+
"sources like group or host vars.",
|
|
176
|
+
obj=task_ds,
|
|
177
|
+
) from ex
|
|
178
|
+
# FIXME this appears to be (almost?) duplicate code as in IncludedFile for include_tasks
|
|
168
179
|
while parent_include is not None:
|
|
169
180
|
if not isinstance(parent_include, TaskInclude):
|
|
170
181
|
parent_include = parent_include._parent
|
|
171
182
|
continue
|
|
172
|
-
parent_include
|
|
173
|
-
|
|
183
|
+
if isinstance(parent_include, IncludeRole):
|
|
184
|
+
parent_include_dir = parent_include._role_path
|
|
185
|
+
else:
|
|
186
|
+
parent_include_dir = os.path.dirname(templar.template(parent_include.args.get('_raw_params')))
|
|
174
187
|
if cumulative_path is None:
|
|
175
188
|
cumulative_path = parent_include_dir
|
|
176
189
|
elif not os.path.isabs(cumulative_path):
|
|
177
190
|
cumulative_path = os.path.join(parent_include_dir, cumulative_path)
|
|
178
|
-
include_target = templar.template(task.args['_raw_params'])
|
|
179
191
|
if task._role:
|
|
180
192
|
new_basedir = os.path.join(task._role._role_path, subdir, cumulative_path)
|
|
181
193
|
include_file = loader.path_dwim_relative(new_basedir, subdir, include_target)
|
|
@@ -189,16 +201,6 @@ def load_list_of_tasks(ds, play, block=None, role=None, task_include=None, use_h
|
|
|
189
201
|
parent_include = parent_include._parent
|
|
190
202
|
|
|
191
203
|
if not found:
|
|
192
|
-
try:
|
|
193
|
-
include_target = templar.template(task.args['_raw_params'])
|
|
194
|
-
except AnsibleUndefinedVariable as ex:
|
|
195
|
-
raise AnsibleParserError(
|
|
196
|
-
message=f"Error when evaluating variable in import path {task.args['_raw_params']!r}.",
|
|
197
|
-
help_text="When using static imports, ensure that any variables used in their names are defined in vars/vars_files\n"
|
|
198
|
-
"or extra-vars passed in from the command line. Static imports cannot use variables from facts or inventory\n"
|
|
199
|
-
"sources like group or host vars.",
|
|
200
|
-
obj=task_ds,
|
|
201
|
-
) from ex
|
|
202
204
|
if task._role:
|
|
203
205
|
include_file = loader.path_dwim_relative(task._role._role_path, subdir, include_target)
|
|
204
206
|
else:
|
ansible/playbook/play.py
CHANGED
|
@@ -303,23 +303,13 @@ class Play(Base, Taggable, CollectionSearch):
|
|
|
303
303
|
|
|
304
304
|
t = Task(block=flush_block)
|
|
305
305
|
t.action = 'meta'
|
|
306
|
-
t.
|
|
306
|
+
t._resolved_action = 'ansible.builtin.meta'
|
|
307
307
|
t.args['_raw_params'] = 'flush_handlers'
|
|
308
308
|
t.implicit = True
|
|
309
309
|
t.set_loader(self._loader)
|
|
310
|
+
t.tags = ['always']
|
|
310
311
|
|
|
311
|
-
|
|
312
|
-
# Avoid calling flush_handlers in case the whole play is skipped on tags,
|
|
313
|
-
# this could be performance improvement since calling flush_handlers on
|
|
314
|
-
# large inventories could be expensive even if no hosts are notified
|
|
315
|
-
# since we call flush_handlers per host.
|
|
316
|
-
# Block.filter_tagged_tasks ignores evaluating tags on implicit meta
|
|
317
|
-
# tasks so we need to explicitly call Task.evaluate_tags here.
|
|
318
|
-
t.tags = self.tags
|
|
319
|
-
if t.evaluate_tags(self.only_tags, self.skip_tags, all_vars=self.vars):
|
|
320
|
-
flush_block.block = [t]
|
|
321
|
-
else:
|
|
322
|
-
flush_block.block = [t]
|
|
312
|
+
flush_block.block = [t]
|
|
323
313
|
|
|
324
314
|
# NOTE keep flush_handlers tasks even if a section has no regular tasks,
|
|
325
315
|
# there may be notified handlers from the previous section
|
ansible/playbook/task.py
CHANGED
|
@@ -41,7 +41,7 @@ from ansible.playbook.role import Role
|
|
|
41
41
|
from ansible.playbook.taggable import Taggable
|
|
42
42
|
from ansible._internal import _task
|
|
43
43
|
from ansible._internal._templating import _marker_behaviors
|
|
44
|
-
from ansible._internal._templating._jinja_bits import is_possibly_all_template
|
|
44
|
+
from ansible._internal._templating._jinja_bits import is_possibly_all_template, is_possibly_template
|
|
45
45
|
from ansible._internal._templating._engine import TemplateEngine, TemplateOptions
|
|
46
46
|
from ansible.utils.collection_loader import AnsibleCollectionConfig
|
|
47
47
|
from ansible.utils.display import Display
|
|
@@ -101,7 +101,7 @@ class Task(Base, Conditional, Taggable, CollectionSearch, Notifiable, Delegatabl
|
|
|
101
101
|
self._role = role
|
|
102
102
|
self._parent = None
|
|
103
103
|
self.implicit = False
|
|
104
|
-
self.
|
|
104
|
+
self._resolved_action: str | None = None
|
|
105
105
|
|
|
106
106
|
if task_include:
|
|
107
107
|
self._parent = task_include
|
|
@@ -110,6 +110,38 @@ class Task(Base, Conditional, Taggable, CollectionSearch, Notifiable, Delegatabl
|
|
|
110
110
|
|
|
111
111
|
super(Task, self).__init__()
|
|
112
112
|
|
|
113
|
+
_resolved_action_warning = (
|
|
114
|
+
"A plugin is sampling the task's resolved_action when it is not resolved. "
|
|
115
|
+
"This can be caused by callback plugins using the resolved_action attribute too "
|
|
116
|
+
"early (such as in v2_playbook_on_task_start for a task using the action/local_action "
|
|
117
|
+
"keyword), or too late (such as in v2_runner_on_ok for a task with a loop). "
|
|
118
|
+
"To maximize compatibility with user features, callback plugins should "
|
|
119
|
+
"only use this attribute in v2_runner_on_ok/v2_runner_on_failed for tasks "
|
|
120
|
+
"without a loop, and v2_runner_item_on_ok/v2_runner_item_on_failed otherwise."
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
@property
|
|
124
|
+
def resolved_action(self) -> str | None:
|
|
125
|
+
"""The templated and resolved FQCN of the task action or None.
|
|
126
|
+
|
|
127
|
+
If the action is a template, callback plugins can only use this value in certain methods.
|
|
128
|
+
- v2_runner_on_ok and v2_runner_on_failed if there's no task loop
|
|
129
|
+
- v2_runner_item_on_ok and v2_runner_item_on_failed if there is a task loop
|
|
130
|
+
"""
|
|
131
|
+
# Consider deprecating this because it's difficult to use?
|
|
132
|
+
# Moving it to the task result would improve the no-loop limitation on v2_runner_on_ok
|
|
133
|
+
# but then wouldn't be accessible to v2_playbook_on_task_start, *_on_skipped, etc.
|
|
134
|
+
if self._resolved_action is not None:
|
|
135
|
+
return self._resolved_action
|
|
136
|
+
if not is_possibly_template(self.action):
|
|
137
|
+
try:
|
|
138
|
+
return self._resolve_action(self.action)
|
|
139
|
+
except AnsibleParserError:
|
|
140
|
+
display.warning(self._resolved_action_warning, obj=self.action)
|
|
141
|
+
else:
|
|
142
|
+
display.warning(self._resolved_action_warning, obj=self.action)
|
|
143
|
+
return None
|
|
144
|
+
|
|
113
145
|
def get_name(self, include_role_fqcn=True):
|
|
114
146
|
""" return the name of the task """
|
|
115
147
|
|
|
@@ -168,7 +200,7 @@ class Task(Base, Conditional, Taggable, CollectionSearch, Notifiable, Delegatabl
|
|
|
168
200
|
else:
|
|
169
201
|
module_or_action_context = action_context.plugin_load_context
|
|
170
202
|
|
|
171
|
-
self.
|
|
203
|
+
self._resolved_action = module_or_action_context.resolved_fqcn
|
|
172
204
|
|
|
173
205
|
action_type: type[ActionBase] = action_context.object
|
|
174
206
|
|
|
@@ -282,6 +314,9 @@ class Task(Base, Conditional, Taggable, CollectionSearch, Notifiable, Delegatabl
|
|
|
282
314
|
# But if it wasn't, we can add the yaml object now to get more detail
|
|
283
315
|
raise AnsibleParserError("Error parsing task arguments.", obj=ds) from ex
|
|
284
316
|
|
|
317
|
+
if args_parser._resolved_action is not None:
|
|
318
|
+
self._resolved_action = args_parser._resolved_action
|
|
319
|
+
|
|
285
320
|
new_ds['action'] = action
|
|
286
321
|
new_ds['args'] = args
|
|
287
322
|
new_ds['delegate_to'] = delegate_to
|
|
@@ -465,7 +500,7 @@ class Task(Base, Conditional, Taggable, CollectionSearch, Notifiable, Delegatabl
|
|
|
465
500
|
new_me._role = self._role
|
|
466
501
|
|
|
467
502
|
new_me.implicit = self.implicit
|
|
468
|
-
new_me.
|
|
503
|
+
new_me._resolved_action = self._resolved_action
|
|
469
504
|
new_me._uuid = self._uuid
|
|
470
505
|
|
|
471
506
|
return new_me
|
|
@@ -482,7 +517,7 @@ class Task(Base, Conditional, Taggable, CollectionSearch, Notifiable, Delegatabl
|
|
|
482
517
|
data['role'] = self._role.serialize()
|
|
483
518
|
|
|
484
519
|
data['implicit'] = self.implicit
|
|
485
|
-
data['
|
|
520
|
+
data['_resolved_action'] = self._resolved_action
|
|
486
521
|
|
|
487
522
|
return data
|
|
488
523
|
|
|
@@ -513,7 +548,7 @@ class Task(Base, Conditional, Taggable, CollectionSearch, Notifiable, Delegatabl
|
|
|
513
548
|
del data['role']
|
|
514
549
|
|
|
515
550
|
self.implicit = data.get('implicit', False)
|
|
516
|
-
self.
|
|
551
|
+
self._resolved_action = data.get('_resolved_action')
|
|
517
552
|
|
|
518
553
|
super(Task, self).deserialize(data)
|
|
519
554
|
|
|
@@ -591,7 +626,7 @@ class Task(Base, Conditional, Taggable, CollectionSearch, Notifiable, Delegatabl
|
|
|
591
626
|
def dump_attrs(self):
|
|
592
627
|
"""Override to smuggle important non-FieldAttribute values back to the controller."""
|
|
593
628
|
attrs = super().dump_attrs()
|
|
594
|
-
attrs.update(
|
|
629
|
+
attrs.update(_resolved_action=self._resolved_action)
|
|
595
630
|
return attrs
|
|
596
631
|
|
|
597
632
|
def _resolve_conditional(
|
|
@@ -331,7 +331,7 @@ try:
|
|
|
331
331
|
from pypsrp.host import PSHost, PSHostUserInterface
|
|
332
332
|
from pypsrp.powershell import PowerShell, RunspacePool
|
|
333
333
|
from pypsrp.wsman import WSMan
|
|
334
|
-
from requests.exceptions import ConnectionError, ConnectTimeout
|
|
334
|
+
from requests.exceptions import ConnectionError, ConnectTimeout, ReadTimeout
|
|
335
335
|
except ImportError as err:
|
|
336
336
|
HAS_PYPSRP = False
|
|
337
337
|
PYPSRP_IMP_ERR = err
|
|
@@ -479,11 +479,16 @@ class Connection(ConnectionBase):
|
|
|
479
479
|
pwsh_in_data = in_data
|
|
480
480
|
display.vvv(u"PSRP: EXEC %s" % script, host=self._psrp_host)
|
|
481
481
|
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
482
|
+
try:
|
|
483
|
+
rc, stdout, stderr = self._exec_psrp_script(
|
|
484
|
+
script=script,
|
|
485
|
+
input_data=pwsh_in_data.splitlines() if pwsh_in_data else None,
|
|
486
|
+
arguments=script_args,
|
|
487
|
+
)
|
|
488
|
+
except ReadTimeout as e:
|
|
489
|
+
raise AnsibleConnectionFailure(
|
|
490
|
+
"HTTP read timeout during PSRP script execution"
|
|
491
|
+
) from e
|
|
487
492
|
return rc, stdout, stderr
|
|
488
493
|
|
|
489
494
|
def put_file(self, in_path: str, out_path: str) -> None:
|
ansible/plugins/lookup/config.py
CHANGED
|
@@ -88,31 +88,6 @@ from ansible.errors import AnsibleError, AnsibleUndefinedConfigEntry
|
|
|
88
88
|
from ansible.plugins.lookup import LookupBase
|
|
89
89
|
|
|
90
90
|
|
|
91
|
-
def _get_plugin_config(pname, ptype, config, variables):
|
|
92
|
-
# plugin creates settings on load, this is cached so not too expensive to redo
|
|
93
|
-
loader = getattr(plugin_loader, '%s_loader' % ptype)
|
|
94
|
-
p = loader.get(pname, class_only=True)
|
|
95
|
-
|
|
96
|
-
if p is None:
|
|
97
|
-
raise AnsibleError(f"Unable to load {ptype} plugin {pname!r}.")
|
|
98
|
-
|
|
99
|
-
result, origin = C.config.get_config_value_and_origin(config, plugin_type=ptype, plugin_name=p._load_name, variables=variables)
|
|
100
|
-
|
|
101
|
-
return result, origin
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
def _get_global_config(config):
|
|
105
|
-
try:
|
|
106
|
-
result = getattr(C, config)
|
|
107
|
-
except AttributeError:
|
|
108
|
-
raise AnsibleUndefinedConfigEntry(f"Setting {config!r} does not exist.") from None
|
|
109
|
-
|
|
110
|
-
if callable(result):
|
|
111
|
-
raise ValueError(f"Invalid setting {config!r} attempted.")
|
|
112
|
-
|
|
113
|
-
return result
|
|
114
|
-
|
|
115
|
-
|
|
116
91
|
class LookupModule(LookupBase):
|
|
117
92
|
|
|
118
93
|
def run(self, terms, variables=None, **kwargs):
|
|
@@ -135,18 +110,26 @@ class LookupModule(LookupBase):
|
|
|
135
110
|
|
|
136
111
|
result = Sentinel
|
|
137
112
|
origin = None
|
|
113
|
+
|
|
114
|
+
# plugin creates settings on load, we ensure that happens here
|
|
115
|
+
if pname:
|
|
116
|
+
# this is cached so not too expensive
|
|
117
|
+
loader = getattr(plugin_loader, f'{ptype}_loader')
|
|
118
|
+
p = loader.get(pname, class_only=True)
|
|
119
|
+
if p is None:
|
|
120
|
+
raise AnsibleError(f"Unable to load {ptype} plugin {pname!r}.")
|
|
138
121
|
try:
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
122
|
+
result, origin = C.config.get_config_value_and_origin(term, plugin_type=ptype, plugin_name=pname, variables=variables)
|
|
123
|
+
except AnsibleUndefinedConfigEntry as e:
|
|
124
|
+
match missing:
|
|
125
|
+
case 'error':
|
|
126
|
+
raise
|
|
127
|
+
case 'skip':
|
|
128
|
+
pass
|
|
129
|
+
case 'warn':
|
|
130
|
+
self._display.error_as_warning(msg=f"Skipping {term}.", exception=e)
|
|
131
|
+
case _:
|
|
132
|
+
raise AnsibleError(f"Invalid option for error handling, missing must be error, warn or skip, got: {missing}.") from e
|
|
150
133
|
|
|
151
134
|
if result is not Sentinel:
|
|
152
135
|
if show_origin:
|
|
@@ -900,7 +900,7 @@ class StrategyBase:
|
|
|
900
900
|
display.warning("%s task does not support when conditional" % task_name)
|
|
901
901
|
|
|
902
902
|
def _execute_meta(self, task: Task, play_context, iterator, target_host: Host):
|
|
903
|
-
task.
|
|
903
|
+
task._resolved_action = 'ansible.builtin.meta' # _post_validate_args is never called for meta actions, so resolved_action hasn't been set
|
|
904
904
|
|
|
905
905
|
# meta tasks store their args in the _raw_params field of args,
|
|
906
906
|
# since they do not use k=v pairs, so get that
|
ansible/release.py
CHANGED
|
@@ -3,7 +3,7 @@ ansible/__main__.py,sha256=24j-7-YT4lZ2fmV80JD-VRoYBnxR7YoP_VP-orJtDt0,796
|
|
|
3
3
|
ansible/constants.py,sha256=qef45QpHi-yFFMvllvNKmqFpXdKKr304e5fEZnjgwZc,7989
|
|
4
4
|
ansible/context.py,sha256=oKYyfjfWpy8vDeProtqfnqSmuij_t75_5e5t0U_hQ1g,1933
|
|
5
5
|
ansible/keyword_desc.yml,sha256=5rGCsr-0B8w2D67qBD6q_2WFxfqj9ieb0V_2J-dZJ5E,7547
|
|
6
|
-
ansible/release.py,sha256=
|
|
6
|
+
ansible/release.py,sha256=RtW2wkAZbR1DKOK0OqZGINS6WXDQFJV7w-UgMdsKbNo,855
|
|
7
7
|
ansible/_internal/__init__.py,sha256=J3yCEAZoJLwxHMPEIWHwX6seRTCQ4Sr7cfHSw11ik9k,2208
|
|
8
8
|
ansible/_internal/_collection_proxy.py,sha256=V3Zns3jdWR1hTP6q4mrNWoIKL67ayiQFPDOb6F7igsc,1228
|
|
9
9
|
ansible/_internal/_display_utils.py,sha256=2dOknOQpt_GW2AkoMUJxPvmQUCAVYv911KwX6Dwrh0c,5651
|
|
@@ -80,23 +80,23 @@ ansible/cli/_ssh_askpass.py,sha256=fKYjoUkAxh1slpKm969wtJxX78zXe57bgLtQDhxMk_Y,2
|
|
|
80
80
|
ansible/cli/adhoc.py,sha256=nIMg7xxrJfnZ5IOyY4pWRb1A40O13mRcH2FII5YbNXY,8408
|
|
81
81
|
ansible/cli/config.py,sha256=PJ9hQPhPaX4OsJ3Y6B5KOII0b09RieAJRg7-jD3jg3A,28607
|
|
82
82
|
ansible/cli/console.py,sha256=F9jL6C3LTZBBD_0OIanGyM86PfxCSAe-gcvv7bqmt58,22002
|
|
83
|
-
ansible/cli/doc.py,sha256=
|
|
83
|
+
ansible/cli/doc.py,sha256=7TWTuDsHkIJDrvDhK98SpHUt9RLBmJp5N82Plg2JXO8,73387
|
|
84
84
|
ansible/cli/galaxy.py,sha256=ldWsmRxTCN-HXipw1TZvDRJjYLZDPwS_LYIKcEZabqE,95246
|
|
85
85
|
ansible/cli/inventory.py,sha256=atRek-BmCrBIQqqqJ7SXxU5rZkmnQ4Rv9iKYuo2fdZE,16035
|
|
86
86
|
ansible/cli/playbook.py,sha256=yPOYqwH5qcI6uCVI2k4GrSB0thWQLjlauJOD-sFx11I,10546
|
|
87
87
|
ansible/cli/pull.py,sha256=Bvc59o9KbLRlcKTCb_pzr-vcs2owDuThpQJlK05xYM8,18425
|
|
88
88
|
ansible/cli/vault.py,sha256=bG_8LZ697ohjjJqb7aDryQmc9ahQggiZA2IPmgyTDnA,23195
|
|
89
89
|
ansible/cli/arguments/__init__.py,sha256=_4taT82hZKKTzhdXKmIgqxWwuG21XZxF874V2k1e3us,168
|
|
90
|
-
ansible/cli/arguments/option_helpers.py,sha256=
|
|
90
|
+
ansible/cli/arguments/option_helpers.py,sha256=dgyX82D4nYD0-HZ9jgafnWn3fnS_mOfRuoYnnxpxJ9w,24790
|
|
91
91
|
ansible/cli/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
92
92
|
ansible/cli/scripts/ansible_connection_cli_stub.py,sha256=Wz413NyoBudEJdQt6pw2UAB4IveHQma4XoHBzFSENt0,13122
|
|
93
93
|
ansible/collections/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
94
|
-
ansible/collections/list.py,sha256=
|
|
94
|
+
ansible/collections/list.py,sha256=kRYyW0UUu2Js5UuDW_pELrU3pQMPHSOW0hUXVA6b7-8,2977
|
|
95
95
|
ansible/compat/__init__.py,sha256=CvyoCuJ9EdeWO3_nj5fBSQ495YP0tCbXhQ6cramBdGY,1002
|
|
96
96
|
ansible/compat/importlib_resources.py,sha256=75SJApiBzBKuBDknj81vdfzSJSxc2Pi4YvgQkmmGtew,542
|
|
97
97
|
ansible/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
98
98
|
ansible/config/ansible_builtin_runtime.yml,sha256=nwL_-rqEEmpuSHxZH70pJBiEosDKOPkYIboH3_7LVEY,376076
|
|
99
|
-
ansible/config/base.yml,sha256=
|
|
99
|
+
ansible/config/base.yml,sha256=CsDvKqfA6NEGIGQGxmOYr02PDa8BxMcyNCKNC2mGkXY,90959
|
|
100
100
|
ansible/config/manager.py,sha256=GmL7LILfwf-9V3sYrqNtbjP4g8QYAtMRJCpSHCluDVc,32551
|
|
101
101
|
ansible/errors/__init__.py,sha256=W1s19PaheqXMI2yKnZCuaKKjSAJRPgU1_xF2_J9B1NU,16353
|
|
102
102
|
ansible/executor/__init__.py,sha256=mRvbCJPA-_veSG5ka3v04G5vsarLVDeB3EWFsu6geSI,749
|
|
@@ -106,7 +106,7 @@ ansible/executor/play_iterator.py,sha256=ybui896hQFJ4wLsYC3fZoJY4KEsX69QkCoMfomQ
|
|
|
106
106
|
ansible/executor/playbook_executor.py,sha256=5wjvqw22RG4g_JlYDQnLFrUEa8aYQBWdgKhEpNonhKQ,14806
|
|
107
107
|
ansible/executor/stats.py,sha256=Rw-Q73xYvXnYOt-LJFnHAR03NvVR3ESgbMkHnVGhIPI,3180
|
|
108
108
|
ansible/executor/task_executor.py,sha256=xjW5oy2oRRZZSxp1kfqK3hjDLe1iv7bwHr6n1HJEKY0,61485
|
|
109
|
-
ansible/executor/task_queue_manager.py,sha256=
|
|
109
|
+
ansible/executor/task_queue_manager.py,sha256=WG-46vXzz_hGuV9wzpui0UXad6Gj6uLuDSFolfDKxg4,20279
|
|
110
110
|
ansible/executor/task_result.py,sha256=e73P110j8hcw9wv8O7p-z6St5VIvyP6iOV4cW4sswV8,10254
|
|
111
111
|
ansible/executor/discovery/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
112
112
|
ansible/executor/powershell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -125,7 +125,7 @@ ansible/executor/powershell/psrp_put_file.ps1,sha256=8dIRjLNrji7_mjbG8-7lzV7WUuj
|
|
|
125
125
|
ansible/executor/powershell/winrm_fetch_file.ps1,sha256=wOgnMGFwNhq9c_-8kuGBNchGj69R0Udv-am39M3BEDw,979
|
|
126
126
|
ansible/executor/powershell/winrm_put_file.ps1,sha256=4qsc-GlqC3Z0E3fQSXkV6oMSVzxsS13ZwTXrx7krlgU,834
|
|
127
127
|
ansible/executor/process/__init__.py,sha256=mRvbCJPA-_veSG5ka3v04G5vsarLVDeB3EWFsu6geSI,749
|
|
128
|
-
ansible/executor/process/worker.py,sha256=
|
|
128
|
+
ansible/executor/process/worker.py,sha256=33B0FM5Om6BNIr-hA1es9q6yWKOu8Tlm26AdIM8DqV4,9546
|
|
129
129
|
ansible/galaxy/__init__.py,sha256=4yfCrbwz9fW-HABMhKPF0ko9_vLz7EMd9c-zg2tfqWU,2497
|
|
130
130
|
ansible/galaxy/api.py,sha256=bgrQdDdvVi33QlJrdZbqyiHajC3qpVmpOTukT-Hb8wU,40406
|
|
131
131
|
ansible/galaxy/role.py,sha256=_vEN3TDVVlvj38NdcS5KU-fe-gKSsks-Gg6O16ukcHU,21029
|
|
@@ -212,7 +212,7 @@ ansible/inventory/host.py,sha256=cZw906LeMYe6oF3ZxW6K2HWoW2Qc0jxHssg_C8cRumE,493
|
|
|
212
212
|
ansible/inventory/manager.py,sha256=fxg2sq7s-VBJnn9TvJCgv-xvYIu0DLJTix_y3w0wLcc,31811
|
|
213
213
|
ansible/module_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
214
214
|
ansible/module_utils/_text.py,sha256=VkWgAnSNVCbTQqZgllUObBFsH3uM4EUW5srl1UR9t1g,544
|
|
215
|
-
ansible/module_utils/ansible_release.py,sha256=
|
|
215
|
+
ansible/module_utils/ansible_release.py,sha256=RtW2wkAZbR1DKOK0OqZGINS6WXDQFJV7w-UgMdsKbNo,855
|
|
216
216
|
ansible/module_utils/api.py,sha256=8BmCzQtp9rClsLGlDn4I9iJrUFLCdnoEIxYX59_IL9c,5756
|
|
217
217
|
ansible/module_utils/basic.py,sha256=wdA7c-JBcn4obTlQQugJuiJAVtEZtOmMBpV02Izl_CM,90137
|
|
218
218
|
ansible/module_utils/connection.py,sha256=ZwtQEs-TtT-XecoEmFWiDevSkJLIj348YkiW6PP7G9E,7471
|
|
@@ -374,7 +374,7 @@ ansible/module_utils/facts/virtual/sunos.py,sha256=9wUiq-2oXlrZbaskVI9c8WmG206AH
|
|
|
374
374
|
ansible/module_utils/facts/virtual/sysctl.py,sha256=suvfSdKL5e_AAPCxE_EQRiqNHzpMJYSucT4URyn8Qxw,4741
|
|
375
375
|
ansible/module_utils/parsing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
376
376
|
ansible/module_utils/parsing/convert_bool.py,sha256=WN-LzXRsO96kNig3cngTu_3sjM2xxnoSXAqUfynhGQM,1265
|
|
377
|
-
ansible/module_utils/powershell/Ansible.ModuleUtils.AddType.psm1,sha256=
|
|
377
|
+
ansible/module_utils/powershell/Ansible.ModuleUtils.AddType.psm1,sha256=Pu4r0EJduybRublOWrs0sr0-zD6RfZUDqwJgntUFDuU,20218
|
|
378
378
|
ansible/module_utils/powershell/Ansible.ModuleUtils.ArgvParser.psm1,sha256=x9wTV5jOpoCtFbpZW6GoZEELdL3RNOhdY91QOhYxJqk,3327
|
|
379
379
|
ansible/module_utils/powershell/Ansible.ModuleUtils.Backup.psm1,sha256=ebgpraCNmPwswlLHShgiviTk2thw8ch3ekF5n_I_cXg,1104
|
|
380
380
|
ansible/module_utils/powershell/Ansible.ModuleUtils.CamelConversion.psm1,sha256=QHjUrv-qWwm3j3QJ-sN844f7B-Dzoadd6mxpQvFasgA,2456
|
|
@@ -430,7 +430,7 @@ ansible/modules/lineinfile.py,sha256=XElbV4fKfG70MDnlK3gC8hnbXslbNTscpdPaBGfKT1Q
|
|
|
430
430
|
ansible/modules/meta.py,sha256=0oLfvydcj8XeZsRR8yoRzgTINaPsEfl3-jxp1T-lzDM,7264
|
|
431
431
|
ansible/modules/mount_facts.py,sha256=vy9Eeu17_EMsJbxgc23pa7DDXwU8rg11WFJTqcLjMXo,26018
|
|
432
432
|
ansible/modules/package.py,sha256=xwiE0SDoz1Drrh_UjsRi7naAY9Xp4hpO_TbmLio2EFg,3877
|
|
433
|
-
ansible/modules/package_facts.py,sha256=
|
|
433
|
+
ansible/modules/package_facts.py,sha256=kdUJrxbL0lxToPhTdANcjUcpXMheVffryXFAAO-FaI4,17329
|
|
434
434
|
ansible/modules/pause.py,sha256=VzN_Ay94TYvBPTQRG0s0YTnXJkMTh8CEy2KostS2nVY,3796
|
|
435
435
|
ansible/modules/ping.py,sha256=80pw8eLBvT2pw8f0V3zxqExQhbsKKoA6YfPBvcncTng,2325
|
|
436
436
|
ansible/modules/pip.py,sha256=sX-pH2V-C5_ONsgzG55T-9ZDo5w-B8xBBqOUfhjSv-A,32397
|
|
@@ -463,7 +463,7 @@ ansible/modules/yum_repository.py,sha256=-N0ls91tk4NJIKttjMf_ZblekPdsxQCU3YLa46l
|
|
|
463
463
|
ansible/parsing/__init__.py,sha256=NMP9ZkK59SNdQktw76aWAXVAm5U2POXLgAK7wH-1h0g,742
|
|
464
464
|
ansible/parsing/ajson.py,sha256=nv82WTeWYuKdy4LE_YM6nhLR7eb-Tyr4F6arjTP8nmY,692
|
|
465
465
|
ansible/parsing/dataloader.py,sha256=_Az-XBPPcxS2b40v2KWIBO_X9N0HNJXdDOPS6DkS0eo,22721
|
|
466
|
-
ansible/parsing/mod_args.py,sha256=
|
|
466
|
+
ansible/parsing/mod_args.py,sha256=5-JzLXH1sW9XxyeZgNOEqWt8_I6cPl2C9VwZQ_3z1K8,15090
|
|
467
467
|
ansible/parsing/plugin_docs.py,sha256=UYWDpLCF4FrBU0lxgR6C2bkoa7N8TBplh4KcW-B6enk,6326
|
|
468
468
|
ansible/parsing/quoting.py,sha256=myYxG625XK6rgNULbBuKp23G2R83c0UilrF1ZImDjGs,1057
|
|
469
469
|
ansible/parsing/splitter.py,sha256=hgrgDTa8v6WVvya8I-2DJr9HfcgZeg6hMb9p4nSnE98,11604
|
|
@@ -479,22 +479,22 @@ ansible/parsing/yaml/objects.py,sha256=muP81NhLvhJAh9MZ5UTUp8AMUTkTKM4Pk-xl6gOeV
|
|
|
479
479
|
ansible/playbook/__init__.py,sha256=5FKnJsBz35UvBbwyiLrniAwkdse8jTRzjOrI0RLU05E,4766
|
|
480
480
|
ansible/playbook/attribute.py,sha256=kAWselKvFurdGC0EaKJLh8b9y7IWChZwXG648aH6S-4,7800
|
|
481
481
|
ansible/playbook/base.py,sha256=sXn9EqBkOrerwPTOSK8y-B_Brl9wTdBDZlGpCZcoMn4,35601
|
|
482
|
-
ansible/playbook/block.py,sha256=
|
|
482
|
+
ansible/playbook/block.py,sha256=yENLCXEPlvGxdb282kwNzDai8hfXt-5wJHUF3HBK6Is,16519
|
|
483
483
|
ansible/playbook/collectionsearch.py,sha256=XQp1SiXhLpx_L9mIMFKbbHND_wDwdZcJmFg-rk_Fbtk,1884
|
|
484
484
|
ansible/playbook/conditional.py,sha256=oq0Adm8LwibKuBC0LTk1TsQcqS1ZwPjSQuM2FUeip8g,1317
|
|
485
485
|
ansible/playbook/delegatable.py,sha256=BBcw2GU85V7ome7qX0KRg-vZyjv2J890kEHjYQOyoTk,625
|
|
486
486
|
ansible/playbook/handler.py,sha256=pXI3V0_C-ierWt09-uGZKkjpAe12wpKTTo0vV9drOco,2925
|
|
487
487
|
ansible/playbook/handler_task_include.py,sha256=kCrBThzmIRWKaecLl9UNB8VBvtVPI0dt8eHpBldsnlY,1391
|
|
488
|
-
ansible/playbook/helpers.py,sha256=
|
|
488
|
+
ansible/playbook/helpers.py,sha256=j9XbIBuvz0h-FLaDTUOjJTmr0dDlqy2dQU8DrN6Gu4w,15093
|
|
489
489
|
ansible/playbook/included_file.py,sha256=qRHaV-boz0skZ_fHBtsLIFlzV53EHKv1VZa6hCJsCMs,12027
|
|
490
490
|
ansible/playbook/loop_control.py,sha256=5rZz6aWXpvvwOD4CzrS_b_cnXIu4Gf56czkomX1NS7w,2022
|
|
491
491
|
ansible/playbook/notifiable.py,sha256=MQz4VZuOga35VLcdUxVd9FQVzFg-djtQZhs09DS2juA,299
|
|
492
|
-
ansible/playbook/play.py,sha256=
|
|
492
|
+
ansible/playbook/play.py,sha256=VVpfiA_5xCo8fgqJlq02JZp73ZHMIae62u9rIgzLstE,16731
|
|
493
493
|
ansible/playbook/play_context.py,sha256=7tl_ObKgN8guKk6G9R1oSWoFmePDwhEiDHw2eEn78Hk,13673
|
|
494
494
|
ansible/playbook/playbook_include.py,sha256=zTzEsS20DB9hSzRfU9DI4-BsteHwzWVshUF_SoIVVE0,5515
|
|
495
495
|
ansible/playbook/role_include.py,sha256=DV7num4uVJvkIY4IHgB0uHmE8-gRmaNYbuoqP0-7dTY,7610
|
|
496
496
|
ansible/playbook/taggable.py,sha256=0-MCLX6E_i5OjQjHEItyQxPwGztcRAryRE7dJTKAhcc,3645
|
|
497
|
-
ansible/playbook/task.py,sha256=
|
|
497
|
+
ansible/playbook/task.py,sha256=T74BFW333JMi-qSDIumplkdYkLAWKOsahPiaRZf_g18,26459
|
|
498
498
|
ansible/playbook/task_include.py,sha256=y7jSK7CqYEXmXShJOPUi3lCYuZI85197Gp4zLYsyUPw,5258
|
|
499
499
|
ansible/playbook/role/__init__.py,sha256=k7EZxR8-FsY_SWOS4lAauBOfX21lMEsFbuNg_mTOPLg,30668
|
|
500
500
|
ansible/playbook/role/definition.py,sha256=44IRVqojhemfrdC7bU7aIiYwcFm6kWr30Hn4x0B2Y8U,9477
|
|
@@ -551,7 +551,7 @@ ansible/plugins/cliconf/__init__.py,sha256=gmcmxY7ssnbeMSRNO8d3qag_QmqM9vkcdBT42
|
|
|
551
551
|
ansible/plugins/connection/__init__.py,sha256=5Dk6zdWL_uDwLk1Iy0WVyhqS55qytHMCr3Rt9pUfwfg,19506
|
|
552
552
|
ansible/plugins/connection/local.py,sha256=ooM9js5jPgJ70UpXIDNxtRkKKf6n9U_VrRBcrsdDdk8,12125
|
|
553
553
|
ansible/plugins/connection/paramiko_ssh.py,sha256=F6sjILG7nnC4cka-7kQotBcT_1yzU4WeaOTMKa3-OUQ,27681
|
|
554
|
-
ansible/plugins/connection/psrp.py,sha256=
|
|
554
|
+
ansible/plugins/connection/psrp.py,sha256=k8b39BhyWymKwXCWvfjOMCSXsqszOjoT9g7XCeE0UyE,30945
|
|
555
555
|
ansible/plugins/connection/ssh.py,sha256=AB2GvQnBXjoOM5HeLDZmIVBH5NQxPejz34vm_ow4fVc,71790
|
|
556
556
|
ansible/plugins/connection/winrm.py,sha256=-E6MpnAnXhWe6XmUA5t_5rgYaWGsUhl9BVzbsj5YlTg,38488
|
|
557
557
|
ansible/plugins/doc_fragments/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -661,7 +661,7 @@ ansible/plugins/inventory/script.py,sha256=kYQdNHM16TZXOGNNHEXYC0xuaDknylcZcj3DQ
|
|
|
661
661
|
ansible/plugins/inventory/toml.py,sha256=xZnpzVtxtCEZ1aBB0SpAjy2iO0qpL01-QVnCihiCBfQ,5577
|
|
662
662
|
ansible/plugins/inventory/yaml.py,sha256=Z6ANo6E20DM6Axs1cd6z7jUv5Tur-dHEtRsx0LmGm58,7530
|
|
663
663
|
ansible/plugins/lookup/__init__.py,sha256=95ildPoHi21L34ULD1h6mNknuQ3yrjZCBaE5rPdODi8,5523
|
|
664
|
-
ansible/plugins/lookup/config.py,sha256=
|
|
664
|
+
ansible/plugins/lookup/config.py,sha256=3ltQo3kECUM-BDNxT0HCUg7vaHYltuszdEOdOZHIuCw,5857
|
|
665
665
|
ansible/plugins/lookup/csvfile.py,sha256=HvzQSN2F6Lt_oyp12PzrcLAQTKc1NPWNszEw8WniImo,6487
|
|
666
666
|
ansible/plugins/lookup/dict.py,sha256=9LTeK9YZOG4U9l-2gy5Jp1sDqsXRlf4F3WbULV17pjE,2139
|
|
667
667
|
ansible/plugins/lookup/env.py,sha256=IEMZs0p_rLR4jcfJ-sNqJT8vijnH4-MNyNXM_ttuqJ4,2620
|
|
@@ -691,7 +691,7 @@ ansible/plugins/shell/__init__.py,sha256=yxBEqC2gM7lD6d1BNrzcOWgGbZJnIsvNARcbO83
|
|
|
691
691
|
ansible/plugins/shell/cmd.py,sha256=tH1OZ9RKtNOzOjIJ_XlPcnz0T29LLkIl7X6qlDXZHGA,2170
|
|
692
692
|
ansible/plugins/shell/powershell.py,sha256=XIkaH1cRCLWtV6JmhxljeAGVZIZv6KtG-EP_krickN8,17926
|
|
693
693
|
ansible/plugins/shell/sh.py,sha256=WhhXBH0ZTBeoUHEtSHS5N9jekxzRNZkSe-d1BYGle10,3687
|
|
694
|
-
ansible/plugins/strategy/__init__.py,sha256=
|
|
694
|
+
ansible/plugins/strategy/__init__.py,sha256=_m8n61VHXwxM6oy5w-LX6auPq0Al-dwUbev6rT9nhgM,56393
|
|
695
695
|
ansible/plugins/strategy/debug.py,sha256=LJaaals9GQq82Idq4D39NnJrYZPcZiLcu14GsIb3SI8,1205
|
|
696
696
|
ansible/plugins/strategy/free.py,sha256=gnH0U1BzBzvU0SuOYgFt7A315XQiIvvgHmxR9cLyxoA,15656
|
|
697
697
|
ansible/plugins/strategy/host_pinned.py,sha256=sVB_qb26bByZKjr8AdvBrLHkt-6VyFGjFcVj1udcFvk,1875
|
|
@@ -790,12 +790,12 @@ ansible/vars/hostvars.py,sha256=cRK_4dssUwIN4aDxxYXEj7KzTazrykQ4PbJotne5oJc,4364
|
|
|
790
790
|
ansible/vars/manager.py,sha256=1SNGcwMTT7m8aPC45DHdkOZRtnf7OEcuExBtocJusq4,28023
|
|
791
791
|
ansible/vars/plugins.py,sha256=8svEABS2yBPzEdymdsrZ-0D70boUoCNvcgkWasvtVNo,4533
|
|
792
792
|
ansible/vars/reserved.py,sha256=NgxlMBm_tloqDVb5TEX4eGhpYsz_AO6-Fmyi3kJpIFk,3107
|
|
793
|
-
ansible_core-2.19.
|
|
794
|
-
ansible_core-2.19.
|
|
795
|
-
ansible_core-2.19.
|
|
796
|
-
ansible_core-2.19.
|
|
797
|
-
ansible_core-2.19.
|
|
798
|
-
ansible_core-2.19.
|
|
793
|
+
ansible_core-2.19.4rc1.dist-info/licenses/COPYING,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
794
|
+
ansible_core-2.19.4rc1.dist-info/licenses/licenses/Apache-License.txt,sha256=y16Ofl9KOYjhBjwULGDcLfdWBfTEZRXnduOspt-XbhQ,11325
|
|
795
|
+
ansible_core-2.19.4rc1.dist-info/licenses/licenses/BSD-3-Clause.txt,sha256=la0N3fE3Se8vBiuvUcFKA8b-E41G7flTic6P8CkUroE,1548
|
|
796
|
+
ansible_core-2.19.4rc1.dist-info/licenses/licenses/MIT-license.txt,sha256=jLXp2XurnyZKbye40g9tfmLGtVlxh3pPD4n8xNqX8xc,1023
|
|
797
|
+
ansible_core-2.19.4rc1.dist-info/licenses/licenses/PSF-license.txt,sha256=g7BC_H1qyg8Q1o5F76Vrm8ChSWYI5-dyj-CdGlNKBUo,2484
|
|
798
|
+
ansible_core-2.19.4rc1.dist-info/licenses/licenses/simplified_bsd.txt,sha256=8R5R7R7sOa0h1Fi6RNgFgHowHBfun-OVOMzJ4rKAk2w,1237
|
|
799
799
|
ansible_test/__init__.py,sha256=20VPOj11c6Ut1Av9RaurgwJvFhMqkWG3vAvcCbecNKw,66
|
|
800
800
|
ansible_test/_data/ansible.cfg,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
801
801
|
ansible_test/_data/coveragerc,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -1092,8 +1092,8 @@ ansible_test/config/cloud-config-vultr.ini.template,sha256=XLKHk3lg_8ReQMdWfZzhh
|
|
|
1092
1092
|
ansible_test/config/config.yml,sha256=1zdGucnIl6nIecZA7ISIANvqXiHWqq6Dthsk_6MUwNc,2642
|
|
1093
1093
|
ansible_test/config/inventory.networking.template,sha256=bFNSk8zNQOaZ_twaflrY0XZ9mLwUbRLuNT0BdIFwvn4,1335
|
|
1094
1094
|
ansible_test/config/inventory.winrm.template,sha256=1QU8W-GFLnYEw8yY9bVIvUAVvJYPM3hyoijf6-M7T00,1098
|
|
1095
|
-
ansible_core-2.19.
|
|
1096
|
-
ansible_core-2.19.
|
|
1097
|
-
ansible_core-2.19.
|
|
1098
|
-
ansible_core-2.19.
|
|
1099
|
-
ansible_core-2.19.
|
|
1095
|
+
ansible_core-2.19.4rc1.dist-info/METADATA,sha256=FqcRN7GgAuNp_z0d6AxcsKj5o56qFiGrHvWc0IgLBnM,7733
|
|
1096
|
+
ansible_core-2.19.4rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
1097
|
+
ansible_core-2.19.4rc1.dist-info/entry_points.txt,sha256=S9yJij5Im6FgRQxzkqSCnPQokC7PcWrDW_NSygZczJU,451
|
|
1098
|
+
ansible_core-2.19.4rc1.dist-info/top_level.txt,sha256=IFbRLjAvih1DYzJWg3_F6t4sCzEMxRO7TOMNs6GkYHo,21
|
|
1099
|
+
ansible_core-2.19.4rc1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|