使用Ansible部署EC2实例时遭遇MetadataOptions参数未识别错误
EC2实例创建报错:MetadataOptions参数未识别的解决方案
问题根源
从错误栈和日志可以明确:
- Ansible的
ec2模块调用了旧版boto库(boto.ec2.connection)而非boto3来发起EC2 API请求 - 环境中同时存在新版本的boto3/botocore,导致旧boto库错误地向AWS API传递了
MetadataOptions这个新增参数 - 目标AWS区域的EC2 API端点不支持该参数,因此返回
UnknownParameter错误
解决办法
1. 替换为boto3驱动的ec2_instance模块
弃用旧的ec2模块,改用amazon.aws.ec2_instance模块(基于boto3,无兼容问题),修改创建实例的任务代码:
- name: creating Bastion Host amazon.aws.ec2_instance: name: "Bastion_host" key_name: vprofile-key region: "{{region}}" instance_type: t2.micro image_id: "{{bastion_ami}}" security_group: "{{BastionSG_out.group_id}}" vpc_subnet_id: "{{pubsub1id}}" wait: yes wait_timeout: 300 tags: Project: Vprofile Owner: DevOps Team exact_count: 1 count_tag: Name: "Bastion_host"
2. 升级AWS集合与Ansible版本
Ansible 2.10的ec2模块存在兼容性问题,升级到新版本集合和Ansible:
# 升级amazon.aws官方集合 ansible-galaxy collection install amazon.aws --upgrade # 升级Ansible到稳定版本 sudo apt update && sudo apt install ansible --upgrade
3. 卸载旧版boto库
如果不需要旧boto库,直接卸载它,强制Ansible使用boto3:
sudo pip3 uninstall boto -y
4. 临时指定兼容的EC2 API版本(应急方案)
如果无法升级或卸载,可通过环境变量指定旧版EC2 API,避免触发该参数:
- name: creating Bastion Host ec2: key_name: vprofile-key region: "{{region}}" instance_type: t2.micro image: "{{bastion_ami}}" group_id: "{{BastionSG_out.group_id}}" vpc_subnet_id: "{{pubsub1id}}" wait: yes wait_timeout: 300 instance_tags: Name: "Bastion_host" Project: Vprofile Owner: DevOps Team exact_count: 1 count_tag: Name environment: EC2_API_VERSION: "2016-11-15"
验证
修改后执行playbook确认修复:
ansible-playbook bastion-instance.yml -vvv
内容的提问来源于stack exchange,提问作者Ohad Elias
相关产品推荐
相关产品推荐

