CodeBuild构建后获取EC2实例ID及IP/主机名用于Ansible部署的方法
方案1:在创建EC2的Ansible Playbook中直接获取IP
你用Ansible部署EC2的时候,不管调用的是AWS EC2原生模块还是CloudFormation模板,都可以直接将实例返回的属性注册为变量,不需要额外二次查询。
- 若使用
amazon.aws.ec2_instance模块直接创建实例:
给创建任务加register字段存储返回结果,直接提取对应IP属性即可,示例代码如下:
你可以根据需求替换提取- name: 部署EC2实例 amazon.aws.ec2_instance: name: "your-app-server" instance_type: t3.micro # 其余实例配置参数 register: ec2_deploy_result - name: 提取实例公网IP作为变量 set_fact: target_ec2_ip: "{{ ec2_deploy_result.instances[0].public_ip_address }}"private_ip_address(私网IP)、public_dns_name(公网主机名)字段。 - 若调用CloudFormation模板创建实例:
先在CloudFormation模板的Outputs段配置输出实例IP/主机名,Ansible调用CloudFormation模块时注册返回值,直接提取输出的参数即可。
方案2:通过已有的实例ID调用AWS CLI查询IP
如果你已经能拿到部署完成的EC2实例ID,直接在CodeBuild构建步骤中调用AWS CLI查询属性即可,前提是你给CodeBuild的服务角色配置了ec2:DescribeInstances权限。
- 查询公网IP命令:
aws ec2 describe-instances --instance-ids <你的实例ID> --query "Reservations[0].Instances[0].PublicIpAddress" --output text - 查询私网IP命令:
aws ec2 describe-instances --instance-ids <你的实例ID> --query "Reservations[0].Instances[0].PrivateIpAddress" --output text - 查询公网主机名命令:
aws ec2 describe-instances --instance-ids <你的实例ID> --query "Reservations[0].Instances[0].PublicDnsName" --output text
你可以将命令返回的结果存入环境变量或者Ansible变量,后续直接传给配置推送的Playbook使用。
方案3:通过实例标签过滤查询IP
如果你给创建的EC2配置了唯一的业务标签组合(比如App=your-app,Env=prod可以唯一锁定目标实例),也可以直接通过标签过滤查询,不需要提前存储实例ID:aws ec2 describe-instances --filters "Name=tag:App,Values=your-app" "Name=tag:Env,Values=prod" "Name=instance-state-name,Values=running" --query "Reservations[*].Instances[*].PublicIpAddress" --output text
注意:如果你的CodeBuild和目标EC2在同一个VPC内,建议优先使用私网IP推送配置,不需要给EC2开放公网访问权限,安全性更高。
内容的提问来源于stack exchange,提问作者SKMo
相关产品推荐
相关产品推荐

