Ansible 2.9 移植指南

本节讨论 Ansible 2.8 和 Ansible 2.9 之间的行为变化。

旨在帮助您更新您的剧本、插件以及 Ansible 基础架构的其他部分,以便它们能够与 Ansible 的此版本一起使用。

我们建议您阅读此页面以及 Ansible 2.9 的变更日志,以了解您可能需要进行哪些更新。

本文档是移植集合的一部分。完整的移植指南列表可在 移植指南 中找到。

剧本 (Playbook)

清单 (Inventory)

  • hash_behaviour 现在影响清单源。如果您将其设置为 merge,则从清单获得的数据可能会发生变化,您将必须相应地更新剧本。如果您使用默认设置 (overwrite),您将看不到任何变化。清单以前忽略此设置。

循环 (Loops)

Ansible 2.9 更稳健地处理“不安全”数据,确保标记为“不安全”的数据不会被模板化。在以前的版本中,Ansible 递归地将 lookup() 直接使用返回的所有数据标记为“不安全”,但仅当返回的元素是字符串时,才将使用 with_X 样式循环返回的结构化数据标记为“不安全”。Ansible 2.9 一致地处理这两种方法。

因此,如果您使用 with_dict 返回带有可模板化值的键,则您的模板在 Ansible 2.9 中可能无法按预期工作。

要允许旧的行为,请从使用 with_X 切换到使用带有过滤器 的loop,如 从 with_X 迁移到 loop 中所述。

命令行

  • Galaxy 令牌文件的位置已从 ~/.ansible_galaxy 更改为 ~/.ansible/galaxy_token。您可以使用 GALAXY_TOKEN_PATH 配置来配置路径和文件名。

已弃用

无重大更改

集合加载器更改

在 Ansible 2.9 版本中,导入 PowerShell 或 C# 模块实用程序的方式已更改。在 Ansible 2.8 中,实用程序使用以下语法导入

#AnsibleRequires -CSharpUtil AnsibleCollections.namespace_name.collection_name.util_filename
#AnsibleRequires -PowerShell AnsibleCollections.namespace_name.collection_name.util_filename

在 Ansible 2.9 中,这已更改为

#AnsibleRequires -CSharpUtil ansible_collections.namespace_name.collection_name.plugins.module_utils.util_filename
#AnsibleRequires -PowerShell ansible_collections.namespace_name.collection_name.plugins.module_utils.util_filename

集合导入名称的更改也要求使用较新的名称格式更新任何 C# 实用程序命名空间。这更冗长,但旨在确保我们避免不同插件类型之间的插件名称冲突,并标准化 PowerShell 中的导入方式与 Python 模块的工作方式。

模块 (Modules)

  • win_get_urlwin_uri 模块现在使用 ansible-httpget 的默认 User-Agent 发送请求。这可以通过使用 http_agent 键来更改。

  • apt 模块现在在安装其自身依赖项时会遵守 update_cache=false 并跳过缓存更新。显式设置 update_cache=true 或省略参数 update_cache 将导致在安装其自身依赖项时进行缓存更新。

  • Ansible 的 2.9.12 版本将基于文件的任务的默认模式更改为 0o600 & ~umask,此时用户未在基于文件的任务上指定 mode 参数。这是针对 CVE 报告的回应,我们对此进行了重新考虑。因此,模式更改已在 2.9.13 中恢复,模式现在将默认为 0o666 & ~umask,如 Ansible 的先前版本一样。

  • 如果您在使用 2.9.12 时更改了任何任务以指定限制较少的权限,则这些更改在 2.9.13 中将不再需要(但不会造成任何损害)。

  • 为避免 CVE-2020-1736 中提出的问题,请在所有接受它的基于文件的任务中指定 mode 参数。

  • dnfyum - 从 2.9.13 版本开始,dnf 模块(以及当它使用 dnfyum 操作)现在正确验证包的 GPG 签名 (CVE-2020-14365)。如果您看到类似于 Failed to validate GPG signature for [package name] 的错误,请确保您已导入正在使用的 DNF 存储库和/或包的正确 GPG 密钥。可以使用 rpm_key 模块来执行此操作。尽管我们不建议这样做,但在某些情况下,可能需要禁用 GPG 检查。这可以通过在您的 dnfyum 任务中显式添加 disable_gpg_check: yes 来完成。

_facts 重命名为 _info

Ansible 2.9 将许多模块从 <something>_facts 重命名为 <something>_info,因为这些模块不返回 Ansible 事实 (facts)。Ansible 事实与特定主机相关。例如,网络接口的配置、unix 服务器上的操作系统以及 Windows 盒子上安装的软件包列表都是 Ansible 事实。重命名的模块返回的值并非主机独有。例如,云提供商的帐户信息或区域数据。重命名这些模块应该可以更清楚地说明每一组模块提供的返回值类型。

