我需要configuration一个自动缩放的EC2实例组,在启动时克隆一个特定的分支并从一个私有的github仓库中提交,然后从该仓库中执行代码。
我使用的是一个具有cloud-init启动系统的Ubuntu衍生的AMI,所以在我看来,实现这个目的最简单的方法是安装GitHub部署密钥的cloud-init用户脚本,使用它来克隆存储库,然后在克隆的存储库中启动适当的脚本。
这是我的第一次尝试(部署密钥,分支和提交哈希由初始化LaunchConfiguration之前pipe理自动缩放集群的pipe理进程插入):
#!/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)
这个脚本是从loginshell运行的,但是它没能在cloud-init的环境下运行,因为$ HOME环境variables还没有被设置(cloud-init在运行级别2的Upstart作业中运行,可以访问这些环境variables )。
git-clone似乎没有选项来传递SSH选项,例如让我使用特定的密钥文件。 它只是在〜/ .ssh /中查找默认的身份密钥。 如果执行此脚本时未定义$ HOME,如何告诉git-clone在何处查找部署密钥?
或者,有什么方法可以使cloud-init像特定用户一样执行脚本,模拟loginshell环境?
或者我只是用错误的方式来解决整个问题? 有没有一个既定的最佳做法或标准的方式来做到这一点?
通常,我会build议你用SSH密钥和git repo clone(一个工作实例,用你理想的configuration)创build一个工作的EC2实例。
然后创build该实例的AMI,并在启动configuration中在用户数据中input脚本,以便在启动实例时每次运行脚本(基本上都会更新git和启动命令)。
示例脚本将是(假设/ opt / src是您的回购的地方):
#!/bin/sh cd /opt/src git pull source run_cmd.sh
这样你的脚本就被包含并保持良好的状态。 希望有所帮助。