ansible-core 2.17.7__py3-none-any.whl → 2.17.8rc1__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/vault.py CHANGED
@@ -138,11 +138,12 @@ class VaultCLI(CLI):
138
138
  raise AnsibleOptionsError("At most one input file may be used with the --output option")
139
139
 
140
140
  if options.action == 'encrypt_string':
141
- if '-' in options.args or not options.args or options.encrypt_string_stdin_name:
141
+ if '-' in options.args or options.encrypt_string_stdin_name or (not options.args and not options.encrypt_string_prompt):
142
+ # prompting from stdin and reading from stdin are mutually exclusive, if stdin is still provided, it is ignored
142
143
  self.encrypt_string_read_stdin = True
143
144
 
144
- # TODO: prompting from stdin and reading from stdin seem mutually exclusive, but verify that.
145
145
  if options.encrypt_string_prompt and self.encrypt_string_read_stdin:
146
+ # should only trigger if prompt + either - or encrypt string stdin name were provided
146
147
  raise AnsibleOptionsError('The --prompt option is not supported if also reading input from stdin')
147
148
 
148
149
  return options
@@ -19,7 +19,7 @@ from __future__ import annotations
19
19
 
20
20
  import multiprocessing.synchronize
21
21
 
22
- from multiprocessing import Lock
22
+ from ansible.utils.multiprocessing import context as multiprocessing_context
23
23
 
24
24
  from ansible.module_utils.facts.system.pkg_mgr import PKG_MGRS
25
25
 
@@ -32,7 +32,7 @@ if 'action_write_locks' not in globals():
32
32
  # Below is a Lock for use when we weren't expecting a named module. It gets used when an action
33
33
  # plugin invokes a module whose name does not match with the action's name. Slightly less
34
34
  # efficient as all processes with unexpected module names will wait on this lock
35
- action_write_locks[None] = Lock()
35
+ action_write_locks[None] = multiprocessing_context.Lock()
36
36
 
37
37
  # These plugins are known to be called directly by action plugins with names differing from the
38
38
  # action plugin name. We precreate them here as an optimization.
@@ -41,4 +41,4 @@ if 'action_write_locks' not in globals():
41
41
 
42
42
  mods.update(('copy', 'file', 'setup', 'slurp', 'stat'))
43
43
  for mod_name in mods:
44
- action_write_locks[mod_name] = Lock()
44
+ action_write_locks[mod_name] = multiprocessing_context.Lock()
@@ -1044,18 +1044,6 @@ class TaskExecutor:
1044
1044
  option_vars = C.config.get_plugin_vars('connection', self._connection._load_name)
1045
1045
  varnames.extend(option_vars)
1046
1046
 
1047
- # create dict of 'templated vars'
1048
- options = {'_extras': {}}
1049
- for k in option_vars:
1050
- if k in variables:
1051
- options[k] = templar.template(variables[k])
1052
-
1053
- # add extras if plugin supports them
1054
- if getattr(self._connection, 'allow_extras', False):
1055
- for k in variables:
1056
- if k.startswith('ansible_%s_' % self._connection.extras_prefix) and k not in options:
1057
- options['_extras'][k] = templar.template(variables[k])
1058
-
1059
1047
  task_keys = self._task.dump_attrs()
1060
1048
 
1061
1049
  # The task_keys 'timeout' attr is the task's timeout, not the connection timeout.
@@ -1073,7 +1061,8 @@ class TaskExecutor:
1073
1061
  del task_keys['retries']
1074
1062
 
1075
1063
  # set options with 'templated vars' specific to this plugin and dependent ones
1076
- self._connection.set_options(task_keys=task_keys, var_options=options)
1064
+ var_options = self._connection._resolve_option_variables(variables, templar)
1065
+ self._connection.set_options(task_keys=task_keys, var_options=var_options)
1077
1066
  varnames.extend(self._set_plugin_options('shell', variables, templar, task_keys))
1078
1067
 
1079
1068
  if self._connection.become is not None:
@@ -39,7 +39,6 @@ from ansible.plugins.loader import callback_loader, strategy_loader, module_load
39
39
  from ansible.plugins.callback import CallbackBase
40
40
  from ansible.template import Templar
41
41
  from ansible.vars.hostvars import HostVars
42
- from ansible.vars.reserved import warn_if_reserved
43
42
  from ansible.utils.display import Display
44
43
  from ansible.utils.lock import lock_decorator
45
44
  from ansible.utils.multiprocessing import context as multiprocessing_context
@@ -282,7 +281,6 @@ class TaskQueueManager:
282
281
 
283
282
  all_vars = self._variable_manager.get_vars(play=play)
284
283
  templar = Templar(loader=self._loader, variables=all_vars)
285
- warn_if_reserved(all_vars, templar.environment.globals.keys())
286
284
 
287
285
  new_play = play.copy()
288
286
  new_play.post_validate(templar)
@@ -17,6 +17,6 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
- __version__ = '2.17.7'
20
+ __version__ = '2.17.8rc1'
21
21
  __author__ = 'Ansible, Inc.'
22
22
  __codename__ = "Gallows Pole"
@@ -1210,7 +1210,7 @@ namespace Ansible.Basic
1210
1210
  object val = requiredCheck[1];
1211
1211
  IList requirements = (IList)requiredCheck[2];
1212
1212
 
1213
- if (ParseStr(param[key]) != ParseStr(val))
1213
+ if (param[key] == null || ParseStr(param[key]) != ParseStr(val))
1214
1214
  continue;
1215
1215
 
1216
1216
  string term = "all";
@@ -113,7 +113,13 @@ class CollectorMetaDataCollector(collector.BaseFactCollector):
113
113
  self.module_setup = module_setup
114
114
 
115
115
  def collect(self, module=None, collected_facts=None):
116
+ # NOTE: deprecate/remove once DT lands
117
+ # we can return this data, but should not be top level key
116
118
  meta_facts = {'gather_subset': self.gather_subset}
119
+
120
+ # NOTE: this is just a boolean indicator that 'facts were gathered'
121
+ # and should be moved to the 'gather_facts' action plugin
122
+ # probably revised to handle modules/subsets combos
117
123
  if self.module_setup:
