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
补充说明
- 新增
register: kibanaInstallingPluginsResult,原任务的changed_when中引用了该变量但未注册,属于遗漏配置。 - 使用
reject(item => item.plugin in kibanaCurrentPlugins.stdout_lines)直接判断每个插件的plugin字段是否存在于已安装插件列表中,逻辑更清晰且符合需求。
内容的提问来源于stack exchange,提问作者Ciocoiu Petrisor
相关产品推荐
相关产品推荐

