1

我工作的公司最近开始使用 Concourse CI 来满足我们所有的 CI 需求。目前,我的一项工作包括一个带有脚本的任务,该脚本将 scp 和 ssh 放入我们的 aws ec2 实例并配置这些服务器。然而,我遇到的问题是让私钥通过 ssh 进入这些实例。这里讨论的一种方法(https://concourse-ci.org/fly-set-pipeline.html)是通过变量传递密钥。在我的脚本中,我使用传入的变量并将其回显到一个新的 .pem 文件中,并将权限设置为 600。当我只回显该变量并稍后 cat 新的 .pem 文件时,它们看起来与原始文件完全相同.pem 文件。我试图从中进行 ssh 的容器是标准的 ubuntu docker 映像。

当我尝试使用此文件进行 scp 和 ssh 时,我遇到了有关输入密码的提示。如果我尝试使用原始文件进行 ssh,则根本不会收到此提示。有什么我想念的吗?我将非常感谢对此问题的一些见解。

管道.yml

jobs:
- name: edge-priceconfig-deploy
  plan:
  - aggregate:
    - get: ci-git
    - get: pricing-config
  trigger: true
  - task: full-price-deploy
    file: ci-git/ci/edge/edge-price-config-task.yml
    params:
      USER_AND_SERVER: {{edge_user_and_server}}
      DEPLOY_KEY_PAIR: {{deploy_key_pair}}

任务.yml

---
platform: linux

image_resource:  
  type: docker-image
  source: {repository: ubuntu}

inputs:
- name: ci-git
- name: pricing-config

run:
  path: ./ci-git/ci/edge/edge-priceconfig-deploy.sh

任务.sh

#!/bin/bash
touch DeployKeyPair.pem

echo $DEPLOY_KEY_PAIR
echo $DEPLOY_KEY_PAIR > DeployKeyPair.pem
cat DeployKeyPair.pem

apt-get update && apt-get -y install sudo
sudo apt-get -y install openssh-client
sudo chmod 400 ci-git/key/DeployKeyPair.pem
sudo chmod 600 DeployKeyPair.pem

mkdir company-price-config-edge
mv pricing-config/fsconfig/conf/com.company.api.v1.pricing/*.xlsx company-price-config-edge/

commandstr="sudo rm -f /etc/company/edge/fsconfig/*xlsx; \
        ls -l /etc/company/edge/fsconfig; \
        sudo mv /home/ec2-user/company-price-config-edge/*xlsx /etc/company/edge/fsconfig/; \
        sudo rm -rf /home/ec2-user/company-price-config-edge;"


scp_link="$USER_AND_SERVER:/home/ec2-user/"
scp_link="$(echo $scp_link | tr -d ' ')"
echo $scp_link

sudo echo -ne '\n' | scp -r -oStrictHostKeyChecking=no -i DeployKeyPair.pem company-price-config-edge $scp_link
sudo ssh -oStrictHostKeyChecking=no -i DeployKeyPair.pem $USER_AND_SERVER $commandstr

凭证.yml

username: |
  username

password: |
  password

access_token: |
  token

ci_scripts_github: |
  ci-script-link

edge_user_and_server: |
  server.com

staging_user_and_server: |
  staging

training_user_and_server: |
  training

production_user_and_server: |
  production

deploy_key_pair:
  -----BEGIN RSA PRIVATE KEY-----
  ...
  -----END RSA PRIVATE KEY-----
4

3 回答 3

1

两件事情。

一:您需要声明您的任务正在使用这些特定的环境变量

task.yml

---
platform: linux

image_resource:  
  type: docker-image
  source: {repository: ubuntu}

inputs:
- name: ci-git
- name: pricing-config

params:
  USER_AND_SERVER: 
  DEPLOY_KEY_PAIR:

run:
  path: ./ci-git/ci/edge/edge-priceconfig-deploy.sh

二:我认为您需要在|您的 credentials.yml 文件中添加一个。

credentials.yml

deploy_key_pair: |
  -----BEGIN RSA PRIVATE KEY-----
  ...
  -----END RSA PRIVATE KEY-----
于 2017-05-17T17:30:33.807 回答
1

今天遇到了同样的问题,花了我一点时间弄清楚发生了什么。

您将私钥指定为多行 yaml 属性,但是当它被回显到文件时,它会去除换行符并用空格替换它们,因此您的密钥是一个大的单行文件。

我必须使用 sed 用换行符替换空格才能让它工作

echo $DEPLOY_KEY_PAIR | sed -e 's/\(KEY-----\)\s/\1\n/g; s/\s\(-----END\)/\n\1/g' | sed -e '2s/\s\+/\n/g' > DeployKeyPair.pem

第一个 sed 命令使用两组替换组,目的相同

第一组 - 抓取标题文本并将其拆分为新行

s/\(KEY-----\)\s/\1\n/g

  • \(KEY-----\)将标题块的最后一部分放入捕获组
  • \s匹配空格
  • /1\n/g将捕获组 (#1) 放回原处,然后添加换行符
  • /g我忘记删除的不必要的全局捕获

第二个sed 组做同样的事情,但抓住页脚文本的空间和第一部分,把它放在一个新的行上

第三组对空格进行全局替换并用换行符替换它。这必须是一个单独的命令,因此第一个命令的处理完成,然后是一个 3 行文件/流

'2s/\s\+/\n/g'

  • 2s/仅在第 2 行执行替换
  • \s\+匹配任何空格
  • \n用换行符替换
  • /g全局匹配以获取每个实例
于 2017-06-02T20:31:59.970 回答
0

您还可以将密钥库集成(例如 credhub)与 concourse 一起使用。

https://docs.pivotal.io/p-concourse/credential-management.html

于 2018-05-04T09:57:09.940 回答