Ansible amazon.aws.ec2模块boto未读取~/.aws/config无法跨账户角色扮演
解决方案
旧版本
boto(即boto2,旧版amazon.aws.ec2模块依赖的SDK)本身不支持读取~/.aws/config中的role_arn、credential_source这类自动角色扮演配置,这类配置是AWS CLI和boto3才支持的特性,因此boto2只会直接拉取EC2实例元数据中的第一账号凭证,导致实例创建在第一账号下。
方案1:Playbook内先调用STS获取跨账号临时凭证,再传入EC2模块(最稳妥,无需调整依赖)
先使用STS角色扮演模块获取第二账号的临时访问凭证,再将凭证参数显式传给EC2创建模块,示例如下:- name: 获取第二账号角色临时凭证 community.aws.aws_sts_assume_role: role_arn: "arn:aws:iam::123:role/assume_role" role_session_name: "cross_account_ec2_create" register: assumed_creds - name: 在第二账号创建EC2实例 amazon.aws.ec2: aws_access_key: "{{ assumed_creds.sts_creds.access_key }}" aws_secret_key: "{{ assumed_creds.sts_creds.secret_key }}" security_token: "{{ assumed_creds.sts_creds.session_token }}" # 以下补充你原本的EC2配置参数 instance_type: t2.micro image: ami-xxxxxx key_name: your_key_pair region: cn-northwest-1注意需要提前确保:第一账号EC2绑定的IAM角色具备
sts:AssumeRole权限,且第二账号的assume_role角色的信任策略允许第一账号的EC2角色扮演。方案2:通过环境变量注入临时凭证(无需修改Playbook内容)
运行Playbook前先调用AWS CLI获取跨账号凭证,导出为boto2支持的凭证环境变量后再执行Playbook,示例命令如下:# 安装依赖jq(若未安装) yum install -y jq # 调用STS获取临时凭证 CREDS=$(aws sts assume-role --role-arn arn:aws:iam::123:role/assume_role --role-session-name ec2_create_session) # 导出凭证环境变量 export AWS_ACCESS_KEY_ID=$(echo $CREDS | jq -r '.Credentials.AccessKeyId') export AWS_SECRET_ACCESS_KEY=$(echo $CREDS | jq -r '.Credentials.SecretAccessKey') export AWS_SESSION_TOKEN=$(echo $CREDS | jq -r '.Credentials.SessionToken') # 执行Ansible Playbook ansible-playbook your_playbook.yml方案3:替换为新版EC2模块(长期适配方案)
旧版amazon.aws.ec2模块已被废弃,替换为新版amazon.aws.ec2_instance模块即可,该模块基于boto3开发,原生支持~/.aws/config中的自动角色扮演配置,仅需将你现有Playbook中的EC2参数适配新版模块即可,大部分参数和旧版兼容,改造成本很低。
内容的提问来源于stack exchange,提问作者Ehack2
相关产品推荐
相关产品推荐

