Ansible 2.7 移植指南

本节讨论 Ansible 2.6 和 Ansible 2.7 之间的行为变化。

它的目的是帮助您更新剧本、插件和 Ansible 基础设施的其他部分,使其与该版本的 Ansible 兼容。

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

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

命令行

如果您在命令行中多次指定 --tags--skip-tags,Ansible 将合并指定的标签。在 Ansible 的先前版本中,您可以将 merge_multiple_cli_tags 设置为 False,如果您希望只保留最后指定的 --tags。此配置选项的存在是为了向后兼容。覆盖行为在 2.3 中被弃用,默认行为在 2.4 中更改。Ansible-2.7 移除此配置选项;现在,多个 --tags 将始终被合并。

如果您有一个 shell 脚本依赖于将 merge_multiple_cli_tags 设置为 False,请升级您的脚本,以便它在升级到 Ansible-2.7 之前只添加您真正想要的 --tags

Python 兼容性

Ansible 已放弃对控制器上的 Python-2.6 的兼容性(运行 /usr/bin/ansible/usr/bin/ansible-playbook 的主机)。与 Ansible 捆绑在一起的模块仍然可以用于管理仅具有 Python-2.6 的主机。您只需拥有一个具有 Python-2.7 或 Python-3.5 或更高版本的主机即可从该主机管理这些主机。

这会影响的一件事是使用 /usr/bin/ansible-pull 来管理具有 Python-2.6 的主机。 ansible-pull 在被管理的主机上运行,但它是一个控制器脚本,而不是一个模块,因此它将需要更新的 Python。主动开发的 Linux 发行版,它们附带 Python-2.6,有一些方法可以安装较新的 Python 版本(例如,您可以在 RHEL-6 上通过 SCL 安装 Python-2.7),但您可能还需要安装许多常见模块才能正常工作 的 Python 绑定(例如,对于 RHEL-6,您需要为更新的 Python 安装安装 selinux 绑定和 yum)。

在控制器上放弃 Python-2.6 支持的决定是基于,许多依赖库在那里变得不可用。特别是,python-cryptography 对于 Python-2.6 已经不可用,而 pycrypto(python-cryptography 的替代品)的最后一个版本存在已知的安全漏洞,这些漏洞永远不会被修复。

剧本

角色加载期间的角色优先级修复

Ansible 2.7 对加载角色时的变量优先级进行了一些小的更改,从而解决了 bug,确保角色加载符合 变量优先级预期

在 Ansible 2.7 之前,加载角色时,角色的 vars/main.ymldefaults/main.yml 中定义的变量在解析角色的 tasks/main.yml 文件时不可用。这阻止了角色在被解析时使用这些变量。当使用 import_tasksimport_role 以及角色的 vars 或 defaults 中定义的变量时,就会出现这个问题。

在 Ansible 2.7 中,角色的 varsdefaults 现在在 tasks/main.yml 之前解析。如果在剧本级别和角色级别定义了相同的变量,但使用了不同的值,并且在 import_tasksimport_role 中使用它们来定义要导入的角色或文件,这会导致行为发生变化。

include_role 和 import_role 变量暴露

在 Ansible 2.7 中,一个名为 public 的新模块参数被添加到 include_role 模块中,它决定角色的 defaultsvars 是否将在角色之外暴露,允许这些变量被后面的任务使用。此值默认为 public: False,与当前行为匹配。

import_role 不支持 public 参数,并将无条件地将角色的 defaultsvars 暴露给剧本的其余部分。此功能使 import_role 更接近于剧本中 roles 标头中列出的角色。

include_role(动态)和import_role(静态)在暴露角色变量的方式上存在重要区别。 import_role是一个预处理器, defaultsvars 在剧本解析时进行评估,使变量在剧本中任何位置列出的任务和角色中都可用。 include_role 是一个条件任务,defaultsvars 在执行时进行评估,使变量在 include_role 任务之后列出的任务和角色中可用。

include_tasks/import_tasks 内联变量

从 Ansible 2.7 开始,include_tasksimport_tasks 不再接受内联变量。任务应该在 vars 关键字下提供变量,而不是使用内联变量。

在 Ansible 2.6(及更早版本)中,以下语法对于指定变量是有效的

- include_tasks: include_me.yml variable=value

在 Ansible 2.7 中,任务应该更改为使用 vars 关键字

- include_tasks: include_me.yml
  vars:
    variable: value

vars_prompt 与未知算法

如果在 encrypt 中指定的哈希算法不受控制器支持,vars_prompt 现在将抛出错误。这提高了 vars_prompt 的安全性,因为它以前在算法未知时返回 None。一些模块,特别是 user 模块,将 None 密码视为不设置密码的请求。如果您的剧本因此开始出错,请更改正在使用的哈希算法。

弃用

加速弃用:在 AnsibleModule 中使用 __file__

注意

在 Ansible 2.7 中弃用 __file__ 变量的使用,并且将在 Ansible 2.8 中消除。这比我们通常的 4 个版本弃用周期快得多。

我们正在弃用使用 __file__ 变量来引用包含当前正在运行代码的文件。这种常见的 Python 技术用于查找文件系统路径并不总是有效(即使在纯 Python 中也是如此)。有时,Python 模块可以从虚拟位置(例如 zip 文件内部)导入。发生这种情况时,__file__ 变量将引用指向 zip 文件内部的虚拟位置。如果代码试图使用 __file__ 来查找包含 Python 模块的目录以写入一些临时信息,这可能会导致问题。

在 Ansible 2.1 中引入 AnsiBallZ 之前,在 AnsibleModule 中使用 __file__ 有时有效,但是任何使用它的模块在启用管道时都会失败(因为模块会被管道传输到 Python 解释器的标准输入,因此 __file__ 将不包含文件路径)。AnsiBallZ 无意中使使用 __file__ 有效,方法是始终为 AnsibleModule 创建一个临时文件。

