Ansible 2.7 移植指南
本节讨论 Ansible 2.6 和 Ansible 2.7 之间的行为变更。
旨在帮助您更新 Playbook、插件和其他 Ansible 基础设施部分,以便它们可以与此版本的 Ansible 一起使用。
我们建议您阅读此页面以及 Ansible 2.7 更新日志,以了解您可能需要进行的更新。
本文档是关于移植的系列文档的一部分。完整的移植指南列表可以在移植指南中找到。
命令行
如果您在命令行中多次指定 --tags
或 --skip-tags
,Ansible 将合并指定的标签。在以前版本的 Ansible 中,如果您只想保留最后指定的 --tags
,则可以将 merge_multiple_cli_tags
设置为 False
。此配置选项的存在是为了向后兼容。覆盖行为在 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。积极开发的、附带 Python-2.6 的 Linux 发行版有一些安装较新 Python 版本的方法(例如,您可以通过 RHEL-6 上的 SCL 安装 Python-2.7),但您可能还需要为许多常用模块安装 Python 绑定才能工作(例如,对于 RHEL-6,必须为更新的 Python 安装安装 selinux 绑定和 yum)。
决定放弃控制器上的 Python-2.6 支持是因为许多依赖库在那里变得不可用。特别是,python-cryptography 不再适用于 Python-2.6,而 pycrypto(python-cryptography 的替代方案)的最后一个版本存在永远不会修复的已知安全错误。
Playbook
角色加载期间的角色优先级修复
Ansible 2.7 对加载角色时的变量优先级进行了一些小更改,解决了一个错误,确保角色加载与 变量优先级预期相匹配。
在 Ansible 2.7 之前,在加载角色时,在解析角色的 tasks/main.yml
文件时,该角色的 vars/main.yml
和 defaults/main.yml
中定义的变量不可用。这阻止了角色在解析时使用这些变量。当将 import_tasks
或 import_role
与在角色的 vars 或 defaults 中定义的变量一起使用时,问题就会显现出来。
在 Ansible 2.7 中,角色 vars
和 defaults
现在在 tasks/main.yml
之前解析。如果相同的变量在播放级别和角色级别使用不同的值定义,并在 import_tasks
或 import_role
中用于定义要导入的角色或文件,则可能会导致行为发生变化。
include_role 和 import_role 变量暴露
在 Ansible 2.7 中,名为 public
的新模块参数已添加到 include_role
模块,该参数指示角色的 defaults
和 vars
是否会暴露在角色之外,从而允许后面的任务使用这些变量。此值默认为 public: False
,与当前行为相匹配。
import_role
不支持 public
参数,并将无条件地将角色的 defaults
和 vars
暴露给 playbook 的其余部分。此功能使 import_role
与播放中 roles
标头中列出的角色更紧密地对齐。
与 import_role
(静态)相比,include_role
(动态)将暴露角色的变量的方式存在重要差异。import_role
是一个预处理器,并且 defaults
和 vars
在 playbook 解析时进行评估,从而使变量可用于播放中任何位置列出的任务和角色。include_role
是一个条件任务,并且 defaults
和 vars
在执行时进行评估,从而使变量可用于 include_role
任务之后列出的任务和角色。
include_tasks/import_tasks 内联变量
从 Ansible 2.7 开始,include_tasks 和 import_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 的密码视为不设置密码的请求。如果您的 playbook 因此开始出错,请更改此过滤器正在使用的哈希算法。
已弃用
加速弃用:在 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 开始,在 AnsibleModule
中引用 __file__
将始终失败。
如果您是使用 __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 中删除。
任务不应依赖隐式压缩,而应直接将列表提供给模块的 name
、pkg
或 package
参数。自 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 facility。由于旧版本 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 中删除。请相应地更新您的 playbook。
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。
值得注意的模块更改
现在,
command
和shell
模块支持检查模式。但是,仅当指定creates
或removes
时才支持。如果指定了其中任何一个,则该模块将检查文件是否存在并报告正确的更改状态;如果没有包含其中任何一个,则该模块将像以前一样跳过。win_chocolatey
模块最初要求proxy_username
和proxy_password
转义值中的任何双引号。现在不再需要此操作,并且转义可能会导致更多问题。win_uri
模块已删除已弃用的选项use_basic_parsing
,自 Ansible 2.5 以来,此选项没有任何作用win_scheduled_task
模块已删除以下已弃用的选项executable
,请改用 actions 条目中的path
argument
,请改用 actions 条目中的arguments
store_password
,请改用logon_type: password
days_of_week
,请改用 triggers 条目中的monthlydow
frequency
,请改用 triggers 条目中的type
time
,请改用 triggers 条目中的start_boundary
na_ontap_net_vlan
的interface_name
模块选项已被删除,应从您的 playbook 中删除win_disk_image
模块已弃用返回值mount_path
,请改用mount_paths[0]
。 这将在 Ansible 2.11 中删除。现在可以直接从
ansible
(adhoc) 和ansible-console
使用include_role
和include_tasks
#> ansible -m include_role -a 'name=myrole' all
pip
模块已添加对setuptools
的依赖,以支持版本要求,此要求适用于执行模块的 Python 解释器,而不是模块正在管理的 Python 解释器。在 Ansible 2.7.10 之前的版本中,当同时使用
before
和after
选项时,replace
模块的行为与预期相反。现在此问题已得到修复,但可能需要修改任务。
插件
如果指定的哈希算法不受控制器支持,hash_password 过滤器现在会抛出错误。这提高了过滤器的安全性,因为它之前在算法未知的情况下会返回 None。一些模块,特别是 user 模块,将密码为 None 的情况视为不设置密码的请求。如果您的剧本因此开始报错,请更改此过滤器使用的哈希算法。
移植自定义脚本
没有明显的更改。
网络
没有明显的更改。