无法通过 SSH 从 Bitbucket 管道连接到 EC2

问题描述 投票:0回答:1

我设置了一个 Bitbucket 管道,如下所示(之前关于构建和推送 docker 映像的步骤被省略但有效):

      - step:
          name: Deploy to EC2
          script:
            - |
              ssh -i ${EC2_KEY_PEM} ${EC2_USER}@${EC2_HOST} <<'EOF'
              docker ps -q | grep -q . && docker stop $(docker ps -q)
              echo ${DOCKER_PASSWORD} | docker login --username ${DOCKER_USERNAME} --password-stdin
              docker pull ${DOCKER_REPO}/${IMAGE_NAME}:${IMAGE_VERSION}
              docker run -d --name my_container_name ${DOCKER_REPO}/${IMAGE_NAME}:${IMAGE_VERSION} 
              EOF
          services:
              - docker

其中

${EC2_KEY_PEM}
是包含原始
.pem
文件的存储库变量。

我的 Bitbucket 管道因以下错误而不断失败:


<1s
+ ssh -i ${EC2_KEY_PEM} ${EC2_USER}@${EC2_HOST} <<'EOF'
docker ps -q | grep -q . && docker stop $(docker ps -q)
echo ${DOCKER_PASSWORD} | docker login --username ${DOCKER_USERNAME} --password-stdin
docker pull ${DOCKER_REPO}/${IMAGE_NAME}:${IMAGE_VERSION}
docker run -d --name my_container_name ${DOCKER_REPO}/${IMAGE_NAME}:${IMAGE_VERSION} 
EOF
Warning: Identity file @ not accessible: No such file or directory.
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
           [-i identity_file] [-J [user@]host[:port]] [-L address]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] destination [command]

(我尝试过用

<<EOF
代替
<<'EOF'

我还尝试了以下方法来定义私有 ssh 密钥,如下所示:

            - echo ${EC2_KEY_BASE64} | base64 -d > ec2-key.pem
            - chmod 600 ec2-key.pem
            - |
              ssh -i ec2-key.pem ${EC2_USER}@${EC2_HOST} <<'EOF'

其中

${EC2_KEY_BASE64}
.pem
转换为
base64
字符串。所有情况下都出现同样的错误。

amazon-ec2 ssh bitbucket pipeline
1个回答
0
投票

问题在于

${EC2_KEY_BASE64}
变量的位置。 Bitbucket 有存储库变量和部署变量。我的
bitbucket-pipelines.yml
中没有显示的是,我将上一步标记为
deployment: Production
,假设这将滚动到下一步。

事实并非如此。换句话说,命令

echo ${EC2_KEY_BASE64} | base64 -d > ec2-key.pem
生成了一个空的
ec2-key.pem
文件,导致随后的失败。

要点:

  1. 特定
    deployment
    (例如
    Production
    )只能在一步中使用。
  2. 如果您在
    Production
    的特定步骤中将值定义为
    bitbucket-pipelines.yml
    部署变量,则它们在任何其他步骤中将不可用。
© www.soinside.com 2019 - 2024. All rights reserved.