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.

Files changed (29) hide show
  1. ansible/cli/arguments/option_helpers.py +9 -5
  2. ansible/cli/doc.py +3 -1
  3. ansible/collections/list.py +4 -2
  4. ansible/config/base.yml +2 -0
  5. ansible/executor/process/worker.py +17 -11
  6. ansible/executor/task_queue_manager.py +43 -1
  7. ansible/module_utils/ansible_release.py +1 -1
  8. ansible/module_utils/powershell/Ansible.ModuleUtils.AddType.psm1 +9 -7
  9. ansible/modules/package_facts.py +5 -5
  10. ansible/parsing/mod_args.py +3 -0
  11. ansible/playbook/block.py +1 -3
  12. ansible/playbook/helpers.py +15 -13
  13. ansible/playbook/play.py +3 -13
  14. ansible/playbook/task.py +42 -7
  15. ansible/plugins/connection/psrp.py +11 -6
  16. ansible/plugins/lookup/config.py +19 -36
  17. ansible/plugins/strategy/__init__.py +1 -1
  18. ansible/release.py +1 -1
  19. {ansible_core-2.19.3rc1.dist-info → ansible_core-2.19.4rc1.dist-info}/METADATA +1 -1
  20. {ansible_core-2.19.3rc1.dist-info → ansible_core-2.19.4rc1.dist-info}/RECORD +29 -29
  21. {ansible_core-2.19.3rc1.dist-info → ansible_core-2.19.4rc1.dist-info}/WHEEL +0 -0
  22. {ansible_core-2.19.3rc1.dist-info → ansible_core-2.19.4rc1.dist-info}/entry_points.txt +0 -0
  23. {ansible_core-2.19.3rc1.dist-info → ansible_core-2.19.4rc1.dist-info}/licenses/COPYING +0 -0
  24. {ansible_core-2.19.3rc1.dist-info → ansible_core-2.19.4rc1.dist-info}/licenses/licenses/Apache-License.txt +0 -0
  25. {ansible_core-2.19.3rc1.dist-info → ansible_core-2.19.4rc1.dist-info}/licenses/licenses/BSD-3-Clause.txt +0 -0
  26. {ansible_core-2.19.3rc1.dist-info → ansible_core-2.19.4rc1.dist-info}/licenses/licenses/MIT-license.txt +0 -0
  27. {ansible_core-2.19.3rc1.dist-info → ansible_core-2.19.4rc1.dist-info}/licenses/licenses/PSF-license.txt +0 -0
  28. {ansible_core-2.19.3rc1.dist-info → ansible_core-2.19.4rc1.dist-info}/licenses/licenses/simplified_bsd.txt +0 -0
  29. {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
- help='condense output', deprecated=DeprecatedArgument(version='2.23'))
449
- parser.add_argument('-t', '--tree', dest='tree', default=None,
450
- help='log output to this directory', deprecated=DeprecatedArgument(version='2.23'))
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 = _get_collection_name_from_path(b_path)
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):
@@ -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 = _get_collection_name_from_path(candidate)
21
- collections[collection] = candidate
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
@@ -2257,6 +2257,8 @@ _Z_TEST_ENTRY:
2257
2257
  why: for testing
2258
2258
  version: '3.30'
2259
2259
  alternatives: nothing
2260
+ vars:
2261
+ - name: _z_test_entry
2260
2262
  _Z_TEST_ENTRY_2:
2261
2263
  version_added: '2.18'
2262
2264
  name: testentry
@@ -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
- terminate the process group created by calling setsid when
108
- a terminate signal is received by the fork
109
- """
110
- os.killpg(self.pid, signum)
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
- self._workers: list[WorkerProcess | None] = [None] * num
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
  """
@@ -17,6 +17,6 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
- __version__ = '2.19.3rc1'
20
+ __version__ = '2.19.4rc1'
21
21
  __author__ = 'Ansible, Inc.'
22
22
  __codename__ = "What Is and What Should Never Be"
@@ -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 write a warning instead of failing.
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
- $msg = "Failed to cleanup temporary directory '$temp_path' used for compiling C# code."
397
- if ($AnsibleModule) {
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
  }
