В Amazon EC2, как лучше всего клонировать частный репозиторий github при загрузке?
Мне нужно настроить автомасштабируемую группу экземпляров EC2, которые при загрузке будут клонировать определенную ветвь и фиксироваться из частного репозитория github, а затем выполнять код из этого репозитория.
Я использую производный от Ubuntu AMI, на котором установлена система запуска cloud-init, поэтому мне кажется, что самый простой способ реализовать это - пользовательский скрипт cloud-init, который устанавливает ключ развертывания GitHub и использует его для клонирования. хранилище, а затем запускает соответствующие сценарии в клонированном хранилище.
Вот моя первая попытка (ключ развертывания, ветвь и хэш-фиксация вставляются процессом управления, который управляет кластером автомасштабирования перед инициализацией LaunchConfiguration):
#!/usr/bin/env python
# ** IMPORTS OMITTED **
DEPLOY_KEY = '''
--- RSA PRIVATE KEY GOES HERE ---
'''
REPO_URL = 'git@github.com: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)
Этот сценарий работает из оболочки входа в систему, но не запускается в среде cloud-init, поскольку переменная среды $HOME еще не установлена (cloud-init запускается в задании Upstart на уровне выполнения 2 с доступом к этим переменным среды).
У git-clone, похоже, нет опции для передачи параметров SSH, которые позволили бы мне использовать определенный файл ключа. Он просто ищет в ~/.ssh/ ключ идентификации по умолчанию. Если $HOME не определен во время выполнения этого скрипта, как я могу указать git-clone, где искать ключ развертывания?
В качестве альтернативы, есть ли способ заставить cloud-init выполнять скрипт от имени конкретного пользователя, эмулируя среду оболочки входа в систему?
Или я просто подхожу ко всей этой проблеме неправильно? Существует ли установленный передовой опыт или стандартный способ сделать это?
1 ответ
Обычно я бы порекомендовал вам создать рабочий экземпляр EC2 с ключом SSH и клоном git repo (рабочий экземпляр с идеальной конфигурацией).
Затем создайте AMI для этого экземпляра и в конфигурации запуска введите свои сценарии в userdata, чтобы эти сценарии запускались каждый раз (в основном команды update git и launch) при запуске экземпляра.
Пример сценария будет (при условии, что /opt/src находится там, где находится ваше хранилище):
#!/bin/sh
cd /opt/src
git pull
source run_cmd.sh
Таким образом, ваш сценарий содержится и поддерживается. Надеюсь, это поможет.