Ansible 2.4 移植指南

本节讨论 Ansible 2.3 和 Ansible 2.4 之间的行为变化。

旨在帮助您更新剧本、插件和 Ansible 基础架构的其他部分,以便它们能够与该版本的 Ansible 兼容。

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

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

Python 版本

Ansible 将不再支持目标主机上的 Python 2.4 或 2.5。未来,目标主机将需要 Python 2.6+,控制器上也是如此。

清单

清单已重构为通过插件实现,现在允许使用多个来源。此更改对用户来说大多是透明的。

一个例外是 inventory_dir,它现在是一个主机变量;以前它只能有一个值,因此它是全局设置的。这意味着您不能再在剧本的早期使用它来确定 hosts: 或类似关键字。这也改变了 add_hosts 和隐式 localhost 的行为;因为它们不再自动继承全局值,所以它们默认为 None。有关更多信息,请参阅模块文档。

inventory_file 保持几乎不变,因为它始终是特定于主机的。

由于不再存在单个清单,“隐式 localhost”不会定义这两个变量中的任何一个。

修复了清单路径/目录的一个错误,该错误默认为当前工作目录。当主机列表(逗号分隔的主机名)作为清单提供时,这导致 group_varshost_vars 从当前工作目录而不是剧本或清单目录旁边被提取。

初始剧本相对 group_vars 和 host_vars

在 Ansible 2.4 之前的版本中,清单系统将维护正在执行的初始剧本的上下文。这允许从其他目录连续包含的剧本继承相对于顶级剧本文件放置的 group_vars 和 host_vars。

由于某些行为不一致,从 Ansible 2.4 版本开始,此功能将不包含在新清单系统中。

仍然可以通过使用 vars_files、include_vars 或相对于清单文件放置的 group_vars 和 host_vars 来实现类似的功能。

已弃用

指定清单来源

命令行上使用 --inventory-file 现已弃用。请使用 --inventory-i。相关的 ini 配置键 hostfile 和环境变量 ANSIBLE_HOSTS 也已弃用。请将其替换为配置键 inventory 和环境变量 ANSIBLE_INVENTORY

多个标签的使用

在命令行上多次指定 --tags(或 --skip-tags)目前会导致最后一个覆盖所有之前的标签。此行为已弃用。将来,如果您多次指定 –tags,则标签将合并在一起。从现在开始,在一个命令行上多次使用 --tags 将发出弃用警告。在 ansible.cfg 文件中将 merge_multiple_cli_tags 选项设置为 True 将启用新行为。

在 2.4 中,默认值已更改为合并标签。您可以通过配置选项启用旧的覆盖行为。

在 2.5 中,多个 --tags 选项将被合并,无法恢复到旧的行为。

其他注意事项

此版本中没有重大更改。

模块

此处详细介绍了常用模块中的重大更改

  • win_shellwin_command 模块现在可以正确保留命令行中带引号的参数。试图通过添加额外引号/转义来解决此问题的任务可能需要重新修改以删除多余的转义。有关更多详细信息,请参阅 Issue 23019

已移除的模块

以下模块不再存在

弃用通知

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

值得注意的模块更改

  • win_get_url 模块在其结果中包含的字典 win_get_url 已弃用,其内容现在也直接在结果输出中可用,就像其他模块一样。此字典将在 Ansible 2.8 中移除。

  • win_unzip 模块不再在其结果中包含字典 win_unzip;内容现在直接包含在结果输出中,与其他模块类似。

  • win_package 模块的返回值 exit_coderestart_required 已弃用,分别改用 rcreboot_required。弃用的返回值将在 Ansible 2.6 中移除。

插件

引入了一种配置和编写插件的新方法。这不需要更改现有设置,但开发人员应立即开始适应新的基础架构。更多详细信息将在每个插件类型的开发者文档中提供。

变量插件更改

变量插件的实现发生了许多更改,但用户和开发人员都不需要进行任何更改即可保持当前设置的正常运行。开发人员应考虑更改其插件以利用新功能。

对用户而言,最显著的区别在于变量插件现在按需调用,而不是在清单构建时调用。这应该会提高大型清单的效率,尤其是在使用主机子集时。