Ansible 2.8 将不再为 AnsibleModule 创建一个临时文件;而是从 zip 文件中读取文件。此更改应该加快模块执行速度,但这意味着从 Ansible 2.8 开始,引用 __file__ 将始终在 AnsibleModule 中失败。

如果您是使用 __file__AnsibleModule 的第三方模块的作者,请立即更新您的模块,目前 __file__ 的使用已被弃用,但仍然可用。 __file__ 最常见的用途是查找要写入临时文件的目录。在 Ansible 2.5 及更高版本中,您可以使用 AnsibleModule 实例上的 tmpdir 属性,如 apt 模块 的代码所示。

-    tempdir = os.path.dirname(__file__)
-    package = os.path.join(tempdir, to_native(deb.rsplit('/', 1)[1]))
+    package = os.path.join(module.tmpdir, to_native(deb.rsplit('/', 1)[1]))

通过 squash_actions 对包模块使用循环

使用 squash_actions 调用包模块(例如“yum”)以仅调用一次模块已被弃用,并且将在 Ansible 2.11 中删除。

任务不应该依赖于隐式压缩,而是应该将列表直接提供给模块的 namepkgpackage 参数。此功能在大多数模块中自 Ansible 2.3 以来一直受支持。

在 Ansible 2.6(及更早版本)中,以下任务将仅调用一次“yum”模块来安装多个包

- name: Install packages
  yum:
    name: "{{ item }}"
    state: present
  with_items: "{{ packages }}"

在 Ansible 2.7 中,它应该更改为如下所示

- name: Install packages
  yum:
    name: "{{ packages }}"
    state: present

模块

这里详细介绍了流行模块中的重大更改

  • DEFAULT_SYSLOG_FACILITY 配置选项告诉 Ansible 模块在所有受管机器上记录信息时使用特定的 syslog 设施。由于旧版 Ansible 版本中的错误,此设置不会影响使用安装了 systemd Python 绑定的 journald 的机器。在这些机器上,即使您设置了 DEFAULT_SYSLOG_FACILITY,Ansible 日志消息也会发送到 /var/log/messages。Ansible 2.7 修复了此错误,根据为 DEFAULT_SYSLOG_FACILITY 设置的值路由所有 Ansible 日志消息。如果您配置了 DEFAULT_SYSLOG_FACILITY,则使用 journald 的系统上远程日志的位置可能会更改。

已删除的模块

以下模块不再存在

弃用通知

以下模块将在 Ansible 2.11 中删除。请相应地更新您的剧本。

  • na_cdot_aggregate 使用 na_ontap_aggregate 代替。

  • na_cdot_license 使用 na_ontap_license 代替。

  • na_cdot_lun 使用 na_ontap_lun 代替。

  • na_cdot_qtree 使用 na_ontap_qtree 代替。

  • na_cdot_svm 使用 na_ontap_svm 代替。

  • na_cdot_user 使用 na_ontap_user 代替。

  • na_cdot_user_role 使用 na_ontap_user_role 代替。

  • na_cdot_volume 使用 na_ontap_volume 代替。

  • sf_account_manager 使用 na_elementsw_account 代替。

  • sf_check_connections 使用 na_elementsw_check_connections 代替。

  • sf_snapshot_schedule_manager 使用 na_elementsw_snapshot_schedule 代替。

  • sf_volume_access_group_manager 使用 na_elementsw_access_group 代替。

  • sf_volume_manager 使用 na_elementsw_volume 代替。

值得注意的模块更改

  • 现在在 commandshell 模块中支持检查模式。但是,仅当指定了 createsremoves 时。如果指定了其中任何一个,模块将检查文件是否存在并报告正确的更改状态,如果未包含它们,模块将像以前一样跳过。

  • win_chocolatey 模块最初需要 proxy_usernameproxy_password 来转义值中的任何双引号。这不再需要,转义可能会导致更多问题。

  • win_uri 模块已删除弃用的选项 use_basic_parsing,自 Ansible 2.5 以来,此选项不再起作用。

  • win_scheduled_task 模块已删除以下弃用的选项

    • executable,在操作条目中使用 path 代替

    • argument,在操作条目中使用 arguments 代替

    • store_password,设置 logon_type: password 代替

    • days_of_week,在触发器条目中使用 monthlydow 代替

    • frequency,在触发器条目中使用 type 代替

    • time,在触发器条目中使用 start_boundary 代替

  • 用于 na_ontap_net_vlan 模块的 interface_name 模块选项已被移除,您应该从您的剧本中移除它。

  • win_disk_image 模块已弃用返回值 mount_path,请改用 mount_paths[0]。此项将在 Ansible 2.11 中移除。

  • include_roleinclude_tasks 现在可以直接从 ansible(临时)和 ansible-console 使用。

    #> ansible -m include_role -a 'name=myrole' all
    
  • pip 模块添加了对 setuptools 的依赖以支持版本要求,此要求是针对执行模块的 Python 解释器,而不是模块管理的 Python 解释器。

  • 在 Ansible 2.7.10 之前,replace 模块在使用 beforeafter 选项组合时与预期相反。现在它可以正常工作,但可能需要修改任务。

插件

  • 如果指定的散列算法不受控制器支持,hash_password 过滤器现在会抛出错误。这提高了过滤器的安全性,因为它以前在算法未知的情况下返回 None。一些模块,特别是 user 模块,将 None 密码视为不设置密码的请求。如果您的剧本因此开始报错,请更改此过滤器使用的散列算法。

移植自定义脚本

无显著变化。

网络

无显著变化。