编写模块

  • 模块和module_utils文件现在可以使用相对导入来包含其他module_utils文件。这对于缩短冗长的导入行非常有用,尤其是在集合中。

    在集合中使用相对导入的示例

    # File: ansible_collections/my_namespace/my_collection/plugins/modules/my_module.py
    # Old way to use an absolute import to import module_utils from the collection:
    from ansible_collections.my_namespace.my_collection.plugins.module_utils import my_util
    # New way using a relative import:
    from ..module_utils import my_util
    

    与Ansible一起发布的模块和module_utils也可以使用相对导入,但节省较小。

    # File: ansible/modules/system/ping.py
    # Old way to use an absolute import to import module_utils from core:
    from ansible.module_utils.basic import AnsibleModule
    # New way using a relative import:
    from ...module_utils.basic import AnsibleModule
    

    每个单点(.)代表树的一层(相当于文件系统相对链接中的../)。

    另请参见

    Python相对导入文档更详细地介绍了如何编写相对导入。

已移除的模块

以下模块不再存在:

弃用通知

以下模块将在Ansible 2.13中移除。请相应更新您的剧本。

以下功能将在 Ansible 2.12 中移除。请相应更新您的 playbook。

以下功能将在 Ansible 2.13 中移除。请相应更新您的 playbook。

对于以下模块,基于 PyOpenSSL 的后端 pyopenssl 已被弃用,并将从 Ansible 2.13 中移除。

已重命名的模块

以下模块已重命名。旧名称已弃用,并将从 Ansible 2.13 中移除。请相应更新您的 playbook。

值得注意的模块更改

  • vmware_cluster 进行了重构,以方便维护/修复错误。使用三个新的专用模块来配置集群。使用 vmware_cluster_drs 配置 DRS,使用 vmware_cluster_ha 配置 HA,使用 vmware_cluster_vsan 配置 vSAN。

  • vmware_dvswitch 接受 folder 参数,用于将 dvswitch 放置在用户定义的文件夹中。此选项使 datacenter 成为可选参数。

  • vmware_datastore_cluster 接受 folder 参数,用于将数据存储集群放置在用户定义的文件夹中。此选项使 datacenter 成为可选参数。

  • mysql_db 除了 db 参数外,还返回新的 db_list 参数。此 db_list 参数指的是数据库名称列表。db 参数将在 2.13 版本中弃用。

  • snow_recordsnow_record_find 现在接受 instanceusernamepassword 参数的环境变量。此更改将这些参数标记为可选。

  • win_firewall_rule 中已弃用的 force 选项已被移除。

  • openssl_certificateownca 提供程序会在未显式禁用 ownca_create_authority_key_identifier: no 的情况下创建授权密钥标识符。这仅适用于 cryptography 后端,如果 cryptography 库可用,则默认选择此后端。

  • openssl_certificateowncaselfsigned 提供程序会在未显式禁用 ownca_create_subject_key_identifier: never_createselfsigned_create_subject_key_identifier: never_create 的情况下创建主题密钥标识符。如果 CSR 提供了主题密钥标识符,则会采用该标识符;如果没有,则会根据公钥创建该标识符。这仅适用于 cryptography 后端,如果 cryptography 库可用,则默认选择此后端。

  • 现在,openssh_keypair 模块会对公钥和私钥应用相同的文件权限和所有权(两者都具有相同的modeownergroup 等)。如果您需要更改某个密钥的权限/所有权,请在创建密钥后使用 file 模块进行修改。

插件

已移除的查找插件

  • redis_kv 使用 redis 代替。

移植自定义脚本

无重大更改

网络

网络资源模块

Ansible 2.9 引入了第一批网络资源模块。网络设备配置的各个部分可以被认为是由该设备提供的资源。网络资源模块的范围故意限定为配置单个资源,您可以将它们组合作为构建块来配置复杂的网络服务。较旧的模块在 Ansible 2.9 中已弃用,并将 Ansible 2.13 中移除。您应该扫描上面弃用模块的列表,并使用新的网络资源模块替换您的 playbook 中的旧模块。有关详细信息,请参阅 Ansible 2.9 中的网络功能

改进的网络设备 gather_facts 支持

在 Ansible 2.9 中,gather_facts 关键字现在支持以标准化的键值对收集网络设备事实。您可以将这些网络事实馈送到后续任务中以管理网络设备。您还可以将新的 gather_network_resources 参数与网络 *_facts 模块(例如 eos_facts)一起使用,以仅返回设备配置的子集。请参阅 从网络设备收集事实 以了解示例。

2.9 版本中移除的顶级连接参数

在 2.9 版本中,移除了诸如 usernamehostpassword 之类的顶级连接参数。

旧版本 Ansible < 2.4

- name: example of using top-level options for connection properties
  ios_command:
    commands: show version
    host: "{{ inventory_hostname }}"
    username: cisco
    password: cisco
    authorize: yes
    auth_pass: cisco

将您的 playbook 更改为使用标准 Ansible 连接属性的 network_clinetconf 连接类型,并通过组在清单中设置这些属性。在更新您的 playbook 和清单文件时,您可以轻松地将更改应用于 become 以进行权限提升(在支持此功能的平台上)。有关更多信息,请参阅 使用网络模块的 become 指南和 平台文档