Ansible条件任务报错:仅当Kibana状态为Green时列插件失败
解决Kibana插件列表任务的条件判断问题
问题根源
出现的两个错误都是因为条件判断的逻辑和语法没处理对:
- 多余的Jinja2分隔符:Ansible的
when参数本身就基于Jinja2解析,不需要额外用{{}}包裹变量,加了反而会触发语法报错。 - 未预判任务失败场景:当Kibana没启动时,
uri任务会失败,此时kibanaApi变量里根本没有json这个属性,直接访问自然会报'dict object' has no attribute 'json'。
正确的任务实现代码
- name: 检查Kibana运行状态 uri: url: "http://localhost:5601/api/status" method: GET return_content: yes register: kibanaApi ignore_errors: yes # 就算Kibana没启动,也不让整个play中断 - name: 列出已安装的Kibana插件(仅状态为Green时执行) command: /usr/share/kibana/bin/kibana-plugin list register: kibana_plugins when: - kibanaApi is succeeded # 先确认状态检查任务成功完成 - kibanaApi.json.status.overall.state == 'green' - name: 打印插件列表 debug: var: kibana_plugins.stdout_lines when: - kibanaApi is succeeded - kibanaApi.json.status.overall.state == 'green'
核心修正说明
- 加
ignore_errors: yes:让状态检查任务在Kibana未启动时,只记录失败状态而不终止后续任务,这样后续才能通过kibanaApi is succeeded来判断是否有可用的json数据。 - 调整
when条件逻辑:- 先判断任务是否执行成功,确保
json属性存在后再去访问内部的状态字段。 - 彻底去掉
{{}},直接写变量表达式,符合Ansible的语法要求。
- 先判断任务是否执行成功,确保
- 分步校验:先验证任务成功,再检查状态值,从根源避免了属性不存在的错误。
错误写法对比(反面示例)
之前出错的when条件大概率是这样的:
# 错误写法:多了Jinja2分隔符,也没判断任务状态 when: "{{ kibanaApi.json.status.overall.state == 'green' }}"
这种写法既违反了when的语法规则,又没考虑Kibana未启动时的异常场景,自然会触发双重错误。
内容的提问来源于stack exchange,提问作者Ciocoiu Petrisor
相关产品推荐
相关产品推荐

