在 Amazon EC2 中,在启动时克隆私有 github 存储库的最佳方法是什么?

在 Amazon EC2 中,在启动时克隆私有 github 存储库的最佳方法是什么?

我需要配置一个自动缩放的 EC2 实例组,它在启动时将克隆一个特定的分支并从私有 github 存储库提交,然后从该存储库内部执行代码。

我正在使用具有 cloud-init 启动系统的 Ubuntu 派生 AMI,因此在我看来,实现这一点的最简单方法是使用 cloud-init 用户脚本来安装 GitHub 部署密钥,使用该密钥克隆存储库,然后在克隆的存储库中启动适当的脚本。

这是我的第一次尝试(在初始化 LaunchConfiguration 之前,管理自动缩放集群的管理进程会插入部署密钥、分支和提交哈希):

#!/usr/bin/env python

# ** IMPORTS OMITTED **

DEPLOY_KEY = '''
--- RSA PRIVATE KEY GOES HERE ---
'''
REPO_URL = '[email protected]:github_user/MyRepository.git'
BRANCH = 'master'
COMMIT = '6dba9ae2cb77dc30c525ce14aeb82b072c88042b'
USER_HOMEDIR = os.environ['HOME']
WORKING_PATH = USER_HOMEDIR

try:
    os.makedirs(os.path.join(USER_HOMEDIR, '.ssh'))
except:
    pass

# Install the deploy key as the user's default identity file
keypath = os.path.join(USER_HOMEDIR, '.ssh', 'id_rsa')
try:
    with open(keypath, 'w') as keyfile:
        keyfile.write(DEPLOY_KEY)
except:
    with open(keypath, 'r') as keyfile:
        assert keyfile.read() == DEPLOY_KEY

# openSSH requires identitiy file mode to be 600
os.chmod(keypath, stat.S_IREAD)

# Disable strict host checking for github.com so we don't get the prompt
with open(os.path.join(USER_HOMEDIR, '.ssh', 'config'), 'a') as sshconfig:
    sshconfig.write("\nHost github.com\n\tStrictHostKeyChecking no\n")

# clone the get repo
os.chdir(WORKING_PATH)
subprocess.call('git clone %s --branch %s' % (REPO_URL, BRANCH), shell=True)
if COMMIT != 'HEAD':
    os.chdir(os.path.join(WORKING_PATH, 'LFAnalyze'))
    subprocess.call('git checkout ' + COMMIT, shell=True)

此脚本在登录 shell 中运行,但无法在 cloud-init 环境中运行,因为 $HOME 环境变量尚未设置(cloud-init 在运行级别 2 的 Upstart 作业中运行,可以访问这些环境变量)。

git-clone 似乎没有传入 SSH 选项的选项,例如允许我使用特定密钥文件。它只是在 ~/.ssh/ 中查找默认身份密钥。如果在执行此脚本时未定义 $HOME,我该如何告诉 git-clone 在哪里查找部署密钥?

或者,是否有某种方法可以让 cloud-init 以特定用户身份执行脚本,模拟登录 shell 环境?

或者我只是以错误的方式处理整个问题? 是否有既定的最佳实践或标准方法来实现这一点?

答案1

通常,我建议您使用 SSH 密钥和 git repo clone(具有理想配置的工作实例)创建一个工作的 EC2 实例。

然后创建该实例的 AMI,并在启动配置中在用户数据中输入您的脚本,以便每次启动实例时运行脚本(基本上更新 git 和启动命令)。

示例脚本如下(假设 /opt/src 是您的 repo 所在的位置):

#!/bin/sh
cd /opt/src
git pull
source run_cmd.sh

这样你的脚本就被包含并得到很好的维护。希望这能有所帮助。

相关内容