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-Agent ansible-httpget 发送请求。 可以使用 http_agent 键进行更改。

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

  • 当用户没有在基于文件的任务上指定 mode 参数时,Ansible 的 2.9.12 版本将基于文件的任务的默认模式更改为 0o600 & ~umask。 这是对我们重新考虑的 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 facts。Ansible facts 与特定的主机相关。例如,网络接口的配置、Unix 服务器上的操作系统以及 Windows 计算机上安装的软件包列表都是 Ansible facts。重命名的模块返回的值并非主机所独有。例如,云提供商的帐户信息或区域数据。重命名这些模块应该可以更清晰地了解每组模块提供的返回值类型。

编写模块

  • 模块和 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 中删除。请相应地更新您的 playbook。

以下功能将在 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 与网络模块一起使用 指南和 平台文档