Ansible循环检查AWS快照状态时JSON结构查询失败求助
问题:Ansible循环检查AWS快照状态失败
问题场景
编写了Ansible任务循环检查多个AWS快照是否完成,但执行时触发条件判断错误。
任务代码
- name: Volume Snapshot Statuses ec2_snapshot_info: aws_access_key: "{{ aws_access_key_id }}" aws_secret_key: "{{ aws_secret_key_id }}" security_token: "{{ aws_security_token }}" region: "{{ aws_region }}" snapshot_ids: "{{ item.snapshot_id }}" register: snapshots loop_control: index_var: loopidx until: snapshots.results[loopidx].snapshots[0].state == "completed" with_items: "{{ volumesnapshots.results }}"
错误信息
{ "msg": "The conditional check 'snapshots.results[loopidx].snapshots[0].state == \"completed\"' failed. The error was: error while evaluating conditional (snapshots.results[loopidx].snapshots[0].state == \"completed\"): 'dict object' has no attribute 'results'", "_ansible_no_log": false }
用户观察
查看任务返回的JSON结构,发现snapshots包含results属性,截取内容如下:
{ "snapshots": { "results": [ { "snapshots": [ {
问题原因
核心错误是对循环中register变量的结构理解偏差:
- 当使用
loop/with_items并搭配register时,results属性是整个循环执行完成后才会生成的数组,用于存储所有迭代的结果。 - 而
until条件是在每次循环迭代的重试过程中执行判断,此时register的snapshots仅存储当前单轮ec2_snapshot_info任务的执行结果(单个字典结构),还未生成results数组。
解决方法
修改until条件,直接引用当前迭代的任务结果,同时添加重试次数和间隔参数避免无限循环:
- name: Volume Snapshot Statuses ec2_snapshot_info: aws_access_key: "{{ aws_access_key_id }}" aws_secret_key: "{{ aws_secret_key_id }}" security_token: "{{ aws_security_token }}" region: "{{ aws_region }}" snapshot_ids: "{{ item.snapshot_id }}" register: snapshots loop_control: index_var: loopidx until: snapshots.snapshots[0].state == "completed" retries: 10 # 根据快照创建速度调整重试次数 delay: 30 # 每次重试间隔30秒 with_items: "{{ volumesnapshots.results }}"
说明
每次until重试时,snapshots存储的是当前单次ec2_snapshot_info的返回结果,直接访问snapshots.snapshots[0].state即可获取目标快照的实时状态。
内容的提问来源于stack exchange,提问作者snailrider
相关产品推荐
相关产品推荐

