在GitLab CI/CD中如何将Terraform输出的EC2公网IP传递给Ansible阶段
GitLab CI中Terraform传递EC2公网IP到Ansible阶段的方法
可以将公网IP导出为环境变量供后续阶段调用,下面是可直接落地的实现步骤,推荐两种成熟方案:
方案1:通过dotenv artifacts传递环境变量(最符合环境变量调用需求)
- 第一步:配置Terraform输出公网IP
在你的Terraform配置文件中添加output块:
output "ec2_public_ip" { value = aws_instance.your_ec2_instance.public_ip # 非敏感场景可省略下方sensitive配置 sensitive = false }
- 第二步:在Terraform CI阶段导出环境变量到dotenv文件
编辑.gitlab-ci.yml的Terraform阶段配置:
stages: - terraform_deploy - ansible_config terraform_deploy: stage: terraform_deploy image: hashicorp/terraform:latest script: - terraform init - terraform plan - terraform apply -auto-approve # 导出公网IP到dotenv文件 - echo "EC2_PUBLIC_IP=$(terraform output -raw ec2_public_ip)" >> build.env artifacts: reports: # 声明dotenv报告,后续阶段自动加载文件内的环境变量 dotenv: build.env paths: - build.env
- 第三步:Ansible阶段直接调用环境变量
ansible_config: stage: ansible_config image: ansible/ansible:latest script: # 临时inventory写法,末尾逗号不能省略 - ansible-playbook -i "$EC2_PUBLIC_IP," your_playbook.yml # 也可以动态生成inventory再调用: # - echo "$EC2_PUBLIC_IP ansible_user=ec2-user ansible_ssh_private_key_file=./private_key.pem" > inventory.ini # - ansible-playbook -i inventory.ini your_playbook.yml needs: - terraform_deploy
方案2:直接生成Ansible inventory文件作为artifacts传递
如果不需要单独使用环境变量,直接生成inventory更省事,无需配置dotenv:
- 在terraform_deploy阶段的script最后添加:
echo "[ec2_hosts] $(terraform output -raw ec2_public_ip) ansible_user=ec2-user ansible_ssh_private_key_file=./private_key.pem" > inventory.ini
- 然后在artifacts的paths下添加
- inventory.ini,后续Ansible阶段直接拉取该文件使用即可。
注意事项
- 需提前把EC2的SSH私钥存储到GitLab CI/CD变量中,禁止敏感信息硬编码到配置文件
- 确保EC2实例的安全组开放了22端口的入站规则,允许GitLab Runner的出口IP访问
- 若Terraform输出标记了sensitive,
terraform output需要加-raw参数才能正常获取明文值
内容的提问来源于stack exchange,提问作者Josh Edgar
相关产品推荐
相关产品推荐

