You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ansible-lint报错:Jinja模板中已注册变量installed_certs未定义

Ansible-lint 报错已注册变量未定义

角色代码

- name: 复制可信证书
  ansible.builtin.copy:
    src: "{{ item }}"
    dest: '{{ ssl_certs_path }}/'
  register: installed_certs
  with_items: '{{ ssl_trusted_certs }}'
  become: true

- name: 计算证书哈希值
  ansible.builtin.command: openssl x509 -noout -hash -in {{ item }}
  register: cert_hash
  loop: "{{ installed_certs | json_query('results[*].dest') }}"

剧本变量配置

- hosts: all
  name: 执行角色
  roles:
    - myRole
  vars:
    ssl_trusted_certs:
      - '/foo/myCa.crt'

问题现象

该配置此前运行正常,但在Debian Testing环境使用仓库中的ansible-lint-6.13.1和ansible-7.2.0时,ansible-lint抛出致命错误:

WARNING Listing 1 violation(s) that are fatal
jinja[invalid]: Error in jmespath.search in json_query filter plugin:
'installed_certs' is undefined

解决方法

方法1:给注册变量加默认值

ansible-lint的静态分析无法识别with_items注册变量的逻辑,给installed_certs添加默认空结构,让Jinja表达式在静态检查时合法:

loop: "{{ installed_certs | default({'results': []}) | json_query('results[*].dest') }}"

实际运行时installed_certs会被正确赋值,不影响功能。

方法2:替换with_items为loop

新版ansible-lint对loop的静态分析支持更友好,把第一个任务的with_items改成loop:

- name: 复制可信证书
  ansible.builtin.copy:
    src: "{{ item }}"
    dest: '{{ ssl_certs_path }}/'
  register: installed_certs
  loop: '{{ ssl_trusted_certs }}'
  become: true

方法3:禁用对应lint规则

如果不想修改代码,可在.ansible-lint配置文件中把jinja[invalid]加入警告列表(而非致命错误):

warn_list:
  - jinja[invalid]

但不推荐此方法,可能掩盖真实的语法问题。

内容的提问来源于stack exchange,提问作者mat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:03:37