ansible-core 2.19.0b3__py3-none-any.whl → 2.19.0b5__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.
Files changed (174) hide show
  1. ansible/_internal/__init__.py +2 -2
  2. ansible/_internal/_collection_proxy.py +1 -1
  3. ansible/_internal/_errors/_alarm_timeout.py +66 -0
  4. ansible/_internal/_errors/_captured.py +25 -30
  5. ansible/_internal/_errors/_error_factory.py +89 -0
  6. ansible/_internal/_errors/_error_utils.py +240 -0
  7. ansible/_internal/_errors/_task_timeout.py +28 -0
  8. ansible/_internal/_event_formatting.py +127 -0
  9. ansible/_internal/_json/__init__.py +6 -6
  10. ansible/_internal/_json/_profiles/_cache_persistence.py +2 -0
  11. ansible/_internal/_json/_profiles/_inventory_legacy.py +1 -1
  12. ansible/_internal/_json/_profiles/_legacy.py +3 -11
  13. ansible/_internal/_ssh/__init__.py +0 -0
  14. ansible/_internal/_ssh/_agent_launch.py +91 -0
  15. ansible/{utils → _internal/_ssh}/_ssh_agent.py +55 -93
  16. ansible/_internal/_templating/__init__.py +5 -3
  17. ansible/_internal/_templating/_datatag.py +2 -1
  18. ansible/_internal/_templating/_engine.py +3 -4
  19. ansible/_internal/_templating/_jinja_bits.py +21 -16
  20. ansible/_internal/_templating/_jinja_common.py +18 -27
  21. ansible/_internal/_templating/_jinja_plugins.py +31 -3
  22. ansible/_internal/_templating/_lazy_containers.py +5 -5
  23. ansible/_internal/_templating/_transform.py +20 -19
  24. ansible/_internal/_templating/_utils.py +1 -1
  25. ansible/_internal/_testing.py +26 -0
  26. ansible/_internal/_yaml/_dumper.py +1 -1
  27. ansible/_internal/_yaml/_errors.py +7 -7
  28. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +1 -1
  29. ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +1 -1
  30. ansible/cli/__init__.py +5 -82
  31. ansible/cli/arguments/option_helpers.py +8 -5
  32. ansible/cli/doc.py +84 -28
  33. ansible/cli/inventory.py +1 -1
  34. ansible/compat/importlib_resources.py +9 -12
  35. ansible/config/base.yml +27 -23
  36. ansible/config/manager.py +142 -101
  37. ansible/constants.py +1 -1
  38. ansible/errors/__init__.py +96 -49
  39. ansible/executor/module_common.py +8 -10
  40. ansible/executor/powershell/async_watchdog.ps1 +2 -2
  41. ansible/executor/powershell/async_wrapper.ps1 +3 -3
  42. ansible/executor/powershell/become_wrapper.ps1 +20 -2
  43. ansible/executor/powershell/bootstrap_wrapper.ps1 +28 -6
  44. ansible/executor/powershell/coverage_wrapper.ps1 +15 -6
  45. ansible/executor/powershell/exec_wrapper.ps1 +219 -6
  46. ansible/executor/powershell/module_manifest.py +52 -0
  47. ansible/executor/powershell/module_wrapper.ps1 +47 -21
  48. ansible/executor/powershell/powershell_expand_user.ps1 +20 -0
  49. ansible/executor/powershell/powershell_mkdtemp.ps1 +17 -0
  50. ansible/executor/process/worker.py +38 -113
  51. ansible/executor/task_executor.py +26 -61
  52. ansible/executor/task_result.py +2 -4
  53. ansible/galaxy/collection/__init__.py +1 -4
  54. ansible/inventory/manager.py +1 -0
  55. ansible/module_utils/_internal/__init__.py +0 -3
  56. ansible/module_utils/_internal/_ambient_context.py +3 -3
  57. ansible/module_utils/_internal/_ansiballz.py +4 -2
  58. ansible/module_utils/_internal/_datatag/__init__.py +20 -14
  59. ansible/module_utils/_internal/_datatag/_tags.py +2 -2
  60. ansible/module_utils/_internal/_deprecator.py +66 -48
  61. ansible/module_utils/_internal/_errors.py +88 -17
  62. ansible/module_utils/_internal/_event_utils.py +61 -0
  63. ansible/module_utils/_internal/_json/_profiles/__init__.py +21 -4
  64. ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +2 -0
  65. ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +2 -0
  66. ansible/module_utils/_internal/_json/_profiles/_tagless.py +3 -1
  67. ansible/module_utils/{common/messages.py → _internal/_messages.py} +28 -47
  68. ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +1 -3
  69. ansible/module_utils/_internal/_plugin_info.py +1 -1
  70. ansible/module_utils/_internal/_stack.py +22 -0
  71. ansible/module_utils/_internal/_text_utils.py +6 -0
  72. ansible/module_utils/_internal/_traceback.py +11 -8
  73. ansible/module_utils/ansible_release.py +1 -1
  74. ansible/module_utils/basic.py +49 -15
  75. ansible/module_utils/common/arg_spec.py +2 -2
  76. ansible/module_utils/common/collections.py +6 -0
  77. ansible/module_utils/common/json.py +2 -2
  78. ansible/module_utils/common/text/converters.py +3 -3
  79. ansible/module_utils/common/validation.py +1 -1
  80. ansible/module_utils/common/warnings.py +80 -23
  81. ansible/module_utils/common/yaml.py +1 -1
  82. ansible/module_utils/datatag.py +5 -2
  83. ansible/module_utils/facts/system/distribution.py +16 -3
  84. ansible/module_utils/facts/virtual/linux.py +2 -2
  85. ansible/module_utils/parsing/convert_bool.py +6 -0
  86. ansible/module_utils/service.py +2 -9
  87. ansible/modules/apt_repository.py +7 -29
  88. ansible/modules/assemble.py +4 -4
  89. ansible/modules/async_status.py +13 -11
  90. ansible/modules/async_wrapper.py +5 -5
  91. ansible/modules/cron.py +3 -5
  92. ansible/modules/dnf5.py +15 -22
  93. ansible/modules/git.py +1 -6
  94. ansible/modules/hostname.py +0 -1
  95. ansible/modules/pip.py +2 -4
  96. ansible/modules/service.py +3 -9
  97. ansible/modules/sysvinit.py +3 -3
  98. ansible/parsing/ajson.py +3 -5
  99. ansible/parsing/dataloader.py +4 -4
  100. ansible/parsing/mod_args.py +1 -1
  101. ansible/parsing/plugin_docs.py +2 -2
  102. ansible/parsing/utils/yaml.py +3 -3
  103. ansible/parsing/vault/__init__.py +4 -4
  104. ansible/playbook/playbook_include.py +1 -1
  105. ansible/playbook/taggable.py +0 -3
  106. ansible/plugins/__init__.py +0 -25
  107. ansible/plugins/action/__init__.py +9 -32
  108. ansible/plugins/action/add_host.py +1 -1
  109. ansible/plugins/action/assemble.py +8 -16
  110. ansible/plugins/action/async_status.py +7 -2
  111. ansible/plugins/action/copy.py +8 -7
  112. ansible/plugins/action/gather_facts.py +8 -8
  113. ansible/plugins/action/package.py +5 -8
  114. ansible/plugins/action/script.py +8 -15
  115. ansible/plugins/action/service.py +3 -7
  116. ansible/plugins/action/template.py +6 -8
  117. ansible/plugins/action/unarchive.py +5 -15
  118. ansible/plugins/action/uri.py +9 -20
  119. ansible/plugins/callback/__init__.py +4 -6
  120. ansible/plugins/callback/junit.py +4 -2
  121. ansible/plugins/connection/local.py +2 -2
  122. ansible/plugins/connection/ssh.py +17 -9
  123. ansible/plugins/connection/winrm.py +5 -2
  124. ansible/plugins/doc_fragments/constructed.py +2 -2
  125. ansible/plugins/filter/core.py +13 -6
  126. ansible/plugins/filter/encryption.py +4 -4
  127. ansible/plugins/inventory/__init__.py +11 -10
  128. ansible/plugins/inventory/script.py +1 -1
  129. ansible/plugins/list.py +69 -16
  130. ansible/plugins/loader.py +10 -9
  131. ansible/plugins/lookup/csvfile.py +16 -71
  132. ansible/plugins/lookup/first_found.py +2 -1
  133. ansible/plugins/shell/__init__.py +56 -2
  134. ansible/plugins/shell/powershell.py +66 -9
  135. ansible/plugins/shell/sh.py +9 -5
  136. ansible/plugins/test/core.py +21 -15
  137. ansible/plugins/test/finished.yml +1 -1
  138. ansible/plugins/test/uri.py +2 -5
  139. ansible/release.py +1 -1
  140. ansible/template/__init__.py +30 -2
  141. ansible/utils/collection_loader/__init__.py +2 -0
  142. ansible/utils/display.py +107 -128
  143. ansible/utils/hashing.py +0 -1
  144. ansible/utils/listify.py +6 -4
  145. ansible/utils/plugin_docs.py +2 -1
  146. ansible/utils/unsafe_proxy.py +1 -1
  147. ansible/vars/hostvars.py +1 -1
  148. {ansible_core-2.19.0b3.dist-info → ansible_core-2.19.0b5.dist-info}/METADATA +3 -2
  149. {ansible_core-2.19.0b3.dist-info → ansible_core-2.19.0b5.dist-info}/RECORD +173 -161
  150. {ansible_core-2.19.0b3.dist-info → ansible_core-2.19.0b5.dist-info}/WHEEL +1 -1
  151. ansible_test/_data/completion/docker.txt +3 -3
  152. ansible_test/_data/completion/remote.txt +1 -0
  153. ansible_test/_data/requirements/sanity.ansible-doc.txt +1 -1
  154. ansible_test/_data/requirements/sanity.changelog.txt +2 -2
  155. ansible_test/_data/requirements/sanity.pep8.txt +1 -1
  156. ansible_test/_data/requirements/sanity.pylint.txt +4 -4
  157. ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
  158. ansible_test/_internal/util.py +20 -0
  159. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +1 -0
  160. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +1 -0
  161. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +1 -0
  162. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +1 -0
  163. ansible_test/_util/controller/sanity/pylint/config/default.cfg +1 -0
  164. ansible_test/_util/controller/sanity/pylint/plugins/deprecated_calls.py +73 -8
  165. ansible_test/_util/target/setup/bootstrap.sh +31 -0
  166. ansible/_internal/_errors/_utils.py +0 -310
  167. {ansible_core-2.19.0b3.dist-info → ansible_core-2.19.0b5.dist-info}/entry_points.txt +0 -0
  168. {ansible_core-2.19.0b3.dist-info → ansible_core-2.19.0b5.dist-info/licenses}/COPYING +0 -0
  169. {ansible_core-2.19.0b3.dist-info → ansible_core-2.19.0b5.dist-info/licenses/licenses}/Apache-License.txt +0 -0
  170. {ansible_core-2.19.0b3.dist-info → ansible_core-2.19.0b5.dist-info/licenses/licenses}/BSD-3-Clause.txt +0 -0
  171. {ansible_core-2.19.0b3.dist-info → ansible_core-2.19.0b5.dist-info/licenses/licenses}/MIT-license.txt +0 -0
  172. {ansible_core-2.19.0b3.dist-info → ansible_core-2.19.0b5.dist-info/licenses/licenses}/PSF-license.txt +0 -0
  173. {ansible_core-2.19.0b3.dist-info → ansible_core-2.19.0b5.dist-info/licenses/licenses}/simplified_bsd.txt +0 -0
  174. {ansible_core-2.19.0b3.dist-info → ansible_core-2.19.0b5.dist-info}/top_level.txt +0 -0
