Ansible-core 2.15 移植指南

本节讨论 ansible-core 2.14 和 ansible-core 2.15 之间的行为更改。

它旨在帮助您更新 Playbook、插件和 Ansible 基础设施的其他部分,使其能够与此版本的 Ansible 一起工作。

我们建议您阅读此页面以及ansible-core 2.15 的更新日志,以了解您可能需要进行的更新。

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

Playbook

  • 条件 - 由于在 ansible-core 2.15.7 中缓解了安全问题 CVE-2023-5764,当嵌入式模板从不受信任的来源(如模块结果或标记为 !unsafe 的变量)查询数据时,带有嵌入式模板块的条件表达式可能会失败,并显示消息 “Conditional is marked as unsafe, and cannot be evaluated.”。当引用不受信任的数据时,带有嵌入式模板的条件可能成为恶意模板注入的来源,并且几乎总是在没有嵌入式模板的情况下进行重写。Playbook 任务条件关键字(如 whenuntil)长期以来都显示警告,不鼓励在条件中使用嵌入式模板;此警告也已扩展到非任务条件,如 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'
    

处理程序

如文档所述,如果定义了多个具有特定名称的处理程序,则最后添加到 Play 中的处理程序是通知时执行的处理程序。在 ansible-core 2.15 之前,对于使用 include_role 任务动态包含到 Play 中的处理程序,情况并非如此。此问题已在 ansible-core 2.15 中解决,依赖于 ansible-core 2.14 及更早版本的行为的用户可能需要相应地调整其 Playbook。

作为行为更改的示例,请考虑以下内容

- include_role:
    name: foo
  vars:
    invocation: 1

- block:
   - include_role:
       name: foo
     vars:
       invocation: 2
  when: inventory_hostname == "bar"

- meta: flush_handlers

注意

该示例假设角色 foo 中有一个任务,该任务通知角色 foo 中的一个名为 foo_handler 的处理程序。

注意

不同的变量和/或其值附加到包含相同角色的 include_role 任务的事实使得它们成为不同的角色。

注意

第二次调用 include_role 任务会导致从角色中包含任务和处理程序,而不管 when 条件评估结果如何。when 条件附加到包装 include_role 任务的 block,因此 when 条件适用于角色中包含到 Play 中的所有任务和处理程序。

flush_handlers 任务运行时,所有主机都会在第一次调用 include_role 时通知 foo_handler。此外,主机 bar(由于 when 限制了所有其他主机)在第二次调用 include_role 期间再次通知了 foo_handler

ansible-core 2.15 上,添加到 Play 中的最后一个名为 foo_handler 的处理程序来自第二次 include_role 调用,因此附加了 when: inventory_hostname == "bar",导致该处理程序实际上只在主机 bar 上运行,并在所有其他主机上跳过。因此,来自主机 bar 的通知已被去重。

ansible-core 2.14 及更早版本上,来自第一次调用的 foo_handler 在所有主机上运行。此外,来自第二次调用的 foo_handler 再次在主机 bar 上运行。

命令行

  • 当结果为空时,ansible-galaxy search 的返回码现在为 0 而不是 1,并且 stdout 为空,以与其他 ansible-galaxy 命令保持一致。

已弃用

  • 不建议向 vars: 提供字典列表,而应提供字典。

    代替

    vars:
      - var1: foo
      - var2: bar
    

    使用

    vars:
      var1: foo
      var2: bar
    

模块

无显著更改

已删除的模块

以下模块不再存在

  • 无显著更改

弃用通知

无显著更改

值得注意的模块更改

无显著更改

插件

无显著更改

移植自定义脚本

无显著更改

网络

无显著更改