Ansible-core 2.14 移植指南
本节讨论 ansible-core
2.13 和 ansible-core
2.14 之间的行为变化。
其目的是帮助您更新您的剧本、插件以及 Ansible 基础架构的其他部分,以便它们能够与 Ansible 的此版本一起工作。
我们建议您阅读此页以及 Ansible-core 2.14 的变更日志,以了解您可能需要进行哪些更新。
本文档是关于移植的集合的一部分。完整的移植指南列表可以在 移植指南 中找到。
剧本
条件语句 - 由于在 ansible-core 2.14.12 中缓解了安全问题 CVE-2023-5764,包含嵌入式模板块的条件表达式可能会失败,并显示消息“
Conditional is marked as unsafe, and cannot be evaluated.
”,当嵌入式模板从不受信任的来源(如模块结果或标记为!unsafe
的变量)查询数据时。包含嵌入式模板的条件语句在引用不受信任的数据时可能是恶意模板注入的来源,并且几乎总是可以重写而无需嵌入式模板。剧本任务条件关键字(如when
和until
)长期以来一直显示警告,不建议在条件语句中使用嵌入式模板;此警告也已扩展到非任务条件语句,例如assert
动作。- name: task with a module result (always untrusted by Ansible) shell: echo "hi mom" register: untrusted_result # don't do it this way... # - name: insecure conditional with embedded template consulting untrusted data # assert: # that: '"hi mom" is in {{ untrusted_result.stdout }}' - name: securely access untrusted values directly as Jinja variables instead assert: that: '"hi mom" is in untrusted_result.stdout'
变量现在是延迟计算的;只有在实际使用时才会计算。例如,在 ansible-core 2.14 中,表达式
{{ defined_variable or undefined_variable }}
不会在undefined_variable
上失败,如果or
的第一部分计算结果为True
,因为它不需要计算第二部分。需要注意的一个特定行为变化案例是下面使用undefined
测试的任务。在 2.14 版本之前,这将导致尝试访问字典中未定义的值时出现致命错误。在 2.14 中,断言通过,因为字典通过其未定义值之一被评估为未定义。
- assert: that: - some_defined_dict_with_undefined_values is undefined vars: dict_value: 1 some_defined_dict_with_undefined_values: key1: value1 key2: '{{ dict_value }}' key3: '{{ undefined_dict_value }}'
命令行
此版本需要控制器节点上的 Python 3.9。
启动时,将检查文件系统编码和区域设置以验证它们是否为 UTF-8。如果不是,则进程将退出并报告错误的编码。如果您以前使用的是
C
或POSIX
区域设置,则您可以使用C.UTF-8
。如果您以前使用的是en_US.ISO-8859-1
等区域设置,则您可以使用en_US.UTF-8
。为简单起见,最简单的方法可能是使用LC_ALL
环境变量导出相应的区域设置。修改系统区域设置的另一种方法是在 UTF-8 模式下运行 Python;有关更多信息,请参阅 Python 文档。
已弃用
无重大更改
模块
无重大更改
已移除的模块
以下模块已不存在
无重大更改
弃用通知
无重大更改
值得注意的模块更改
无重大更改
插件
无重大更改
移植自定义脚本
无重大更改
网络
无重大更改