ansible/cli/doc.py CHANGED
@@ -9,12 +9,14 @@ from __future__ import annotations
9
9
  # ansible.cli needs to be imported first, to ensure the source bin/* scripts run that code first
10
10
  from ansible.cli import CLI
11
11
 
12
+ import collections.abc
12
13
  import importlib
13
14
  import pkgutil
14
15
  import os
15
16
  import os.path
16
17
  import re
17
18
  import textwrap
19
+ import typing as t
18
20
 
19
21
  import yaml
20
22
 
@@ -35,7 +37,7 @@ from ansible.parsing.plugin_docs import read_docstub
35
37
  from ansible.parsing.yaml.dumper import AnsibleDumper
36
38
  from ansible.parsing.yaml.loader import AnsibleLoader
37
39
  from ansible._internal._yaml._loader import AnsibleInstrumentedLoader
38
- from ansible.plugins.list import list_plugins
40
+ from ansible.plugins.list import _list_plugins_with_info, _PluginDocMetadata
39
41
  from ansible.plugins.loader import action_loader, fragment_loader
40
42
  from ansible.utils.collection_loader import AnsibleCollectionConfig, AnsibleCollectionRef
41
43
  from ansible.utils.collection_loader._collection_finder import _get_collection_name_from_path
@@ -44,6 +46,7 @@ from ansible.utils.display import Display
44
46
  from ansible.utils.plugin_docs import get_plugin_docs, get_docstring, get_versioned_doclink
