通过 Fly Cli 传递私钥
Passing a private key through Fly Cli
我工作的公司最近开始使用 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,我根本不会收到此提示。有什么我想念的吗?我将不胜感激对这个问题的一些见解。
pipeline.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}}
task.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
task.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
credentials.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-----
两件事。
一:您需要声明您的任务正在使用这些特定的环境变量
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-----
今天遇到了同样的问题,我花了一些时间才弄清楚是怎么回事。
您将私钥指定为多行 yaml 属性,但是当它被输出到文件时,它会删除换行符并用 spaces 替换它们,所以您的密钥是一个很大的单行文件。
我必须使用 sed 将 space 替换为换行符才能正常工作
echo $DEPLOY_KEY_PAIR | sed -e 's/\(KEY-----\)\s/\n/g; s/\s\(-----END\)/\n/g' | sed -e '2s/\s\+/\n/g' > DeployKeyPair.pem
第一个 sed 命令使用两组替换组,目的相同
第一个 组 - 抓取 header 文本并将其分成新行
s/\(KEY-----\)\s/\n/g
\(KEY-----\)
将 header 块的最后一部分放入捕获组
\s
匹配白色space
/1\n/g
将捕获组 (#1) 放回去,然后添加换行符
/g
我忘记删除的不必要的全局捕获
第二个 sed 组做同样的事情,但抓取 space 和页脚文本的第一部分以将其放在新行上
第三组对whitespace进行全局替换,并用换行符替换。这必须是一个单独的命令,因此第一个命令的处理已完成,然后是 3 行 file/stream
'2s/\s\+/\n/g'
2s/
仅在第 2 行执行替换
\s\+
匹配任何白色space
\n
换行
/g
全局匹配以抓取每个实例
您还可以使用密钥库集成,例如credhub,带大厅。
见https://docs.pivotal.io/p-concourse/credential-management.html
我工作的公司最近开始使用 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,我根本不会收到此提示。有什么我想念的吗?我将不胜感激对这个问题的一些见解。
pipeline.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}}
task.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
task.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
credentials.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-----
两件事。
一:您需要声明您的任务正在使用这些特定的环境变量
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-----
今天遇到了同样的问题,我花了一些时间才弄清楚是怎么回事。
您将私钥指定为多行 yaml 属性,但是当它被输出到文件时,它会删除换行符并用 spaces 替换它们,所以您的密钥是一个很大的单行文件。
我必须使用 sed 将 space 替换为换行符才能正常工作
echo $DEPLOY_KEY_PAIR | sed -e 's/\(KEY-----\)\s/\n/g; s/\s\(-----END\)/\n/g' | sed -e '2s/\s\+/\n/g' > DeployKeyPair.pem
第一个 sed 命令使用两组替换组,目的相同
第一个 组 - 抓取 header 文本并将其分成新行
s/\(KEY-----\)\s/\n/g
\(KEY-----\)
将 header 块的最后一部分放入捕获组\s
匹配白色space/1\n/g
将捕获组 (#1) 放回去,然后添加换行符/g
我忘记删除的不必要的全局捕获
第二个 sed 组做同样的事情,但抓取 space 和页脚文本的第一部分以将其放在新行上
第三组对whitespace进行全局替换,并用换行符替换。这必须是一个单独的命令,因此第一个命令的处理已完成,然后是 3 行 file/stream
'2s/\s\+/\n/g'
2s/
仅在第 2 行执行替换\s\+
匹配任何白色space\n
换行/g
全局匹配以抓取每个实例
您还可以使用密钥库集成,例如credhub,带大厅。
见https://docs.pivotal.io/p-concourse/credential-management.html