首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Fly Cli传递私钥

通过Fly Cli传递私钥
EN

Stack Overflow用户
提问于 2017-05-17 16:47:40
回答 3查看 2.3K关注 0票数 1

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

当我试图使用这个文件来scp和ssh时,我会遇到输入密码的提示。如果我尝试使用原始文件执行ssh,则根本得不到这个提示。我遗漏了什么吗?我非常希望对这一问题有一些见解。

pipeline.yml

代码语言:javascript
复制
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

代码语言:javascript
复制
---
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

代码语言:javascript
复制
#!/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

代码语言:javascript
复制
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-----
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-02 20:31:59

今天也遇到了同样的问题,我花了一点时间才弄清楚到底是怎么回事。

您将私钥指定为多行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命令使用两组替换组,它们都具有相同的用途。

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

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

  • \(KEY-----\)将标头块的最后一部分放在捕获组中。
  • \s匹配空白
  • /1\n/g将捕获组(#1)放回,然后添加一个换行符
  • 忘记删除的/g不必要的全局捕获

第二 sed组也这样做,但是占用页脚文本的空间和第一部分,将其放在新行上。

第三组对空白进行全局替换,并将其替换为换行符。这必须是一个单独的命令,所以第一个命令的处理就完成了,然后是一个3行文件/流。

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

  • 2s/只在第2行执行替换操作
  • \s\+匹配任何空格
  • 用换行符替换\n
  • 获取每个实例的/g全局匹配
票数 1
EN

Stack Overflow用户

发布于 2017-05-17 17:30:33

两件事。

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

task.yml

代码语言:javascript
复制
---
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

代码语言:javascript
复制
deploy_key_pair: |
  -----BEGIN RSA PRIVATE KEY-----
  ...
  -----END RSA PRIVATE KEY-----
票数 1
EN

Stack Overflow用户

发布于 2018-05-04 09:57:09

您还可以使用keystore集成(例如,redit集线器)和汇合。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44030654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档