Ansible ec2_instance模块TagSpecifications参数类型错误求助
问题描述
使用Ansible Core 2.13.4、amazon.aws 3.4.0模块编写Playbook部署AWS EC2实例时,触发TagSpecifications参数类型错误——值为None,但合法类型应为list/tuple。未手动配置该参数,改用已废弃的ec2模块(替换ec2_instance为ec2、image_id为image)可正常运行但会收到废弃警告。
Playbook代码
- name: provisioning Ec2 instance hosts: localhost connection: local tasks: - name: launching ec2_instance: key_name: stackkeypair image_id: ami-01216e7612243e0ef instance_type: t2.micro aws_region: ap-south-1 wait: yes count: 1 aws_access_key: <Key given> aws_secret_key: < Key given>
完整报错堆栈
The full traceback is: Traceback (most recent call last): File "/tmp/ansible_ec2_instance_payload_kihlndx5/ansible_ec2_instance_payload.zip/ansible_collections/amazon/aws/plugins/modules/ec2_instance.py", line 1834, in ensure_present File "/tmp/ansible_ec2_instance_payload_kihlndx5/ansible_ec2_instance_payload.zip/ansible_collections/amazon/aws/plugins/modules/ec2_instance.py", line 1883, in run_instances File "/tmp/ansible_ec2_instance_payload_kihlndx5/ansible_ec2_instance_payload.zip/ansible_collections/amazon/aws/plugins/module_utils/core.py", line 336, in deciding_wrapper return retrying_wrapper(*args, **kwargs) File "/tmp/ansible_ec2_instance_payload_kihlndx5/ansible_ec2_instance_payload.zip/ansible_collections/amazon/aws/plugins/module_utils/cloud.py", line 118, in _retry_wrapper return _retry_func( File "/tmp/ansible_ec2_instance_payload_kihlndx5/ansible_ec2_instance_payload.zip/ansible_collections/amazon/aws/plugins/module_utils/cloud.py", line 68, in _retry_func return func() File "/home/ubuntu/.local/lib/python3.10/site-packages/botocore/client.py", line 514, in _api_call return self._make_api_call(operation_name, kwargs) File "/home/ubuntu/.local/lib/python3.10/site-packages/botocore/client.py", line 901, in _make_api_call request_dict = self._convert_to_request_dict( File "/home/ubuntu/.local/lib/python3.10/site-packages/botocore/client.py", line 962, in _convert_to_request_dict request_dict = self._serializer.serialize_to_request( File "/home/ubuntu/.local/lib/python3.10/site-packages/botocore/validate.py", line 381, in serialize_to_request raise ParamValidationError(report=report.generate_report()) botocore.exceptions.ParamValidationError: Parameter validation failed: Invalid type for parameter TagSpecifications, value: None, type: <class 'NoneType'>, valid types: <class 'list'>, <class 'tuple'> fatal: [local]: FAILED! => { "boto3_version": "1.24.89", "botocore_version": "1.27.89", "changed": false, "invocation": { "module_args": { "availability_zone": null, "aws_access_key": "<key>", "aws_ca_bundle": null, "aws_config": null, "aws_region": "ap-south-1", "aws_secret_key": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER", "count": 1, "cpu_credit_specification": null, "cpu_options": null, "debug_botocore_endpoint_logs": false, "detailed_monitoring": null, "ebs_optimized": null, "ec2_url": null, "exact_count": null, "filters": { "image-id": [ "ami-01216e7612243e0ef" ], "instance-state-name": [ "pending", "running", "stopping", "stopped" ], "subnet-id": "subnet-0d919639655cf3bd0" }, "image": null, "image_id": "ami-01216e7612243e0ef", "instance_ids": [], "instance_initiated_shutdown_behavior": null, "instance_role": null, "instance_type": "t2.micro", "key_name": "stackkeypair", "launch_template": null, "metadata_options": null, "name": null, "network": null, "placement_group": null, "profile": null, "purge_tags": false, "region": "ap-south-1", "security_group": null, "security_groups": [], "security_token": null, "state": "present", "tags": null, "tenancy": null, "termination_protection": null, "tower_callback": null, "user_data": null, "validate_certs": true, "volumes": null, "vpc_subnet_id": null, "wait": true, "wait_timeout": 600 } }, "msg": "Failed to create new EC2 instance: Parameter validation failed:\nInvalid type for parameter TagSpecifications, value: None, type: <class 'NoneType'>, valid types: <class 'list'>, <class 'tuple'>" }
使用版本
- ansible [core 2.13.4]
- python version = 3.10.6 (main, Aug 10 2022, 11:40:04) [GCC 11.3.0]
- jinja version = 3.0.3
- boto3_version: "1.24.89"
- botocore_version: "1.27.89"
- amazon.aws 3.4.0
问题原因
这是amazon.aws 3.4.0模块与较高版本botocore(1.27.89)之间的兼容性问题。当未配置tags参数时,模块会将TagSpecifications设为None,但新版botocore要求该参数必须是list/tuple类型,不接受None值。而旧版ec2模块内部处理逻辑不同,会自动处理空标签的情况,因此能正常运行。
解决方法
方法1:显式添加空标签列表
在ec2_instance模块中添加tags: []参数,强制将TagSpecifications设为空列表,符合botocore的类型要求:
- name: provisioning Ec2 instance hosts: localhost connection: local tasks: - name: launching ec2_instance: key_name: stackkeypair image_id: ami-01216e7612243e0ef instance_type: t2.micro aws_region: ap-south-1 wait: yes count: 1 tags: [] # 显式设置空标签列表 aws_access_key: <Key given> aws_secret_key: < Key given>
方法2:升级amazon.aws模块到兼容版本
amazon.aws 4.0.0及以上版本已修复该兼容性问题,执行以下命令升级模块:
ansible-galaxy collection install amazon.aws --upgrade
方法3:降级botocore版本
将botocore降级到1.26.x版本(与amazon.aws 3.4.0兼容),执行:
pip install botocore==1.26.89
内容的提问来源于stack exchange,提问作者Sai Kumar
相关产品推荐
相关产品推荐