118
124
  meta_facts['module_setup'] = self.module_setup
119
125
  return meta_facts
ansible/playbook/play.py CHANGED
@@ -31,7 +31,6 @@ from ansible.playbook.helpers import load_list_of_blocks, load_list_of_roles
31
31
  from ansible.playbook.role import Role, hash_params
32
32
  from ansible.playbook.task import Task
33
33
  from ansible.playbook.taggable import Taggable
34
- from ansible.vars.manager import preprocess_vars
35
34
  from ansible.utils.display import Display
36
35
 
37
36
  display = Display()
@@ -245,6 +244,9 @@ class Play(Base, Taggable, CollectionSearch):
245
244
  return self.roles
246
245
 
247
246
  def _load_vars_prompt(self, attr, ds):
247
+ # avoid circular dep
248
+ from ansible.vars.manager import preprocess_vars
249
+
248
250
  new_ds = preprocess_vars(ds)
249
251
  vars_prompts = []
250
252
  if new_ds is not None:
@@ -26,7 +26,7 @@ import tempfile
26
26
  import traceback
27
27
 
28
28
  from ansible import constants as C
29
- from ansible.errors import AnsibleError, AnsibleFileNotFound
29
+ from ansible.errors import AnsibleError, AnsibleActionFail, AnsibleFileNotFound
30
30
  from ansible.module_utils.basic import FILE_COMMON_ARGUMENTS
31
31
  from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text
32
32
  from ansible.module_utils.parsing.convert_bool import boolean
@@ -414,6 +414,11 @@ class ActionModule(ActionBase):
414
414
  result = super(ActionModule, self).run(tmp, task_vars)
415
415
  del tmp # tmp no longer has any effect
416
416
 
417
+ # ensure user is not setting internal parameters
418
+ for internal in ('_original_basename', '_diff_peek'):
419
+ if self._task.args.get(internal, None) is not None:
420
+ raise AnsibleActionFail(f'Invalid parameter specified: "{internal}"')
421
+
417
422
  source = self._task.args.get('src', None)
418
423
  content = self._task.args.get('content', None)
419
424
  dest = self._task.args.get('dest', None)
@@ -8,6 +8,7 @@ import time
8
8
  import typing as t
9
9
 
10
10
  from ansible import constants as C
11
+ from ansible.errors import AnsibleActionFail
11
12
  from ansible.executor.module_common import get_action_args_with_defaults
12
13
  from ansible.module_utils.parsing.convert_bool import boolean
13
14
  from ansible.plugins.action import ActionBase
@@ -61,6 +62,7 @@ class ActionModule(ActionBase):
61
62
  return mod_args
62
63
 
63
64
  def _combine_task_result(self, result: dict[str, t.Any], task_result: dict[str, t.Any]) -> dict[str, t.Any]:
