Мне нужно настроить группу автомасштабирования экземпляров EC2, которая при загрузке будет клонировать определенную ветку и фиксировать из частного репозитория github, а затем выполнять код из этого репозитория.
Я использую AMI на основе Ubuntu, на котором есть система запуска 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 выполнять сценарий от имени конкретного пользователя, имитируя среду оболочки входа?
Или я просто неправильно подхожу ко всей этой проблеме? Есть ли устоявшаяся передовая практика или стандартный способ сделать это?
Обычно я бы рекомендовал вам создать рабочий экземпляр EC2 с ключом SSH и git repo clone (рабочий экземпляр с вашей идеальной конфигурацией).
Затем создайте AMI этого экземпляра и в конфигурации запуска введите свои сценарии в пользовательские данные, чтобы сценарии запускались каждый раз (в основном обновите git и команду запуска) при запуске экземпляра.
Пример сценария будет (при условии, что / opt / src находится там, где находится ваше репо):
#!/bin/sh
cd /opt/src
git pull
source run_cmd.sh
Таким образом, ваш сценарий содержится и поддерживается в хорошем состоянии. Надеюсь, это поможет.