跳至内容

键顺序

此规则建议重新排序 Ansible 内容中的键名,以使代码更易于维护且不易出错。

以下是一些针对任务和处理程序执行的常见排序检查示例

  • 对于剧本、任务和处理程序,name 必须始终是第一个键
  • 在任务中,blockrescuealways 键必须是最后一个键,这样可以避免在最后一个任务和父级之间发生意外的缩进错误。

问题代码

---
- hosts: localhost
  name: This is a playbook # <-- name key should be the first one
  tasks:
    - name: A block
      block:
        - name: Display a message
          debug:
            msg: "Hello world!"
      when: true # <-- when key should be before block

正确代码

---
- name: This is a playbook
  hosts: localhost
  tasks:
    - name: A block
      when: true
      block:
        - name: Display a message
          debug:
            msg: "Hello world!"

原因

为 Ansible 任务或剧本确定键的最佳顺序并非易事,因为我们需要考虑大量的组合。这也是我们从最小排序规则(name 作为第一个)开始,并旨在逐步添加更多字段的原因,并且只有在我们找到一个方法可能优于另一个方法的证据时才会这样做。

为什么我不再可以在 block 之后放置 when

试着记住,在现实生活中,block/rescue/always 由于它们内部承载的任务数量而往往会增长,使其超过单个屏幕的显示范围。这会将 when 任务从其余任务属性中移开。block 内最后一个任务的 when 很容易被误认为是在 block 级别,反之亦然。当任务从一个位置移动到另一个位置时,存在将 block 级别的 when 与其一起移动的真正风险。

通过将 when 置于 block 之前,我们可以避免这种风险。同样的风险也适用于任务级别的任何简单属性,这就是为什么我们得出结论:block 键必须是最后一个。

另一个常见做法是将 tags 作为最后一个属性。但是,出于同样的原因,我们决定也不应将其放在 block 键之后。

注意

可以使用 --fix 选项自动修复此规则。