Клонировать частный репозиторий github в запущенный экземпляр EC2

Я создаю сценарий, который запускает экземпляр 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 в свою учетную запись github. Но я до сих пор не могу понять, почему он отлично работает вручную при подключении по ssh, но не при запуске скрипта.

Higor Nunes 23.01.2023 10:06

Из вашего вопроса не понятно в чем проблема. Не работает ли скрипт для частных репозиториев? И есть ли сообщение об ошибке?

chamal 23.01.2023 10:13

Если я запускаю команды вручную в ssh-подключении к экземпляру EC2, все работает нормально. Но со скриптом открытый ключ не добавляется в мою учетную запись github. Он не выводит никаких ошибок.

Higor Nunes 23.01.2023 10:19

Примечание: вместо использования SSH для настройки экземпляра вам следует рассмотреть возможность передачи скрипта через данные пользователя. Он автоматически запустится при первой загрузке. См.: Выполнение команд в инстансе Linux при запуске — Amazon Elastic Compute Cloud

John Rotenstein 23.01.2023 23:55
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решил это, используя другой подход, используя 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")

Другие вопросы по теме