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

Ansible安装Kibana插件时rejectattr过滤出现未定义变量错误

Kibana插件安装Ansible任务错误解决:'AnsibleUnsafeText object'无'plugin'属性

问题场景

编写Ansible任务安装Kibana插件时,尝试用rejectattr过滤器跳过已安装插件,执行剧本后触发错误:'ansible.utils.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'plugin'。

相关配置与任务代码

my_vars.yaml

kibanaPlugins:
  - plugin: "wazuh_kibana"
    url: 'https://reposxxx'
  - plugin: "kibanaPrometheusExporter"
    url: "https://reposxxxx"

Ansible任务代码

- name: List current kibana plugins
  command: "{{ kibanaPluginCommand }} list --allow-root"
  register: kibanaCurrentPlugins
  changed_when: false
  tags:
    - kibana-plugins

- name: Install kibana plugins 
  command: "{{ ansible_check_mode | ternary('echo', '') }} {{ kibanaPluginCommand }} install {{ item.url | default(item.plugin) }} --allow-root"
  with_items: "{{ kibanaPlugins | rejectattr('plugin', 'in', kibanaCurrentPlugins.stdout_lines)}}"
  changed_when: kibanaInstallingPluginsResult.stdout is search("Plugin")
  check_mode: false
  tags:
    - kibana-plugins

错误信息

The task includes an option with an undefined variable. The error was:
'ansible.utils.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'plugin'

The error appears to be in '/builds/kibana/tasks/main.yml': line 166, column 3,
but may be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

- name: Install kibana plugins
  ^ here

Debug输出

执行debug任务查看过滤器结果:

- name: debug for task install kibana plugin
  debug:
    msg: "{{ (kibanaPlugins | rejectattr('plugin', 'in', kibanaCurrentPlugins.stdout_lines)) | list }}"
  tags:
    - kibana-plugins

输出结果:

TASK [kibana : Install kibana plugins xx.xx.xx] *************************** 
Monday 27 March 2023  15:29:01 +0000 (0:00:00.034)       0:00:42.121 **********  
changed: [localhost] => {    
    "msg": "<generator object select_or_reject at 0x7f9bcc9d1190>" 
}

问题原因

rejectattr过滤器的in测试逻辑是检查属性值是否包含在单个字符串中,而非判断属性值是否存在于列表里。传入kibanaCurrentPlugins.stdout_lines(列表类型)后,过滤器逻辑错误,导致没有正确筛选出需要安装的插件,反而触发迭代对象类型错误。同时debug输出显示生成器对象,说明过滤器未正确执行,进一步验证了语法逻辑错误。

解决方案

替换rejectattr为reject过滤器,结合自定义条件判断插件是否已安装:

修正后的安装任务

- name: Install kibana plugins 
  command: "{{ ansible_check_mode | ternary('echo', '') }} {{ kibanaPluginCommand }} install {{ item.url | default(item.plugin) }} --allow-root"
  with_items: "{{ kibanaPlugins | reject(item => item.plugin in kibanaCurrentPlugins.stdout_lines) }}"
  register: kibanaInstallingPluginsResult
  changed_when: kibanaInstallingPluginsResult.stdout is search("Plugin")
  check_mode: false
  tags:
    - kibana-plugins

补充说明

  1. 新增register: kibanaInstallingPluginsResult,原任务的changed_when中引用了该变量但未注册,属于遗漏配置。
  2. 使用reject(item => item.plugin in kibanaCurrentPlugins.stdout_lines)直接判断每个插件的plugin字段是否存在于已安装插件列表中,逻辑更清晰且符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 21:17:41