跳到内容

语法检查

我们的 lint 工具在所有 playbook 上运行 ansible-playbook --syntax-check,如果其中任何一个报告语法错误,这将停止对这些文件的进一步处理。

此错误**无法禁用**,因为它其他步骤的先决条件。您可以将这些文件从 linting 中排除,但最好确保它们可以被 Ansible 加载。这通常通过编辑 inventory 文件和/或 ansible.cfg 来实现,以便 ansible 可以加载所需的变量。

如果未定义的变量导致失败,您可以使用 Jinja default() 过滤器来提供回退值,如下例所示。

此规则是少数几个无法添加到 skip_listwarn_listunskippable 规则之一。一种可能的解决方法是将整个文件添加到 exclude_paths。这对于特殊情况是有效的方法,例如故意无效的测试装置。

最常见的错误来源之一是未能在 playbook 开头断言各种变量的存在。

此规则可以产生如下消息

  • syntax-check[empty-playbook]: 空的 playbook,无事可做
  • syntax-check[malformed]: 加载块时遇到格式错误的块
  • syntax-check[missing-file]: 无法检索文件内容...找不到或无法访问...
  • syntax-check[unknown-module]: 无法解析模块/操作
  • syntax-check[specific]: 对于上面未提及的其他错误。

syntax-check[unknown-module]

linter 依赖于 ansible-core 代码来加载 ansible 代码,如果代码引用了未安装的 ansible 内容,则会产生语法错误。您必须确保存储库内使用的所有集合和角色都列在 requirements.yml 文件中,以便 linter 可以在它们丢失时安装它们。

requirements.yml 的有效位置是

  • requirements.yml
  • roles/requirements.yml
  • collections/requirements.yml
  • tests/requirements.yml
  • tests/integration/requirements.yml
  • tests/unit/requirements.yml

注意:如果需求与测试相关,则它们应位于 tests/ 中。

有问题的代码

---
- name:
    Bad use of variable inside hosts block (wrong assumption of it being
    defined)
  hosts: "{{ my_hosts }}"
  tasks: []

正确的代码

---
- name: Good use of variable inside hosts, without assumptions
  hosts: "{{ my_hosts | default([]) }}"
  tasks: []