65
+ """ builds the final result to return """
64
66
  filtered_res = {
65
67
  'ansible_facts': task_result.get('ansible_facts', {}),
66
68
  'warnings': task_result.get('warnings', []),
@@ -70,6 +72,33 @@ class ActionModule(ActionBase):
70
72
  # on conflict the last plugin processed wins, but try to do deep merge and append to lists.
71
73
  return merge_hash(result, filtered_res, list_merge='append_rp')
72
74
 
75
+ def _handle_smart(self, modules: list, task_vars: dict[str, t.Any]):
76
+ """ Updates the module list when 'smart' is used, lookup network os mappings or use setup, warn when things seem inconsistent """
77
+
78
+ if 'smart' not in modules:
79
+ return
80
+
81
+ modules.pop(modules.index('smart')) # remove as this will cause 'module not found' errors
82
+ network_os = self._task.args.get('network_os', task_vars.get('ansible_network_os', task_vars.get('ansible_facts', {}).get('network_os')))
83
+
84
+ if network_os:
85
+
86
+ connection_map = C.config.get_config_value('CONNECTION_FACTS_MODULES', variables=task_vars)
87
+ if network_os in connection_map:
88
+ modules.append(connection_map[network_os])
89
+ elif not modules:
90
+ raise AnsibleActionFail(f"No fact modules available and we could not find a fact module for your network OS ({network_os}), "
91
+ "try setting one via the `FACTS_MODULES` configuration.")
92
+
93
+ if set(modules).intersection(set(C._ACTION_SETUP)):
94
+ # most don't realize how setup works with networking connection plugins (forced_local)
95
+ self._display.warning("Detected 'setup' module and a network OS is set, the output when running it will reflect 'localhost'"
96
+ " and not the target when a netwoking connection plugin is used.")
97
+
98
+ elif not set(modules).difference(set(C._ACTION_SETUP)):
99
+ # no network OS and setup not in list, add setup by default since 'smart'
100
+ modules.append('ansible.legacy.setup')
101
+
73
102
  def run(self, tmp: t.Optional[str] = None, task_vars: t.Optional[dict[str, t.Any]] = None) -> dict[str, t.Any]:
74
103
 
75
104
  result = super(ActionModule, self).run(tmp, task_vars)
@@ -77,13 +106,9 @@ class ActionModule(ActionBase):
77
106
 
78
107
  # copy the value with list() so we don't mutate the config
79
108
  modules = list(C.config.get_config_value('FACTS_MODULES', variables=task_vars))
109
+ self._handle_smart(modules, task_vars)
80
110
 
81
111
  parallel = task_vars.pop('ansible_facts_parallel', self._task.args.pop('parallel', None))
82
- if 'smart' in modules:
83
- connection_map = C.config.get_config_value('CONNECTION_FACTS_MODULES', variables=task_vars)
84
- network_os = self._task.args.get('network_os', task_vars.get('ansible_network_os', task_vars.get('ansible_facts', {}).get('network_os')))
85
- modules.extend([connection_map.get(network_os or self._connection.ansible_name, 'ansible.legacy.setup')])
86
- modules.pop(modules.index('smart'))
87
112
 
88
113
  failed = {}
89
114
  skipped = {}
@@ -285,6 +285,27 @@ class ConnectionBase(AnsiblePlugin):
285
285
  display.debug('Set connection var {0} to {1}'.format(varname, value))
286
286
  variables[varname] = value
287
287
 
288
+ def _resolve_option_variables(self, variables, templar):
289
+ """
290
+ Return a dict of variable -> templated value, for any variables that
291
+ that match options registered by this plugin.
292
+ """
293
+ # create dict of 'templated vars'
294
+ var_options = {
295
+ '_extras': {},
296
+ }
297
+ for var_name in C.config.get_plugin_vars('connection', self._load_name):
298
+ if var_name in variables:
299
+ var_options[var_name] = templar.template(variables[var_name])
300
+
301
+ # add extras if plugin supports them
302
+ if getattr(self, 'allow_extras', False):
303
+ for var_name in variables:
304
+ if var_name.startswith(f'ansible_{self.extras_prefix}_') and var_name not in var_options:
305
+ var_options['_extras'][var_name] = templar.template(variables[var_name])
306
+
307
+ return var_options
308
+
288
309
 
289
310
  class NetworkConnectionBase(ConnectionBase):
290
311
  """
@@ -8,6 +8,9 @@ DOCUMENTATION:
8
8
  - Maps to Python's C(re.search).
9
9
  - 'The substring matched by the group is accessible via the symbolic group name or
10
10
  the ``\{number}`` special sequence. See examples section.'
11
+ - The return for no match will be C(None) in most cases, depending on whether it is used with other filters/tests or not.
12
+ It also depends on the Jinja version used and whether native is enabled.
13
+ - "For a more complete explanation see U(https://docs.ansible.com/ansible-core/devel/reference_appendices/faq.html#why-does-the-regex-search-filter-return-none-instead-of-an-empty-string)."
11
14
  positional: _input, _regex
12
15
  options:
13
16
  _input:
@@ -52,5 +55,5 @@ EXAMPLES: |
52
55
 
53
56
  RETURN:
54
57
  _value:
55
- description: Matched string or empty string if no match.
58
+ description: Matched string or if no match a C(None) or an empty string (see notes)
56
59
  type: str
@@ -28,7 +28,7 @@ import time
28
28
  import typing as t
29
29
 
30
30
  from collections import deque
31
- from multiprocessing import Lock
31
+
32
32
 
33
33
  from jinja2.exceptions import UndefinedError
34
34
 
@@ -55,6 +55,7 @@ from ansible.utils.fqcn import add_internal_fqcns
55
55
  from ansible.utils.unsafe_proxy import wrap_var
56
56
  from ansible.utils.sentinel import Sentinel
57
57
  from ansible.utils.vars import combine_vars
58
+ from ansible.utils.multiprocessing import context as multiprocessing_context
58
59
  from ansible.vars.clean import strip_internal_keys, module_response_deepcopy
59
60
 
60
61
  display = Display()
@@ -365,7 +366,7 @@ class StrategyBase:
365
366
 
366
367
  if task.action not in action_write_locks.action_write_locks:
367
368
  display.debug('Creating lock for %s' % task.action)
368
- action_write_locks.action_write_locks[task.action] = Lock()
369
+ action_write_locks.action_write_locks[task.action] = multiprocessing_context.Lock()
369
370
 
370
371
  # create a templar and template things we need later for the queuing process
371
372
  templar = Templar(loader=self._loader, variables=task_vars)
@@ -1059,7 +1060,8 @@ class StrategyBase:
1059
1060
  del self._active_connections[target_host]
1060
1061
  else:
1061
1062
  connection = plugin_loader.connection_loader.get(play_context.connection, play_context, os.devnull)
1062
- connection.set_options(task_keys=task.dump_attrs(), var_options=all_vars)
1063
+ var_options = connection._resolve_option_variables(all_vars, templar)
1064
+ connection.set_options(task_keys=task.dump_attrs(), var_options=var_options)
1063
1065
  play_context.set_attributes_from_plugin(connection)
1064
1066
 
1065
1067
  if connection:
ansible/release.py CHANGED
@@ -17,6 +17,6 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
- __version__ = '2.17.7'
20
+ __version__ = '2.17.8rc1'
21
21
  __author__ = 'Ansible, Inc.'
22
22
  __codename__ = "Gallows Pole"
ansible/vars/manager.py CHANGED
@@ -41,6 +41,7 @@ from ansible.utils.vars import combine_vars, load_extra_vars, load_options_vars
41
41
  from ansible.utils.unsafe_proxy import wrap_var
42
42
  from ansible.vars.clean import namespace_facts, clean_facts
43
43
  from ansible.vars.plugins import get_vars_from_inventory_sources, get_vars_from_path
44
+ from ansible.vars.reserved import warn_if_reserved
44
45
 
45
46
  display = Display()
46
47
 
@@ -417,6 +418,9 @@ class VariableManager:
417
418
  # extra vars
418
419
  all_vars = _combine_and_track(all_vars, self._extra_vars, "extra vars")
419
420
 
421
+ # before we add 'reserved vars', check we didn't add any reserved vars
422
+ warn_if_reserved(all_vars.keys())
423
+
420
424
  # magic variables
421
425
  all_vars = _combine_and_track(all_vars, magic_variables, "magic vars")
422
426
 
@@ -703,6 +707,7 @@ class VariableManager:
703
707
  if not isinstance(facts, Mapping):
704
708
  raise AnsibleAssertionError("the type of 'facts' to set for host_facts should be a Mapping but is a %s" % type(facts))
705
709
 
710
+ warn_if_reserved(facts.keys())
706
711
  try:
707
712
  host_cache = self._fact_cache[host]
708
713
  except KeyError:
@@ -726,15 +731,18 @@ class VariableManager:
726
731
  if not isinstance(facts, Mapping):
727
732
  raise AnsibleAssertionError("the type of 'facts' to set for nonpersistent_facts should be a Mapping but is a %s" % type(facts))
728
733
 
734
+ warn_if_reserved(facts.keys())
729
735
  try:
730
736
  self._nonpersistent_fact_cache[host] |= facts
731
737
  except KeyError:
732
738
  self._nonpersistent_fact_cache[host] = facts
733
739
 
734
740
  def set_host_variable(self, host, varname, value):
735
- '''
741
+ """
736
742
  Sets a value in the vars_cache for a host.
737
- '''
743
+ """
744
+
745
+ warn_if_reserved(varname)
738
746
  if host not in self._vars_cache:
739
747
  self._vars_cache[host] = dict()
740
748
  if varname in self._vars_cache[host] and isinstance(self._vars_cache[host][varname], MutableMapping) and isinstance(value, MutableMapping):
ansible/vars/reserved.py CHANGED
@@ -21,15 +21,17 @@ from ansible.playbook import Play
21
21
  from ansible.playbook.block import Block
22
22
  from ansible.playbook.role import Role
23
23
  from ansible.playbook.task import Task
24
+ from ansible.template import Templar
24
25
  from ansible.utils.display import Display
25
26
 
26
27
  display = Display()
27
28
 
28
29
 
29
- def get_reserved_names(include_private=True):
30
- ''' this function returns the list of reserved names associated with play objects'''
30
+ def get_reserved_names(include_private: bool = True) -> set[str]:
31
+ """ this function returns the list of reserved names associated with play objects"""
31
32
 
32
- public = set()
33
+ templar = Templar(loader=None)
34
+ public = set(templar.environment.globals.keys())
33
35
  private = set()
34
36
  result = set()
35
37
 
@@ -58,11 +60,15 @@ def get_reserved_names(include_private=True):
58
60
  else:
59
61
  result = public
60
62
 
63
+ # due to Collectors always adding, need to ignore this
64
+ # eventually should remove after we deprecate it in setup.py
65
+ result.remove('gather_subset')
66
+
61
67
  return result
62
68
 
63
69
 
64
- def warn_if_reserved(myvars, additional=None):
65
- ''' this function warns if any variable passed conflicts with internally reserved names '''
70
+ def warn_if_reserved(myvars: list[str], additional: list[str] | None = None) -> None:
71
+ """ this function warns if any variable passed conflicts with internally reserved names """
66
72
 
67
73
  if additional is None:
68
74
  reserved = _RESERVED_NAMES
@@ -75,7 +81,7 @@ def warn_if_reserved(myvars, additional=None):
75
81
  display.warning('Found variable using reserved name: %s' % varname)
76
82
 
77
83
 
78
- def is_reserved_name(name):
84
+ def is_reserved_name(name: str) -> bool:
79
85
  return name in _RESERVED_NAMES
80
86
 
81
87
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: ansible-core
3
- Version: 2.17.7
3
+ Version: 2.17.8rc1
4
4
  Summary: Radically simple IT automation
5
5
  Home-page: https://ansible.com/
6
6
  Author: Ansible, Inc.
@@ -36,6 +36,7 @@ Requires-Dist: PyYAML>=5.1
36
36
  Requires-Dist: cryptography
37
37
  Requires-Dist: packaging
38
38
  Requires-Dist: resolvelib<1.1.0,>=0.5.3
39
+ Dynamic: requires-dist
39
40
 
40
41
  [![PyPI version](https://img.shields.io/pypi/v/ansible-core.svg)](https://pypi.org/project/ansible-core)
41
42
  [![Docs badge](https://img.shields.io/badge/docs-latest-brightgreen.svg)](https://docs.ansible.com/ansible/latest/)
@@ -3,7 +3,7 @@ ansible/__main__.py,sha256=EnLcULXNtSXkuJ8igEHPPLBTZKAwqXv4PvMEhvzp2Oo,1430
3
3
  ansible/constants.py,sha256=vRwEcoynqtuKDPKsxKUY94XzrTSV3J0y1slb907DioU,9140
4
4
  ansible/context.py,sha256=oKYyfjfWpy8vDeProtqfnqSmuij_t75_5e5t0U_hQ1g,1933
5
5
  ansible/keyword_desc.yml,sha256=vE9joFgSeHR4Djl7Bd-HHVCrGByRCrTUmWYZ8LKPZKk,7412
6
- ansible/release.py,sha256=ue199-bXz_rBa61AGOK7fO6E8F4D_DjWaYRMro1S8C4,832
6
+ ansible/release.py,sha256=6Dy9q8KH2ZvKbDZF6q4lT39JV3mbLV0m6qKxPAOV19c,835
7
7
  ansible/_vendor/__init__.py,sha256=2QBeBwT7uG7M3Aw-pIdCpt6XPtHMCpbEKfACYKA7xIg,2033
8
8
  ansible/cli/__init__.py,sha256=fzgR82NIGBH3GujIMehhAaP4KYszn4uztuCaFYRUpGk,28718
9
9
  ansible/cli/adhoc.py,sha256=quJ9WzRzf3dz_dtDGmahNMffqyNVy1jzQCMo21YL5Qg,8194
@@ -14,7 +14,7 @@ ansible/cli/galaxy.py,sha256=lMiaP2WuBPMh2Ba3RTe4ZFK0HcPbUlsjInzrn5-G5NY,96867
14
14
  ansible/cli/inventory.py,sha256=bVT2FRQLSab_vDqw_vTMLpxzd2HYW1KDslsEb6gqFSI,16771
15
15
  ansible/cli/playbook.py,sha256=d0x_X0BXjxYjPJ-qc6JcyGxR6IzxdvnSjoT4tUtaGKQ,10865
16
16
  ansible/cli/pull.py,sha256=twr9xvQS6a4omlOxmvNyuenonVYJVR-4ZxclLzl-AuA,17286
17
- ansible/cli/vault.py,sha256=pwrXBRpVjcz7T_0UdzG63lQuwhMHdGtSOVj4ZEDYBaw,22954
17
+ ansible/cli/vault.py,sha256=dICxhXQMRMTguu7gJW8qhGohiNdGn1Xxubt1kf2fRBc,23118
18
18
  ansible/cli/arguments/__init__.py,sha256=_4taT82hZKKTzhdXKmIgqxWwuG21XZxF874V2k1e3us,168
19
19
  ansible/cli/arguments/option_helpers.py,sha256=YiiGDtsXIwFg8mZPeQnYHsEUgsjUfeLCRrpks8hUc_Q,18488
20
20
  ansible/cli/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -31,14 +31,14 @@ ansible/config/manager.py,sha256=MvNZnqHDtz9uda5_ryNvpCv2M3frAl81bvZvgS1lGko,257
31
31
  ansible/errors/__init__.py,sha256=uN28L8f7qEWqeL86VkwIrkfMsk8U1XkBDxC9rTukYwo,14832
32
32
  ansible/errors/yaml_strings.py,sha256=fKfgD3rC017dyMackTpu-LkvbsdnsfBAKCxMH-fDtIg,3858
33
33
  ansible/executor/__init__.py,sha256=mRvbCJPA-_veSG5ka3v04G5vsarLVDeB3EWFsu6geSI,749
34
- ansible/executor/action_write_locks.py,sha256=Up2n3cwFCr4T4IvttHpe3QOxRBF_9NgWJ1tFm9CHpfM,1915
34
+ ansible/executor/action_write_locks.py,sha256=DcjCvRELlz5dyUDxCjCZCVjy4-j4u0y-YNgY90dvbG0,2007
35
35
  ansible/executor/interpreter_discovery.py,sha256=i9BS5Rw0TWC_32zqRO3KTURjn1J6CugrVxKKqhvmn-k,9974
36
36
  ansible/executor/module_common.py,sha256=4pVfjMgCle9ttAZTeuwSx3Kdi0rljagyHC11i4VnCl4,65755
37
37
  ansible/executor/play_iterator.py,sha256=mrGK7INCfE6L2Gt0X7S0hm0Srtw4T-PYwJVi77BAxls,31457
38
38
  ansible/executor/playbook_executor.py,sha256=S_dwBYqYTQtN32AMQXxQTOpVCczV4KJ8ezergt1nlmA,15014
39
39
  ansible/executor/stats.py,sha256=gcBhJQrZTgE95737d6lArJ3FpTlbAfVt6GMhEqs5ZPU,3180
40
- ansible/executor/task_executor.py,sha256=d3kh9ec_ylSoUvm53EV58orAnsXjuIO4Rq-jK908Q48,60756
41
- ansible/executor/task_queue_manager.py,sha256=wv19pq9LNHRABjvDYUZHQ9kmlO_ypA0r3aMaLnGxaCs,18640
40
+ ansible/executor/task_executor.py,sha256=NP9w1J-4zK1-kNozFYguzqItxCu_4MQxgd4uG6f7C8U,60331
41
+ ansible/executor/task_queue_manager.py,sha256=vpX4mqaSJzkCgzrjrjTk9ARuJiOXp66gYUAN_U5--Wo,18518
42
42
  ansible/executor/task_result.py,sha256=pnLu-f0tYaDmDXSQftCBChSt_Zx5pW0GeLYLvEHuHkA,5695
43
43
  ansible/executor/discovery/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
44
  ansible/executor/discovery/python_target.py,sha256=GW0tFmxr75vyFxKAIznJDEfjfSz1HaGbqRpUUif1LT4,1181
@@ -140,7 +140,7 @@ ansible/inventory/host.py,sha256=PDb5OTplhfpUIvdHiP2BckUOB1gUl302N-3sW0_sTyg,503
140
140
  ansible/inventory/manager.py,sha256=45mHgZTAkQ3IjAtrgsNzJXvynC-HIEor-JJE-V3xXN4,29454
141
141
  ansible/module_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
142
142
  ansible/module_utils/_text.py,sha256=VkWgAnSNVCbTQqZgllUObBFsH3uM4EUW5srl1UR9t1g,544
143
- ansible/module_utils/ansible_release.py,sha256=ue199-bXz_rBa61AGOK7fO6E8F4D_DjWaYRMro1S8C4,832
143
+ ansible/module_utils/ansible_release.py,sha256=6Dy9q8KH2ZvKbDZF6q4lT39JV3mbLV0m6qKxPAOV19c,835
144
144
  ansible/module_utils/api.py,sha256=DWIuLW5gDWuyyDHLLgGnub42Qa8kagDdkf1xDeLAFl4,5784
145
145
  ansible/module_utils/basic.py,sha256=UcDamm_6bkL3HXxKvQcSUlzDOHkIlvd8AYGuqJNmZeI,86113
146
146
  ansible/module_utils/connection.py,sha256=q_BdUaST6E44ltHsWPOFOheXK9vKmzaJvP-eQOrOrmE,8394
@@ -180,7 +180,7 @@ ansible/module_utils/compat/selinux.py,sha256=8OSQ-kzCahoPyja3j25Au7HOINXT_A2bdp
180
180
  ansible/module_utils/compat/typing.py,sha256=J_K9Ru1-f0KSKO_WhWGRCh0WBNWl6jUmQK1_0yYYZOs,736
181
181
  ansible/module_utils/compat/version.py,sha256=ifck3MH9LhxMENpZXOrntEqX6b7X8shknt3Fweg6AzQ,12734
182
182
  ansible/module_utils/csharp/Ansible.AccessToken.cs,sha256=4HzIFQKGG3ZTg8tehVcM_ukMi057wxxLdYFZoqsij5I,15871
183
- ansible/module_utils/csharp/Ansible.Basic.cs,sha256=xp1pMZNhib3vhR3Wdc5JlDv1SORo4dIGjc17LmnLr1g,78845
183
+ ansible/module_utils/csharp/Ansible.Basic.cs,sha256=fzeoQXu21SAPWE5MSw33T_6-iZDoTDkH2qdEV1Xf2ww,78867
184
184
  ansible/module_utils/csharp/Ansible.Become.cs,sha256=1yasfX8SpbcIWJWiobr2Ms-Hl5W47_XNSKvwMXOyiz4,30457
185
185
  ansible/module_utils/csharp/Ansible.Privilege.cs,sha256=7e46na6k6ygdRwN53bzfIS8O-IwfM1TF_q5DeFH2Z80,19398
186
186
  ansible/module_utils/csharp/Ansible.Process.cs,sha256=g6R2PkbxiVBry4bk35ieWwYCAZOi7RSeyKmtOW8j90I,19449
@@ -188,7 +188,7 @@ ansible/module_utils/csharp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp
188
188
  ansible/module_utils/distro/__init__.py,sha256=rm-n2ri9SCdppcZhv4iEVT0qEBmH7BLbImOcpYRWLHQ,1943
189
189
  ansible/module_utils/distro/_distro.py,sha256=zJMW0bb4xg-ZVpRdDcdAutOIGEPIN3FT3a7NZTVJPZI,49484
190
190
  ansible/module_utils/facts/__init__.py,sha256=Vyndmo-7rUjG-SX3hQHGoviksC_DeKSijZ2tFDESIAQ,1890
191
- ansible/module_utils/facts/ansible_collector.py,sha256=TGc3uEaOx0u-ucNM5_pt0HQTG-mN8zlQJLYPZXoeEFw,6566
191
+ ansible/module_utils/facts/ansible_collector.py,sha256=CdvWuu2_JV1zkXP-Das8P6qMM_Ch56idq2OTaaTut-4,6883
192
192
  ansible/module_utils/facts/collector.py,sha256=rfP-uOLHzUGd4miw9Dz5iY7yFIehn3ddrJmao9YcUG0,14664
193
193
  ansible/module_utils/facts/compat.py,sha256=jX8FsMTpZcdrFxIYsxaVrHYn69Pu7hWqehU97ncaC2A,4062
194
194
  ansible/module_utils/facts/default_collectors.py,sha256=HuBVKiKn9omZI9yzQhfAKZEt4MLEXEtpat7pT4dJqwE,8275
@@ -375,7 +375,7 @@ ansible/playbook/helpers.py,sha256=f1O_o6VlZeXHdI-Zhq6U_KtT44gvr4-nSVMkDuZ6o20,1
375
375
  ansible/playbook/included_file.py,sha256=-Pd20gvOv2FZW6ReaoicjjIlZiJ1Sc607rFnwtrqycY,11735
376
376
  ansible/playbook/loop_control.py,sha256=gv77uqfwrKiWjMm2vQEGfwwLAZLczKqVbmVaPHwfL5g,1689
377
377
  ansible/playbook/notifiable.py,sha256=MQz4VZuOga35VLcdUxVd9FQVzFg-djtQZhs09DS2juA,299
378
- ansible/playbook/play.py,sha256=QC90ZSBVBiX1fMevcDHtTosiDR3koinmCSfyzVeirKI,16259
378
+ ansible/playbook/play.py,sha256=Fp5J_CQ-pHLuTc8GIJgu_th05_dunBFKZ_19XspqcMY,16297
379
379
  ansible/playbook/play_context.py,sha256=w5P-lAyN1cr01JgSLw8tnYy4QsSyDFLzbSy_ehucp64,14362
380
380
  ansible/playbook/playbook_include.py,sha256=hr3N_yV4unjhiC2IIdchY0TPSARwlv0SXH9bIsIrbaA,7493
381
381
  ansible/playbook/role_include.py,sha256=NCgDHtXlOltJ0XXSgGTTxDVrLC6IBe_d9SgNGXtsI20,7575
@@ -396,12 +396,12 @@ ansible/plugins/action/assemble.py,sha256=feMs3r2BAgQGQnpPmzJIGI7BSfOUl0eiyTVwln
396
396
  ansible/plugins/action/assert.py,sha256=mAPHyQ03Qb6nxIFuFiUHWGR56bTw0tA61fYX22_2OTI,5103
397
397
  ansible/plugins/action/async_status.py,sha256=Cv6dLt94Z6YIPZpPIDhS_yC7yqKtT13HyDdaIONMUCU,1726
398
398
  ansible/plugins/action/command.py,sha256=N09Vf2QypBMZ6NSptQGbf6EAN-kfqLCROGPkOSgV3SY,1069
399
- ansible/plugins/action/copy.py,sha256=5gEcEtSkZ3FXljZY9lldsS_g6e1DgAyEXTgHjNnlvn0,27446
399
+ ansible/plugins/action/copy.py,sha256=VKn_OMPz-_B8KaKl4htlJedn95RMrpmGO_tWOFIg6ys,27735
400
400
  ansible/plugins/action/debug.py,sha256=vPmHIfMAbuqpHb2aq0QS7M_g7Fu5pFTwMoYjCKCAa2E,3472
401
401
  ansible/plugins/action/dnf.py,sha256=GdqJh2FHyer8SXiwrKW7dyg4cQwlDF8sfvnL7RaLnsw,3588
402
402
  ansible/plugins/action/fail.py,sha256=_1JuS0Z8Y8EB4FKG1u7KdP6xMuLobRHJsmtzmvN2CkU,1457
403
403
  ansible/plugins/action/fetch.py,sha256=cQAmUWEGMDjfVfHGviNtsT4i06rnoubL3EgrOlUZbLw,10188
404
- ansible/plugins/action/gather_facts.py,sha256=JFkrn3_78A7eUw0I3DsfUoe3Pu3wVLkhLUiOJ7Oyk0A,7863
404
+ ansible/plugins/action/gather_facts.py,sha256=yNUrBPdzdJoA6euqy6k-gWpS_6yS0m-iBNq438PsbKk,9186
405
405
  ansible/plugins/action/group_by.py,sha256=97d4TF9o7vS5y0s1HfGgvh70l2gkQ2uUGxy0knlok5Y,1894
406
406
  ansible/plugins/action/include_vars.py,sha256=_xPrP_BeGqbhvpJYQFDUkREL9UzZ6Y4q_AnCshvsn1A,11573
407
407
  ansible/plugins/action/normal.py,sha256=cCHrZ3z2kB_wnnSNkmJHJWcJNRgdoxnLUNeHex-P8DE,1854
@@ -434,7 +434,7 @@ ansible/plugins/callback/minimal.py,sha256=51pTYXwnCAm4Z4TYbWTu-wq8gKpYCeq1AuSD8
434
434
  ansible/plugins/callback/oneline.py,sha256=FkE0lEoH_sZoxSgjeAvc0eH6Rt4k0Qi6fV9Pte8WYxQ,3450
435
435
  ansible/plugins/callback/tree.py,sha256=LRR7Aq0xYGZ0fQGCaenEoslEd5669yK259UQs7ai4tI,3014
436
436
  ansible/plugins/cliconf/__init__.py,sha256=NlIs8a21RJSPOmoO-fVSJtO4OGNPxCAMFntDZIPEEB0,22719
437
- ansible/plugins/connection/__init__.py,sha256=7B9UmhcM4divUhg-RsurhOOGQiCVeLGGh0Zp_zCvK4w,17947
437
+ ansible/plugins/connection/__init__.py,sha256=z3FcfUSemloUoUQokC8GBe6uTUvfBed6vIFAzbpIDyw,18825
438
438
  ansible/plugins/connection/local.py,sha256=A-XQy_wIky16xrgkm2KW2jyZLpzmcUPjNOPtoQQnDJg,8339
439
439
  ansible/plugins/connection/paramiko_ssh.py,sha256=NnCHPiVZTzJVu0EQ4p4g0k0jxUgEHC9PHvuD6IFZ6O4,30045
440
440
  ansible/plugins/connection/psrp.py,sha256=K3ZhDmpYcCI5CYtXBonD6hMb4QZe4GN6VZ6vKMPz4kk,36762
@@ -503,7 +503,7 @@ ansible/plugins/filter/realpath.yml,sha256=9r5FyANyU3sAEgEiKui69Kphy-aeos6FukqAV
503
503
  ansible/plugins/filter/regex_escape.yml,sha256=L1c6OrzqOYpkRmdWJ_ZTalY07lojcYItzdciAaBmBoI,688
504
504
  ansible/plugins/filter/regex_findall.yml,sha256=KyKpce7oAF0ok3044sQS2w15UbF4o7u3QwbqFtP56ao,1425
505
505
  ansible/plugins/filter/regex_replace.yml,sha256=gopa5TURn49Xg-W1VcJ9GNTMWhB_wqN6vqHqNoB-2Cg,2421
506
- ansible/plugins/filter/regex_search.yml,sha256=ue74lf9chJW_y72XuTpxneyE5BSk9NTtO6Le_WSJOcU,2019
506
+ ansible/plugins/filter/regex_search.yml,sha256=-2eBaW3ifvoFW1c2CI2xSPqYZCfnpmli475GIzg4E6U,2445
507
507
  ansible/plugins/filter/rekey_on_member.yml,sha256=IIVoLQemrn9BZMLygkGA6CPP4eLPHmRblOT2-TnWh70,921
508
508
  ansible/plugins/filter/relpath.yml,sha256=8-Kg_vFBeL6rwMQyyQMZaehB8LUa5h5cJEEr7_8qyi4,758
509
509
  ansible/plugins/filter/root.yml,sha256=sT1tsUZ5NBX7LjrPc-08Omg__szm9kOlamivlflJJ88,617
@@ -576,7 +576,7 @@ ansible/plugins/shell/__init__.py,sha256=rEwatHZ46LJuxMFANb6e__CTLkFWX6B0878eBaC
576
576
  ansible/plugins/shell/cmd.py,sha256=kPCSKrJJFH5XTkmteEI3P1Da6WfPSXxDnV39VFpgD-A,2170
577
577
  ansible/plugins/shell/powershell.py,sha256=6_loE4nYiLjro8egODcsK4HmoPmAk9bd4YY961dXb2U,12880
578
578
  ansible/plugins/shell/sh.py,sha256=wblaY2EGdA2O00gNuTVZVgVV08RH0e_g4V_AkE50Iws,3884
579
- ansible/plugins/strategy/__init__.py,sha256=EtxIpgZMoYM3Me3Cj7t0oys48JJMyCj9u4nK5gz35FI,57095
579
+ ansible/plugins/strategy/__init__.py,sha256=SWFsW73rI4Ti1m9suTMsDXlEKPQH0XAFLOkbrtj4Ag4,57253
580
580
  ansible/plugins/strategy/debug.py,sha256=yMmfT-lQHfR2y9bQcqrSPzqHuWZMo7V9y4ZWOXoboRE,1205
581
581
  ansible/plugins/strategy/free.py,sha256=WNrpfg2B8fVcYC5qvBhn4uEH0Cc1-UmFzBH6Hhs3u_I,16728
582
582
  ansible/plugins/strategy/host_pinned.py,sha256=GrDDQCtohmmJn3t9VOPb0lUZK_nUWy0s__z5Tq_rHfI,1875
@@ -675,10 +675,10 @@ ansible/vars/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
675
675
  ansible/vars/clean.py,sha256=X2WMksJMWITQ9FsM-Fb_YxT_hAGDqJ3urSTJzYBEdAk,5999
676
676
  ansible/vars/fact_cache.py,sha256=M57vMhkQ2DrzvNaZkfaCmKQJUqP1Rn_A31_X-5YBfzQ,1903
677
677
  ansible/vars/hostvars.py,sha256=o11xrzDVYn23renGbb3lx3R-nH9qOjLFju5IYJanDxg,5324
678
- ansible/vars/manager.py,sha256=ujVDQXWvy8BihIxGzBPX6fMeUl2AlclkwadKMo6VjSk,38583
678
+ ansible/vars/manager.py,sha256=DLw853m8IVmEYP9YMrJbsJyGSEhkTD1H9BsctjJqL3k,38869
679
679
  ansible/vars/plugins.py,sha256=RsRU9fiLcJwPIAyTYnmVZglsiEOMCIgQskflavE-XnE,4546
680
- ansible/vars/reserved.py,sha256=kZiQMPvaFin35006gLwDpX16w-9xlu6EaL4LSTKP40U,2531
681
- ansible_core-2.17.7.data/scripts/ansible-test,sha256=dyY2HtRZotRQO3b89HGXY_KnJgBvgsm4eLIe4B2LUoA,1637
680
+ ansible/vars/reserved.py,sha256=Tsc4m2UwVce3dOvSWrjT2wB3lpNJtUyNZn45zNhsW0I,2869
681
+ ansible_core-2.17.8rc1.data/scripts/ansible-test,sha256=dyY2HtRZotRQO3b89HGXY_KnJgBvgsm4eLIe4B2LUoA,1637
682
682
  ansible_test/__init__.py,sha256=20VPOj11c6Ut1Av9RaurgwJvFhMqkWG3vAvcCbecNKw,66
683
683
  ansible_test/_data/ansible.cfg,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
684
684
  ansible_test/_data/coveragerc,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -818,7 +818,7 @@ ansible_test/_internal/cli/parsers/host_config_parsers.py,sha256=CYkTBciLYR1DWaE
818
818
  ansible_test/_internal/cli/parsers/key_value_parsers.py,sha256=V-eHVobIuDe316GgXRVtDXTqG1skV5uf8iohRmXquJ8,9404
819
819
  ansible_test/_internal/cli/parsers/value_parsers.py,sha256=ALoTjbmDr8IGWYbEEPUy082nFIb6kbekDJD5JFQp4Bc,6060
820
820
  ansible_test/_internal/commands/__init__.py,sha256=oRNkU8riDVtUFvIOyQlxiWinOWDUUKb-uEaC_GaE-PQ,88
821
- ansible_test/_internal/commands/coverage/__init__.py,sha256=XJDpIfim37RtN-Jluqw4fG6yhTfOcywtDoKlbSImgpo,14408
821
+ ansible_test/_internal/commands/coverage/__init__.py,sha256=kuIFvKUJpXLB0YB7afO4pP-1TGpnUUuK-Bf4cX73lio,14408
822
822
  ansible_test/_internal/commands/coverage/combine.py,sha256=eQslZpo2AUl4HOKYLaKqauKSES7XsWTxjexX8AVnzGI,11950
823
823
  ansible_test/_internal/commands/coverage/erase.py,sha256=CJL1BDKOM-OUBINwLJoDlWHwzkH3FB51StM2P0MZ56Q,915
824
824
  ansible_test/_internal/commands/coverage/html.py,sha256=66H-4TYmqpUe51XJEQ7URfDeHDUDD52Alta_Ug7tifw,1319
@@ -979,9 +979,9 @@ ansible_test/config/cloud-config-vultr.ini.template,sha256=XLKHk3lg_8ReQMdWfZzhh
979
979
  ansible_test/config/config.yml,sha256=wb3knoBmZewG3GWOMnRHoVPQWW4vPixKLPMNS6vJmTc,2620
980
980
  ansible_test/config/inventory.networking.template,sha256=bFNSk8zNQOaZ_twaflrY0XZ9mLwUbRLuNT0BdIFwvn4,1335
981
981
  ansible_test/config/inventory.winrm.template,sha256=1QU8W-GFLnYEw8yY9bVIvUAVvJYPM3hyoijf6-M7T00,1098
982
- ansible_core-2.17.7.dist-info/COPYING,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
983
- ansible_core-2.17.7.dist-info/METADATA,sha256=BBzEhGLPXpNIkRbRVFoRRlbuyJH7WNYyBVfUIz2ygCo,6942
984
- ansible_core-2.17.7.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
985
- ansible_core-2.17.7.dist-info/entry_points.txt,sha256=0mpmsrIhODChxKl3eS-NcVQCaMetBn8KdPLtVxQgR64,453
986
- ansible_core-2.17.7.dist-info/top_level.txt,sha256=IFbRLjAvih1DYzJWg3_F6t4sCzEMxRO7TOMNs6GkYHo,21
987
- ansible_core-2.17.7.dist-info/RECORD,,
982
+ ansible_core-2.17.8rc1.dist-info/COPYING,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
983
+ ansible_core-2.17.8rc1.dist-info/METADATA,sha256=fDjbC2YhphjLqWL333Jizv7XMXQLe2U5_NAgYJTqfHo,6968
984
+ ansible_core-2.17.8rc1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
985
+ ansible_core-2.17.8rc1.dist-info/entry_points.txt,sha256=0mpmsrIhODChxKl3eS-NcVQCaMetBn8KdPLtVxQgR64,453
986
+ ansible_core-2.17.8rc1.dist-info/top_level.txt,sha256=IFbRLjAvih1DYzJWg3_F6t4sCzEMxRO7TOMNs6GkYHo,21
987
+ ansible_core-2.17.8rc1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.6.0)
2
+ Generator: setuptools (75.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -293,6 +293,11 @@ def sanitize_filename(
293
293
  new_name = re.sub('^.*/ansible_modlib.zip/ansible/', ansible_path, filename)
294
294
  display.info('%s -> %s' % (filename, new_name), verbosity=3)
295
295
  filename = new_name
296
+ elif integration_temp_path in filename:
297
+ # Rewrite the path of code running from an integration test temporary directory.
298
+ new_name = re.sub(r'^.*' + re.escape(integration_temp_path) + '[^/]+/', root_path, filename)
299
+ display.info('%s -> %s' % (filename, new_name), verbosity=3)
300
+ filename = new_name
296
301
  elif collection_search_re and collection_search_re.search(filename):
297
302
  new_name = os.path.abspath(collection_sub_re.sub('', filename))
298
303
  display.info('%s -> %s' % (filename, new_name), verbosity=3)
@@ -328,11 +333,6 @@ def sanitize_filename(
328
333
  new_name = re.sub('^(/.*?)?/root/ansible/', root_path, filename)
329
334
  display.info('%s -> %s' % (filename, new_name), verbosity=3)
330
335
  filename = new_name
331
- elif integration_temp_path in filename:
332
- # Rewrite the path of code running from an integration test temporary directory.
333
- new_name = re.sub(r'^.*' + re.escape(integration_temp_path) + '[^/]+/', root_path, filename)
334
- display.info('%s -> %s' % (filename, new_name), verbosity=3)
335
- filename = new_name
336
336
 
337
337
  filename = os.path.abspath(filename) # make sure path is absolute (will be relative if previously exported)
338
338