45
47
  from ansible.template import trust_as_template
46
48
  from ansible._internal import _json
49
+ from ansible._internal._templating import _jinja_plugins
47
50
 
48
51
  display = Display()
49
52
 
@@ -788,35 +791,47 @@ class DocCLI(CLI, RoleMixin):
788
791
  return coll_filter
789
792
 
790
793
  def _list_plugins(self, plugin_type, content):
791
-
792
- results = {}
793
- self.plugins = {}
794
- loader = DocCLI._prep_loader(plugin_type)
794
+ DocCLI._prep_loader(plugin_type)
795
795
 
796
796
  coll_filter = self._get_collection_filter()
797
- self.plugins.update(list_plugins(plugin_type, coll_filter))
797
+ plugins = _list_plugins_with_info(plugin_type, coll_filter)
798
+
799
+ # Remove the internal ansible._protomatter plugins if getting all plugins
800
+ if not coll_filter:
801
+ plugins = {k: v for k, v in plugins.items() if not k.startswith('ansible._protomatter.')}
798
802
 
799
803
  # get appropriate content depending on option
800
804
  if content == 'dir':
801
- results = self._get_plugin_list_descriptions(loader)
805
+ results = self._get_plugin_list_descriptions(plugins)
802
806
  elif content == 'files':