@@ -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):
@@ -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 ((task.action in C._ACTION_META and task.implicit) or
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
 
@@ -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.post_validate(templar=templar)
173
- parent_include_dir = os.path.dirname(parent_include.args.get('_raw_params'))
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.resolved_action = 'ansible.builtin.meta'
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
- if self.tags:
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.resolved_action: str | None = None
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.resolved_action = module_or_action_context.resolved_fqcn
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.resolved_action = self.resolved_action
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['resolved_action'] = self.resolved_action
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.resolved_action = data.get('resolved_action')
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(resolved_action=self.resolved_action)
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
- rc, stdout, stderr = self._exec_psrp_script(
483
- script=script,
484
- input_data=pwsh_in_data.splitlines() if pwsh_in_data else None,
485
- arguments=script_args,
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:
@@ -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
- if pname:
140
- result, origin = _get_plugin_config(pname, ptype, term, variables)
141
- else:
142
- result = _get_global_config(term)
143
- except AnsibleUndefinedConfigEntry:
144
- if missing == 'error':
145
- raise
146
- elif missing == 'warn':
147
- self._display.warning(f"Skipping, did not find setting {term!r}.")
148
- elif missing == 'skip':
149
- pass # this is not needed, but added to have all 3 options stated
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.resolved_action = 'ansible.builtin.meta' # _post_validate_args is never called for meta actions, so resolved_action hasn't been set
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
@@ -17,6 +17,6 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
- __version__ = '2.19.3rc1'
20
+ __version__ = '2.19.4rc1'
21
21
  __author__ = 'Ansible, Inc.'
22
22
  __codename__ = "What Is and What Should Never Be"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ansible-core
3
- Version: 2.19.3rc1
3
+ Version: 2.19.4rc1
4
4
  Summary: Radically simple IT automation
5
5
  Author: Ansible Project
6
6
  Project-URL: Homepage, https://ansible.com/
@@ -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=lcvmjO3YXpSUFX9VZTDgNKL9GXVQg_mji2fnNkk8eMg,855
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=aBxvQgf28oMzSqr9CWgno5JkpZz_i8Kp4DO8_QMK9aY,73284
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=8noVj3Oatvk5rQNi5l2a4J5MyS_N5EtsNg5HbAILR2Q,24455
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=PhQU6f7-bieg892uWnSg_8Cg4etbDnQUbR5a6SOnydk,2873
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=fU9zLlHOszyFua35JZCOrPK4XuIkNSRGC6PhTDst4AM,90925
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=QiakfDZUCyrhJLSNxUGNjUlsqscCI-YM1G2cLqVb_Qk,18805
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=naHBOczo6w0ah2j3e843K1hzReQp9WYY9vspx0cH5cQ,9450
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=lcvmjO3YXpSUFX9VZTDgNKL9GXVQg_mji2fnNkk8eMg,855
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=SI_yFbGgNN0xPrqekIahsT-_5ZjobpkXrO7iGEh953c,20126
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=Tvq3ULR8oyIx-lCJzY-wwWlL2gGiwLq9jS5H8Hjmick,17284
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=c0zY6WaKOYLapiu8hRKukzvoX5iGq0inCzW-6RA6Bl0,14947
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=m-MGJu0x_8f-zmFBWyOBNpJsyqDXFgW3-ROvsx0u1eg,16628
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=iU88Jq3dseNIG3IcvwgUZIICJ3PalsGSfhu22pNLmOY,14963
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=RHxQgshU6c7t8qFCBdZOutdXjRjrWeqWItPJJSw2GJE,17357
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=LYMW_UEARc1ILIIUM9I_y5zbeyUGUfRddFWwlbW8pno,24567
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=BZrcc6wu5kZrYs0S0vTnnoV2XXlt98-KcIoR70skSpA,30736
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=9IHIWhAcflC-Gm-1RVPcIVMmaULYhUbwoKLTBBzqxkA,6186
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=nRyfddG4w_NmtaGjVGF4mhpYdQwx2CmKn8CTJ6YBSHg,56392
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.3rc1.dist-info/licenses/COPYING,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
794
- ansible_core-2.19.3rc1.dist-info/licenses/licenses/Apache-License.txt,sha256=y16Ofl9KOYjhBjwULGDcLfdWBfTEZRXnduOspt-XbhQ,11325
795
- ansible_core-2.19.3rc1.dist-info/licenses/licenses/BSD-3-Clause.txt,sha256=la0N3fE3Se8vBiuvUcFKA8b-E41G7flTic6P8CkUroE,1548
796
- ansible_core-2.19.3rc1.dist-info/licenses/licenses/MIT-license.txt,sha256=jLXp2XurnyZKbye40g9tfmLGtVlxh3pPD4n8xNqX8xc,1023
797
- ansible_core-2.19.3rc1.dist-info/licenses/licenses/PSF-license.txt,sha256=g7BC_H1qyg8Q1o5F76Vrm8ChSWYI5-dyj-CdGlNKBUo,2484
798
- ansible_core-2.19.3rc1.dist-info/licenses/licenses/simplified_bsd.txt,sha256=8R5R7R7sOa0h1Fi6RNgFgHowHBfun-OVOMzJ4rKAk2w,1237
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.3rc1.dist-info/METADATA,sha256=KxL79sqEIIrpM9WJk3nce0YhUGg9Wm4zm_4gzPTWpu0,7733
1096
- ansible_core-2.19.3rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1097
- ansible_core-2.19.3rc1.dist-info/entry_points.txt,sha256=S9yJij5Im6FgRQxzkqSCnPQokC7PcWrDW_NSygZczJU,451
1098
- ansible_core-2.19.3rc1.dist-info/top_level.txt,sha256=IFbRLjAvih1DYzJWg3_F6t4sCzEMxRO7TOMNs6GkYHo,21
1099
- ansible_core-2.19.3rc1.dist-info/RECORD,,
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,,