Bitbucket流水线Packer构建AMI失败:SSH超时问题求助
问题描述
- 目标:通过Docker镜像创建包含Datadog Agent的AMI,基于Bitbucket流水线+Ansible+Packer实现
- 重现步骤:从AWS SSM参数存储获取访问密钥和秘密密钥,执行Packer构建流程
- 错误情况:流水线执行失败,提示
amazon-ebs.this: Timeout waiting for SSH,构建运行7分8秒后超时
解决方案
1. SSH密钥在Bitbucket流水线中的存储方式
- 存入Bitbucket安全变量:
进入仓库设置 → 流水线 → 变量,创建「Secret」类型的变量(例如命名为SSH_PRIVATE_KEY),将私钥完整内容粘贴进去,避免密钥明文暴露在日志中。 - 在Docker步骤中注入密钥:
在bitbucket-pipelines.yml里,将变量写入容器内的SSH密钥文件并设置正确权限:steps: - step: name: 构建AMI image: 你的packer-ansible镜像:latest script: - echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa - # 执行Packer构建命令
2. Packer配置中关联SSH密钥
在Packer的amazon-ebs builder配置里,指定私钥路径或直接引用变量:
source "amazon-ebs" "this" { ami_name = "datadog-agent-{{timestamp}}" instance_type = "t2.micro" ssh_username = "ec2-user" # 根据基础镜像调整,Ubuntu用ubuntu ssh_private_key_file = "~/.ssh/id_rsa" # 也可直接引用变量:ssh_private_key = "${var.ssh_private_key}" }
3. 关键排查点
- 安全组配置:确保EC2临时实例的安全组允许Bitbucket流水线出口IP访问22端口(可从流水线日志获取出口IP,或参考Bitbucket官方IP范围)。
- 基础镜像验证:确认使用的基础镜像支持密钥登录,且
ssh_username配置正确(如Amazon Linux 2用ec2-user,Ubuntu用ubuntu)。 - 替代方案:若不想开放SSH端口,可在Packer中配置
ssh_interface = "session_manager",通过AWS SSM会话管理器连接实例,无需手动管理SSH密钥和端口。
内容的提问来源于stack exchange,提问作者Venkatesh Dhanapalraj
相关产品推荐
相关产品推荐

