如何从JSON字典获取green值?Salt SLS模板报错修复
问题分析与解决方案
报错原因
你的SLS代码遍历了JSON顶层的所有键值对,但顶层的name、uuid对应的值是字符串类型,并非字典,当尝试访问value['state']时,自然会触发str object has no attribute 'state'的错误——只有status下的嵌套字典(overall、statuses数组内的元素)才包含state字段。
正确获取green值的方案
根据需求,你可以直接定位到目标字段,或者针对性遍历包含state的层级:
方案1:直接获取整体状态(status.overall.state)
如果只需要获取全局的green状态,无需遍历所有顶层键:
{% set json_data = salt.cp.get_url('http://localhost:9200/api/status', dest=None) | load_json %} # 获取整体状态的state值 overall_state: {{ json_data['status']['overall']['state'] }} {% if json_data['status']['overall']['state'] == 'green' %} 整体状态正常:{{ json_data['status']['overall']['nickname'] }} {% endif %}
方案2:遍历所有服务状态项(status.statuses)
如果需要检查所有服务状态的state值,直接遍历status.statuses数组即可:
{% set json_data = salt.cp.get_url('http://localhost:9200/api/status', dest=None) | load_json %} {% for status_item in json_data['status']['statuses'] %} 服务ID: {{ status_item['id'] }} 状态: {{ status_item['state'] }} {% if status_item['state'] == 'green' %} - 该服务状态正常:{{ status_item['message'] }} {% endif %} {% endfor %}
方案3:兼容顶层遍历的修复(避免字符串类型报错)
如果一定要保留顶层遍历的逻辑,需要先判断值是否为字典类型,再访问state:
{% set json_data = salt.cp.get_url('http://localhost:9200/api/status', dest=None) | load_json %} {% for key, value in json_data.items() %} {% if key == 'status' %} # 处理overall状态 {% if value['overall']['state'] == 'green' %} overall状态: {{ value['overall']['state'] }} (found) {% endif %} # 处理statuses数组 {% for item in value['statuses'] %} {% if item['state'] == 'green' %} 服务{{ item['id'] }}状态: {{ item['state'] }} (found) {% endif %} {% endfor %} {% else %} {{ key }}: {{ value }} {% endif %} {% endfor %}
内容的提问来源于stack exchange,提问作者kevin voyce
相关产品推荐
相关产品推荐

