Eu preciso configurar um grupo de autoescala de instâncias do EC2 que, na inicialização, irá clonar uma ramificação em particular e confirmar a partir de um repositório github privado e, em seguida, executar o código dentro desse repositório.
Estou usando uma AMI derivada do Ubuntu que tem o sistema de inicialização cloud-init, portanto, a maneira mais simples de implementar isso seria um script de usuário do cloud-init que instala uma chave de implantação do GitHub, para clonar o repositório e, em seguida, inicia os scripts apropriados dentro do repositório clonado.
Aqui está minha primeira tentativa (a chave de implantação, a ramificação e o hash de confirmação são inseridos por um processo de gerenciamento que gerencia o cluster de escala automática antes de inicializar o 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)
Esse script funciona a partir de um shell de login, mas não é executado no ambiente do cloud-init, porque a variável de ambiente $ HOME ainda não está definida (o cloud-init é executado em um job Upstart no runlevel 2, com acesso a estas variáveis de ambiente ).
git-clone não parece ter uma opção para passar opções de SSH, como me permitiria usar um determinado arquivo de chave. Apenas olha em ~ / .ssh / para a chave de identidade padrão. Se $ HOME não estiver definido quando este script estiver sendo executado, como eu posso dizer ao git-clone onde procurar pela Chave de Implementação?
Alternativamente, existe alguma maneira de fazer o cloud-init executar um script como um usuário em particular, emulando um ambiente de shell de login?
Ou eu estou apenas abordando todo esse problema da maneira errada? Existe uma prática recomendada ou uma maneira padrão de fazer isso?