Ansible调用from_json处理ec2.instances报错:预期字符串或缓冲区
解决Ansible中
from_json模板类型错误的问题 嘿,这个问题其实很常见——你完全搞反了from_json的用法!
你看到的错误在{{ ec2.instances | from_json }}处发生意外的模板类型错误:预期字符串或缓冲区,核心原因是:ec2.instances本身就不是JSON字符串!当你用ec2_instance_facts模块并register: ec2之后,Ansible已经帮你把AWS返回的响应直接转换成了Python原生的列表对象(每个元素是实例详情的字典),根本不需要再用from_json去解析。
from_json过滤器的作用是把JSON格式的字符串转换成Python对象,比如你从文件里读了一行纯JSON文本,或者某个API返回的是字符串格式的JSON,这时候才需要用它。而你现在把已经是Python对象的列表丢给它,它自然会报错说“我要的是字符串/缓冲区,你给我个列表干嘛”。
修正后的代码非常简单,直接去掉from_json就行:
- ec2_instance_facts: aws_access_key: "{{ key }}" aws_secret_key: "{{ secret }}" register: ec2 - name: "Looking up stuff." set_fact: a_count: "{{ ec2.instances }}" - debug: msg: "{{ a_count }}"
接下来你想用json_query处理这个数据也完全没问题,因为ec2.instances已经是符合JMESPath查询要求的结构了。举个实际例子,比如你想提取所有实例的ID和对应的私有IP:
- name: Extract instance IDs and private IPs with json_query set_fact: instance_info: "{{ ec2.instances | json_query('[].[instance_id, private_ip_address]') }}" - debug: msg: "{{ instance_info }}"
总结一下:在Ansible里,大部分云模块(包括ec2_instance_facts)返回的注册变量都是直接可用的Python对象,不需要额外的JSON解析步骤,只有当变量是纯JSON字符串的时候才需要用from_json。
内容的提问来源于stack exchange,提问作者Tony Stark
相关产品推荐
相关产品推荐