注意

  • 这在使用与剧本相邻的 group/host_vars 时也会产生差异。之前,加载的“第一个”剧本决定了变量;现在是“当前”剧本决定。我们正在努力尽快解决这个问题,因为应该考虑路径中的“所有剧本”进行变量加载。

  • 在 2.4.1 中,我们添加了一个切换开关来控制此行为,“top”将是 2.4 之前的版本,“bottom”将使用托管任务的当前剧本,“all”将自上而下使用所有剧本。

清单插件

开发人员应开始从使用动态清单脚本的硬编码清单迁移到新的清单插件。这些脚本仍将通过 script 清单插件工作,但 Ansible 的开发工作现在将集中在编写插件而不是增强现有脚本上。

用户和开发人员都应该了解新的插件,因为它们旨在减轻动态清单脚本中许多 hack 和变通方法的需求。

回调插件

用户

  • 回调现在使用新的配置系统。用户无需进行任何更改,因为旧系统仍然有效,但如果使用的任何回调没有继承内置类,您可能会看到弃用通知。开发人员需要按如下所述更新它们。

开发者

  • 如果您的回调没有直接或间接地通过另一个回调继承自 CallbackBase,它仍然有效,但会发出弃用通知。为避免这种情况并确保其在未来有效,请将其更改为继承自 CallbackBase,以便它具有新的选项处理方法和属性。您也可以实现新的选项处理方法和属性,但这不会自动继承将来添加的更改。您可以查看 CallbackBase 本身和/或 AnsiblePlugin 以了解详细信息。

  • 任何继承自其他回调的回调可能也需要更新,以包含与父回调相同的文档化选项,否则这些选项将不可用。开发人员指南中对此进行了说明。

模板查找插件:转义字符串

在 Ansible 2.4 之前,传递给模板查找插件的字符串中的反斜杠会自动转义。在 2.4 中,用户负责自己转义反斜杠。此更改使模板查找插件与模板模块保持一致,以便相同的反斜杠转义规则同时适用于两者。

如果您有这样的模板查找

- debug:
    msg: '{{ lookup("template", "template.j2") }}'

**旧版** 在 Ansible 2.3(及更早版本)中,template.j2 将如下所示

{{ "name surname" | regex_replace("^[^\s]+\s+(.*)", "\1") }}

**新版** 在 Ansible 2.4 中,应将其更改为如下所示

{{ "name surname" | regex_replace("^[^\\s]+\\s+(.*)", "\\1") }}

测试

测试成功/失败

在 Ansible 2.4 版本之前,任务返回码 rc 将覆盖返回码 failed。在 2.4 版本中,rcfailed 都用于计算任务的状态。因此,测试插件 succeeded/failed` 也发生了更改。这意味着使用 failed_when: no 覆盖任务失败将导致 succeeded/failed 返回 True/False。例如

- command: /bin/false
  register: result
  failed_when: no

- debug:
    msg: 'This is printed on 2.3'
  when: result|failed

- debug:
    msg: 'This is printed on 2.4'
  when: result|succeeded

- debug:
    msg: 'This is always printed'
  when: result.rc != 0

从上面的示例可以看出,在 Ansible 2.3 中,succeeded/failed 只检查 rc 的值。

网络

网络模块的操作方式发生了一些变化。

剧本仍应使用 connection: local

持久连接

在 Ansible 2.3 中添加的配置变量 connection_retriesconnect_interval 现已弃用。对于 Ansible 2.4 及更高版本,请使用 connection_retry_timeout

要控制超时,请使用 command_timeout,而不是以前在 [default] 下的顶级 timeout 变量。

有关更多信息,请参见 Ansible 网络调试指南

配置

配置系统进行了一些重大更改。用户不受影响,除了以下情况:

  • 定义的所有相对路径相对于 ansible.cfg 文件本身。以前它们因设置而异。新的行为应该更可预测。

  • 为路径提供了一个新的宏 {{CWD}},这将使路径相对于“当前工作目录”,这是不安全的,但一些用户确实希望依赖此行为。

直接使用先前 API 的开发人员应重新检查其用法,因为某些方法(例如 get_config)保留是为了向后兼容,但会警告用户该函数已弃用。

新的配置旨在最大限度地减少核心代码中对新插件的更改需求。插件只需要记录其设置,配置系统将使用文档来提供它们所需的内容。这仍在进行中;目前只有“回调”和“连接”插件支持此功能。更多详细信息将添加到具体的插件开发人员指南中。