803
- results = {k: self.plugins[k][0] for k in self.plugins.keys()}
807
+ results = {k: v.path for k, v in plugins.items()}
804
808
  else:
805
- results = {k: {} for k in self.plugins.keys()}
809
+ results = {k: {} for k in plugins.keys()}
806
810
  self.plugin_list = set() # reset for next iteration
807
811
 
808
812
  return results
809
813
 
810
- def _get_plugins_docs(self, plugin_type, names, fail_ok=False, fail_on_errors=True):
811
-
814
+ def _get_plugins_docs(self, plugin_type: str, names: collections.abc.Iterable[str], fail_ok: bool = False, fail_on_errors: bool = True) -> dict[str, dict]:
812
815
  loader = DocCLI._prep_loader(plugin_type)
813
816
 
817
+ if plugin_type in ('filter', 'test'):
818
+ jinja2_builtins = _jinja_plugins.get_jinja_builtin_plugin_descriptions(plugin_type)
819
+ jinja2_builtins.update({name.split('.')[-1]: value for name, value in jinja2_builtins.items()}) # add short-named versions for lookup
820
+ else:
821
+ jinja2_builtins = {}
822
+
814
823
  # get the docs for plugins in the command line list
815
824
  plugin_docs = {}
816
825
  for plugin in names:
