Ansible 2.9 移植指南

本节讨论 Ansible 2.8 和 Ansible 2.9 之间的行为更改。

它旨在帮助您更新您的剧本、插件和 Ansible 基础架构的其他部分,以便它们可以与此版本的 Ansible 协同工作。

我们建议您将本页与 Ansible 2.9 的更改日志 结合起来阅读,以了解您可能需要进行哪些更新。

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

剧本

清单

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

循环

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 模块的导入方式保持一致。

模块

  • win_get_urlwin_uri 模块现在使用默认的 User-Agentansible-httpget 发送请求。这可以通过使用 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 模块(以及使用 dnf 时执行 yum 操作)现在可以正确验证软件包的 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 事实。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 中删除。请相应地更新您的剧本。

以下功能将在 Ansible 2.13 中删除。请相应地更新您的剧本。

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

重命名模块

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

值得注意的模块更改

  • 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 的环境变量。此更改将这些参数标记为可选参数。

  • 已弃用的选项 force 已从 win_firewall_rule 中删除。

  • openssl_certificate 的提供程序 ownca 在未显式禁用 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 中删除。您应该扫描上面的弃用模块列表,并使用新的网络资源模块替换您剧本中的这些模块。有关详细信息,请参阅 Ansible 2.9 中的网络功能

针对网络设备改进了 gather_facts 支持

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

在 2.9 中删除了顶级连接参数

顶级连接参数(如 usernamehostpassword)在 2.9 版本中已删除。

旧版本 在 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

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