Я создаю сценарий, который запускает экземпляр EC2 и подключается к нему. После всей настройки экземпляра я должен скопировать на него свое личное репо, а затем запустить его. Код отлично работает для публичного репо. Кроме того, если я вручную запускаю экземпляр, подключаюсь к нему и запускаю построчно, он также работает нормально. Я использую python, boto3 и paramiko.
Вот что у меня есть до сих пор:
print("Creating ssh key pair...")
stdin, stdout, stderr = client.exec_command('ssh-keygen -t rsa -b 4096 -C "[email protected]" -f ~/.ssh/id_rsa -N ""')
output = stdout.read().decode()
print(output)
print("Done")
# add ssh key to ssh-agent
print("Adding ssh key to ssh agent")
stdin, stdout, stderr = client.exec_command('eval "$(ssh-agent -s)" ; ssh-add ~/.ssh/id_rsa')
output = stdout.read().decode()
print(output)
stdin, stdout, stderr = client.exec_command('ssh-keyscan github.com >> ~/.ssh/known_hosts')
output = stdout.read().decode()
print(output)
# add ssh key to github account
print("Adding ssh key to github account...")
stdin, stdout, stderr = client.exec_command('curl -u "myusername:mytoken" -H "Content-Type: application/json" --data "{\"title\":\"EC2_Instance_Key\",\"key\":\"$(cat ~/.ssh/id_rsa.pub)\"}" https://api.github.com/user/keys -X POST')
output = stdout.read().decode()
print(output)
print("Done")
# clone the repository
print("Cloning the repository to the instance...")
stdin, stdout, stderr = client.exec_command('git clone -o "StrictHostKeyChecking=no" [email protected]:myOrganization/ec2_test.git /home/ec2-user/project')
output = stdout.read().decode()
print(output)
print("Done")
Я получаю эту ошибку:
% Всего % Получено % Xferd Средняя скорость Время Время Время Текущий Dload Upload Всего затрачено Левая скорость 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0curl: (6) Не удалось разрешить хост: AAAAB3NzaC1yc2EAAAAADAQABAAACAQDH50Rl curl: (3) непревзойденный закрыть фигурная скобка/скобка в позиции 18 URL: [email protected]}
Из вашего вопроса не понятно в чем проблема. Не работает ли скрипт для частных репозиториев? И есть ли сообщение об ошибке?
Если я запускаю команды вручную в ssh-подключении к экземпляру EC2, все работает нормально. Но со скриптом открытый ключ не добавляется в мою учетную запись github. Он не выводит никаких ошибок.
Примечание: вместо использования SSH для настройки экземпляра вам следует рассмотреть возможность передачи скрипта через данные пользователя. Он автоматически запустится при первой загрузке. См.: Выполнение команд в инстансе Linux при запуске — Amazon Elastic Compute Cloud
Решил это, используя другой подход, используя github CLI.
Установка переменной GH TOKEN на мой токен дала экземпляру права на добавление открытого ключа в мою учетную запись github.
print("Creating ssh key pair...")
stdin, stdout, stderr = client.exec_command('ssh-keygen -t rsa -b 4096 -C "[email protected]" -f /home/ec2-user/.ssh/id_rsa -N ""')
print(stdout.read().decode())
print(stderr.read().decode())
print("Done")
print("Adding ssh key to ssh agent...")
stdin, stdout, stderr = client.exec_command('eval "$(ssh-agent -s)" ; ssh-add /home/ec2-user/.ssh/id_rsa')
print(stdout.read().decode())
print(stderr.read().decode())
print("Done")
print("Adding github to known hosts...")
stdin, stdout, stderr = client.exec_command('ssh-keyscan github.com >> /home/ec2-user/.ssh/known_hosts')
print(stdout.read().decode())
print(stderr.read().decode())
print("Done")
print("Installing github cli...")
stdin, stdout, stderr = client.exec_command('sudo yum -y install wget ; wget https://github.com/cli/cli/releases/download/v2.15.0/gh_2.15.0_linux_amd64.rpm ; sudo rpm -i gh_2.15.0_linux_amd64.rpm ; gh --version')
print(stdout.read().decode())
print(stderr.read().decode())
print("Done")
print("Setting GH TOKEN...")
title = project_id + '_' + instance_id
stdin, stdout, stderr = client.exec_command('export GH_TOKEN=mytoken; echo $GH_TOKEN ; gh ssh-key add /home/ec2-user/.ssh/id_rsa.pub --title '+title)
print(stdout.read().decode())
print(stderr.read().decode())
print("Done")
print("Cloning the repository to the instance...")
stdin, stdout, stderr = client.exec_command('git clone -o "StrictHostKeyChecking=no" [email protected]:myOrganization/'+repository+'.git /home/ec2-user/project')
print(stdout.read().decode())
print(stderr.read().decode())
print("Done")
После некоторой отладки я думаю, что проблема в том, где я добавляю ключ ssh в свою учетную запись github. Но я до сих пор не могу понять, почему он отлично работает вручную при подключении по ssh, но не при запуске скрипта.