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

在 2.4 之前的 Ansible 版本中,清单系统会维护执行的初始剧本的上下文。这允许来自其他目录的连续包含的剧本继承相对于顶级剧本文件放置的 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 模块现在可以正确地在命令行中保留带引号的参数。尝试通过添加额外的引号/转义来解决此问题的任务可能需要重新修改以删除多余的转义。有关更多详细信息,请参阅 问题 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 的开发工作现在将集中在编写插件而不是增强现有脚本上。

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

回调插件

用户

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

开发人员

  • 如果您的回调未继承自 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)是为了向后兼容而保留的,但会警告用户该函数已弃用。

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