817
- doc = {}
826
+ doc: dict[str, t.Any] = {}
818
827
  try:
819
- doc, plainexamples, returndocs, metadata = get_plugin_docs(plugin, plugin_type, loader, fragment_loader, (context.CLIARGS['verbosity'] > 0))
828
+ doc, plainexamples, returndocs, metadata = self._get_plugin_docs_with_jinja2_builtins(
829
+ plugin,
830
+ plugin_type,
831
+ loader,
832
+ fragment_loader,
833
+ jinja2_builtins,
834
+ )
820
835
  except AnsiblePluginNotFound as e:
821
836
  display.warning(to_native(e))
822
837
  continue
@@ -853,6 +868,39 @@ class DocCLI(CLI, RoleMixin):
853
868
 
854
869
  return plugin_docs
855
870
 
871
+ def _get_plugin_docs_with_jinja2_builtins(
872
+ self,
873
+ plugin_name: str,
874
+ plugin_type: str,
875
+ loader: t.Any,
876
+ fragment_loader: t.Any,
877
+ jinja_builtins: dict[str, str],
878
+ ) -> tuple[dict, str | None, dict | None, dict | None]:
879
+ try:
880
+ return get_plugin_docs(plugin_name, plugin_type, loader, fragment_loader, (context.CLIARGS['verbosity'] > 0))
881
+ except Exception:
882
+ if (desc := jinja_builtins.get(plugin_name, ...)) is not ...:
883
+ short_name = plugin_name.split('.')[-1]
884
+ long_name = f'ansible.builtin.{short_name}'
885
+ # Dynamically build a doc stub for any Jinja2 builtin plugin we haven't
886
+ # explicitly documented.
887
+ doc = dict(
888
+ collection='ansible.builtin',
889
+ plugin_name=long_name,
890
+ filename='',
891
+ short_description=desc,
892
+ description=[
893
+ desc,
894
+ '',
895
+ f"This is the Jinja builtin {plugin_type} plugin {short_name!r}.",
896
+ f"See: U(https://jinja.palletsprojects.com/en/stable/templates/#jinja-{plugin_type}s.{short_name})",
897
+ ],
898
+ )
899
+
900
+ return doc, None, None, None
901
+
902
+ raise
903
+
856
904
  def _get_roles_path(self):
