如何用Ansible获取AWS自动扩缩容组名称?排查结果为空问题
问题:Ansible ec2_asg_info按标签查询ASG返回空结果
我编写了Ansible Playbook,尝试通过标签匹配获取AWS自动扩缩容组(ASG)名称,初始Playbook代码如下:
- name: Find the green asg with matching tags ec2_asg_info: tags: service_name: cps_wallet Environment: "{{ name_env }}" service_state: green register: asgs_payment - name: Show the ASG Payment name debug: msg: "{{ asgs_payment.results[0].auto_scaling_group_name}}" - set_fact: asg_payment_name: "{{ asgs_payment.results[0].auto_scaling_group_name}}"
在Jenkins上运行时触发错误:
fatal: [127.0.18.34]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: list object has no element 0\n\nThe error appears to be in '/opt/software/jenkins/workspace/payment-react-ui/srv/payment-ui-110/payment-ui/roles/inspect/tasks/cps_green_deploy.yml': line 9, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: Show the ASG Payment name\n ^ here\n"}
我修改Playbook打印完整返回结果,确认results为空数组:
- name: Find the green asg with matching tags ec2_asg_info: tags: service_name: cps_wallet Environment: "{{ name_env }}" service_state: green register: asgs_payment - name: Show the ASG Payment name debug: msg: "{{ asgs_payment}}" - set_fact: asg_payment_name: "{{ asgs_payment}}"
返回结果:
"msg": { "changed": false, "failed": false, "results": [] }
已知信息:
- 目标ASG已添加对应标签(
service_name: cps_wallet、Environment: {{ name_env }}、service_state: green) - 无其他ASG使用相同标签
- 该Playbook在其他应用上运行正常
排查与解决方案
1. 验证name_env变量的实际值
AWS标签是大小写敏感的,先确认Jenkins运行时name_env的实际内容是否和ASG的Environment标签完全匹配:
- 在Playbook中添加任务打印变量:
- name: Print name_env value debug: msg: "name_env is: {{ name_env }}" - 检查输出是否和ASG标签的大小写、字符完全一致
2. 调整标签匹配参数
ec2_asg_info的tags和tags_filters参数匹配逻辑有差异,尝试用tags_filters替代tags:
- name: Find the green asg with matching tags ec2_asg_info: tags_filters: service_name: cps_wallet Environment: "{{ name_env }}" service_state: green register: asgs_payment
3. 检查AWS权限
确认Jenkins执行Playbook的AWS角色/用户拥有autoscaling:DescribeAutoScalingGroups权限:
- 在Jenkins机器上手动执行AWS CLI命令验证:
aws autoscaling describe-auto-scaling-groups --filters "Name=tag:service_name,Values=cps_wallet" "Name=tag:Environment,Values=<实际name_env值>" "Name=tag:service_state,Values=green"- 如果CLI返回空:说明权限或标签匹配存在问题
- 如果CLI能返回ASG:再聚焦排查Ansible配置问题
4. 检查Ansible版本与集合兼容性
- 确认Ansible版本(执行
ansible --version),若版本较老,升级到稳定版本 - 对于Ansible 2.10+,ec2_asg_info属于
amazon.aws集合,确保已安装:ansible-galaxy collection install amazon.aws
5. 添加空列表容错处理
即使解决了查询问题,也要避免直接访问results[0]导致的报错,添加条件判断:
- name: Show the ASG Payment name debug: msg: "{{ asgs_payment.results[0].auto_scaling_group_name}}" when: asgs_payment.results | length > 0 - set_fact: asg_payment_name: "{{ asgs_payment.results[0].auto_scaling_group_name}}" when: asgs_payment.results | length > 0
内容的提问来源于stack exchange,提问作者niitinkalburgi
相关产品推荐
相关产品推荐