857
905
  """
858
906
  Add any 'roles' subdir in playbook dir to the roles search path.
@@ -1001,10 +1049,10 @@ class DocCLI(CLI, RoleMixin):
1001
1049
  def get_all_plugins_of_type(plugin_type):
1002
1050
  loader = getattr(plugin_loader, '%s_loader' % plugin_type)
1003
1051
  paths = loader._get_paths_with_context()
1004
- plugins = {}
1052
+ plugins = []
1005
1053
  for path_context in paths:
1006
- plugins.update(list_plugins(plugin_type))
1007
- return sorted(plugins.keys())
1054
+ plugins += _list_plugins_with_info(plugin_type).keys()
1055
+ return sorted(plugins)
1008
1056
 
1009
1057
  @staticmethod
1010
1058
  def get_plugin_metadata(plugin_type, plugin_name):
@@ -1101,18 +1149,20 @@ class DocCLI(CLI, RoleMixin):
1101
1149
 
1102
1150
  return text
1103
1151
 
1104
- def _get_plugin_list_descriptions(self, loader):
1152
+ def _get_plugin_list_descriptions(self, plugins: dict[str, _PluginDocMetadata]) -> dict[str, str]:
1105
1153
 
1106
1154
  descs = {}
1107
- for plugin in self.plugins.keys():
1155
+ for plugin, plugin_info in plugins.items():
1108
1156
  # TODO: move to plugin itself i.e: plugin.get_desc()
1109
1157
  doc = None
1110
- filename = Path(to_native(self.plugins[plugin][0]))
1158
+
1111
1159
  docerror = None
1112
- try:
1113
- doc = read_docstub(filename)
1114
- except Exception as e:
1115
- docerror = e
1160
+ if plugin_info.path:
1161
+ filename = Path(to_native(plugin_info.path))
1162
+ try:
1163
+ doc = read_docstub(filename)
1164
+ except Exception as e:
1165
+ docerror = e
1116
1166
 
1117
1167
  # plugin file was empty or had error, lets try other options
1118
1168
  if doc is None:
@@ -1127,9 +1177,15 @@ class DocCLI(CLI, RoleMixin):
1127
1177
  except Exception as e:
1128
1178
  docerror = e
1129
1179
 
1130
- if docerror:
1131
- display.warning("%s has a documentation formatting error: %s" % (plugin, docerror))
1132
- continue
1180
+ # Do a final fallback to see if the plugin is a shadowed Jinja2 plugin
1181
+ # without any explicit documentation.
1182
+ if doc is None and plugin_info.jinja_builtin_short_description:
1183
+ descs[plugin] = plugin_info.jinja_builtin_short_description
1184
+ continue
1185
+
1186
+ if docerror:
1187
+ display.error_as_warning(f"{plugin} has a documentation formatting error.", exception=docerror)
1188
+ continue
1133
1189
 
1134
1190
  if not doc or not isinstance(doc, dict):
1135
1191
  desc = 'UNDOCUMENTED'
@@ -1368,7 +1424,7 @@ class DocCLI(CLI, RoleMixin):
1368
1424
  try:
1369
1425
  text.append(yaml_dump(doc.pop('examples'), indent=2, default_flow_style=False))
1370
1426
  except Exception as e:
1371
- raise AnsibleParserError("Unable to parse examples section", orig_exc=e)
1427
+ raise AnsibleParserError("Unable to parse examples section.") from e
1372
1428
 
1373
1429
  return text
1374
1430
 
@@ -1406,7 +1462,7 @@ class DocCLI(CLI, RoleMixin):
1406
1462
  try:
1407
1463
  text.append('\t' + C.config.get_deprecated_msg_from_config(doc['deprecated'], True, collection_name=collection_name))
1408
1464
  except KeyError as e:
1409
- raise AnsibleError("Invalid deprecation documentation structure", orig_exc=e)
1465
+ raise AnsibleError("Invalid deprecation documentation structure.") from e
1410
1466
  else:
1411
1467
  text.append("%s" % doc['deprecated'])
1412
1468
  del doc['deprecated']
ansible/cli/inventory.py CHANGED
@@ -164,7 +164,7 @@ class InventoryCLI(CLI):
164
164
  import yaml
165
165
  from ansible.parsing.yaml.dumper import AnsibleDumper
166
166
 
167
- # DTFIX-RELEASE: need shared infra to smuggle custom kwargs to dumpers, since yaml.dump cannot (as of PyYAML 6.0.1)
167
+ # DTFIX0: need shared infra to smuggle custom kwargs to dumpers, since yaml.dump cannot (as of PyYAML 6.0.1)
168
168
  dumper = functools.partial(AnsibleDumper, dump_vault_tags=True)
169
169
  results = to_text(yaml.dump(stuff, Dumper=dumper, default_flow_style=False, allow_unicode=True))
170
170
  elif context.CLIARGS['toml']:
@@ -3,17 +3,14 @@
3
3
 
4
4
  from __future__ import annotations
5
5
 
6
- import sys
6
+ from ansible.utils.display import Display as _Display
7
7
 
8
- HAS_IMPORTLIB_RESOURCES = False
8
+ from importlib.resources import files # pylint: disable=unused-import
9
9
 
10
- if sys.version_info < (3, 10):
11
- try:
12
- from importlib_resources import files # type: ignore[import] # pylint: disable=unused-import
13
- except ImportError:
14
- files = None # type: ignore[assignment]
15
- else:
16
- HAS_IMPORTLIB_RESOURCES = True
17
- else:
18
- from importlib.resources import files
19
- HAS_IMPORTLIB_RESOURCES = True
10
+ HAS_IMPORTLIB_RESOURCES = True
11
+
12
+ _Display().deprecated(
13
+ msg="The `ansible.compat.importlib_resources` module is deprecated.",
14
+ help_text="Use `importlib.resources` from the Python standard library instead.",
15
+ version="2.23",
16
+ )
ansible/config/base.yml CHANGED
@@ -757,7 +757,7 @@ DEFAULT_HASH_BEHAVIOUR:
757
757
  - {key: hash_behaviour, section: defaults}
758
758
  DEFAULT_HOST_LIST:
759
759
  name: Inventory Source
760
- default: /etc/ansible/hosts
760
+ default: [/etc/ansible/hosts]
761
761
  description: Comma-separated list of Ansible inventory sources
762
762
  env:
763
763
  - name: ANSIBLE_INVENTORY
@@ -1054,7 +1054,7 @@ DEFAULT_ROLES_PATH:
1054
1054
  yaml: {key: defaults.roles_path}
1055
1055
  DEFAULT_SELINUX_SPECIAL_FS:
1056
1056
  name: Problematic file systems
1057
- default: fuse, nfs, vboxsf, ramfs, 9p, vfat
1057
+ default: [fuse, nfs, vboxsf, ramfs, 9p, vfat]
1058
1058
  description:
1059
1059
  - "Some filesystems do not support safe operations and/or return inconsistent errors,
1060
1060
  this setting makes Ansible 'tolerate' those in the list without causing fatal errors."
@@ -1199,15 +1199,6 @@ DEFAULT_VARS_PLUGIN_PATH:
1199
1199
  ini:
1200
1200
  - {key: vars_plugins, section: defaults}
1201
1201
  type: pathspec
1202
- # TODO: unused?
1203
- #DEFAULT_VAR_COMPRESSION_LEVEL:
1204
- # default: 0
1205
- # description: 'TODO: write it'
1206
- # env: [{name: ANSIBLE_VAR_COMPRESSION_LEVEL}]
1207
- # ini:
1208
- # - {key: var_compression_level, section: defaults}
1209
- # type: integer
1210
- # yaml: {key: defaults.var_compression_level}
1211
1202
  DEFAULT_VAULT_ID_MATCH:
1212
1203
  name: Force vault id match
1213
1204
  default: False
@@ -1333,7 +1324,7 @@ DISPLAY_SKIPPED_HOSTS:
1333
1324
  type: boolean
1334
1325
  DISPLAY_TRACEBACK:
1335
1326
  name: Control traceback display
1336
- default: never
1327
+ default: [never]
1337
1328
  description: When to include tracebacks in extended error messages
1338
1329
  env:
1339
1330
  - name: ANSIBLE_DISPLAY_TRACEBACK
@@ -1344,6 +1335,7 @@ DISPLAY_TRACEBACK:
1344
1335
  - error
1345
1336
  - warning
1346
1337
  - deprecated
1338
+ - deprecated_value
1347
1339
  - always
1348
1340
  - never
1349
1341
  version_added: "2.19"
@@ -1480,15 +1472,6 @@ GALAXY_COLLECTIONS_PATH_WARNING:
1480
1472
  ini:
1481
1473
  - {key: collections_path_warning, section: galaxy}
1482
1474
  version_added: "2.16"
1483
- # TODO: unused?
1484
- #GALAXY_SCMS:
1485
- # name: Galaxy SCMS
1486
- # default: git, hg
1487
- # description: Available galaxy source control management systems.
1488
- # env: [{name: ANSIBLE_GALAXY_SCMS}]
1489
- # ini:
1490
- # - {key: scms, section: galaxy}
1491
- # type: list
1492
1475
  GALAXY_SERVER:
1493
1476
  default: https://galaxy.ansible.com
1494
1477
  description: "URL to prepend when roles don't specify the full URI, assume they are referencing this server as the source."
@@ -1731,7 +1714,7 @@ INVENTORY_EXPORT:
1731
1714
  type: bool
1732
1715
  INVENTORY_IGNORE_EXTS:
1733
1716
  name: Inventory ignore extensions
1734
- default: "{{(REJECT_EXTS + ('.orig', '.cfg', '.retry'))}}"
1717
+ default: "{{ REJECT_EXTS + ['.orig', '.cfg', '.retry'] }}"
1735
1718
  description: List of extensions to ignore when using a directory as an inventory source.
1736
1719
  env: [{name: ANSIBLE_INVENTORY_IGNORE}]
1737
1720
  ini:
@@ -1788,7 +1771,7 @@ INJECT_FACTS_AS_VARS:
1788
1771
  version_added: "2.5"
1789
1772
  MODULE_IGNORE_EXTS:
1790
1773
  name: Module ignore extensions
1791
- default: "{{(REJECT_EXTS + ('.yaml', '.yml', '.ini'))}}"
1774
+ default: "{{ REJECT_EXTS + ['.yaml', '.yml', '.ini'] }}"
1792
1775
  description:
1793
1776
  - List of extensions to ignore when looking for modules to load.
1794
1777
  - This is for rejecting script and binary module fallback extensions.
@@ -1979,6 +1962,14 @@ SSH_AGENT:
1979
1962
  env: [{name: ANSIBLE_SSH_AGENT}]
1980
1963
  ini: [{key: ssh_agent, section: connection}]
1981
1964
  version_added: '2.19'
1965
+ SSH_AGENT_EXECUTABLE:
1966
+ name: Executable to start for the ansible-managed SSH agent
1967
+ description: When ``SSH_AGENT`` is ``auto``, the path or name of the ssh agent executable to start.
1968
+ default: ssh-agent
1969
+ type: str
1970
+ env: [ { name: ANSIBLE_SSH_AGENT_EXECUTABLE } ]
1971
+ ini: [ { key: ssh_agent_executable, section: connection } ]
1972
+ version_added: '2.19'
1982
1973
  SSH_AGENT_KEY_LIFETIME:
1983
1974
  name: Set a maximum lifetime when adding identities to an agent
1984
1975
  description: For keys inserted into an agent defined by ``SSH_AGENT``, define a lifetime, in seconds, that the key may remain
@@ -2053,6 +2044,19 @@ TASK_TIMEOUT:
2053
2044
  - {key: task_timeout, section: defaults}
2054
2045
  type: integer
2055
2046
  version_added: '2.10'
2047
+ _TEMPLAR_SANDBOX_MODE:
2048
+ name: Control Jinja template sandbox behavior
2049
+ default: default
2050
+ description:
2051
+ - The default Jinja sandbox behavior blocks template access to all `_` prefixed object attributes and known collection mutation methods (e.g., `dict.clear()`, `list.append()`).
2052
+ type: choices
2053
+ choices:
2054
+ - default
2055
+ - allow_unsafe_attributes
2056
+ env: [{name: _ANSIBLE_TEMPLAR_SANDBOX_MODE}]
2057
+ deprecated:
2058
+ why: controlling sandbox behavior is a temporary workaround
2059
+ version: '2.23'
2056
2060
  _TEMPLAR_UNKNOWN_TYPE_CONVERSION:
2057
2061
  name: Templar unknown type conversion behavior
2058
2062
  default: warning