2015-10-24 2 views
0

Я пытаюсь создать экземпляр aws с помощью jclouds 1.9.0, а затем запустить скрипт на нем (через ssh). Я следую примеру найти here, но я получаю ошибки аутентификации при попытке подключения клиента (java-программы) к экземпляру. Консоль AWS показывает, что экземпляр запущен и запущен.Установка учетных данных пользователя в aws-экземпляре с использованием jclouds

Пример пытается создать LoginCrendentials объект

String user = System.getProperty("user.name"); 
String privateKey = Files.toString(new File(System.getProperty("user.home") + "/.ssh/id_rsa"), UTF_8); 
return LoginCredentials.builder().user(user).privateKey(privateKey).build(); 

который последний используется с SSH клиента

responses = compute.runScriptOnNodesMatching(
       inGroup(groupName),    // predicate used to select nodes 
       exec(command),     // what you actually intend to run 
       overrideLoginCredentials(login) // use my local user & ssh key 
         .runAsRoot(false)  // don't attempt to run as root (sudo) 
         .wrapInInitScript(false)); 

Некоторые данные для входа впрыскивают к экземпляру с помощью следующих команд

Statement bootInstructions = AdminAccess.standard(); 
templateBuilder.options(runScript(bootInstructions)); 

Поскольку я нахожусь на Windows-машине, создание LoginCrendent МОГВ «терпит неудачу» и, таким образом, я изменить свой код на

String user = "ec2-user"; 
String privateKey = "-----BEGIN RSA PRIVATE KEY-----.....-----END RSA PRIVATE KEY-----"; 
return LoginCredentials.builder().user(user).privateKey(privateKey).build(); 

Я также определить полномочия при построении шаблона, как описано в руководстве "EC2: In Depth", но не повезло.

Альтернатива заключается в том, чтобы создать экземпляр и ввести пару ключей следующим образом, но это означает, что мне нужно, чтобы ключ ssh хранился в моей AWS-консоли, чего в настоящее время нет, а также нарушает функциональность запуска скрипта (через ssh), так как я не могу сделать вывод NodeMetadata с объекта RunningInstance.

RunInstancesOptions options = RunInstancesOptions.Builder.asType("t2.micro").withKeyName(keypair).withSecurityGroup(securityGroup).withUserData(script.getBytes()); 

Любые предложения?

Примечание: Хотя я в настоящее время тестирую это на aws, я хочу, чтобы код был отделен от поставщика, насколько это возможно.

Update 26/10/2015

на основе @Ignasi Barrera answer, я изменил свою реализацию, добавив .init(new MyAdminAccessConfiguration()) при создании bootInstructions

Statement bootInstructions = AdminAccess.standard().init(new MyAdminAccessConfiguration()); 
templateBuilder.options(runScript(bootInstructions)); 

Где MyAdminAccessConfiguration моя собственная реализация интерфейса AdminAccessConfiguration как @ Игнаси Баррера описал это.

ответ

1

Я думаю, что проблема связана с тем, что код jclouds работает на компьютере под управлением Windows, а jclouds по умолчанию использует некоторые предположения Unix.

Есть две разные вещи: во-первых, то AdminAccess.standard() используется для настройки пользователя в развернутом узле, как только он башмаки, а позже LoginCredentials объект передается в метод запуска сценария используется для проверки подлинности пользователя, который был созданный с помощью предыдущего оператора.

Проблема заключается в том, что AdminAccess.standard() считывает информацию «текущего пользователя» и принимает систему Unix. Эта информация пользователя предоставляется this Default class, и в вашем случае я уверен, что она вернется к блоку catch и вернет автоматически сгенерированную пару ключей SSH. Это означает, что AdminAccess.standard() создает пользователя в узле с автогенерированным (случайным) SSH-ключом, но создаваемые вами объекты LoginCredentials не соответствуют этим ключам, что приводит к сбою аутентификации.

Поскольку объект AdminAccess является неизменным, лучший и более чистый подход, чтобы исправить это, - это создать свою собственную реализацию AdminAccessConfiguration interface. Вы можете просто скопировать весь класс Default и изменить определенные бит Unix для установки SSH на вашем компьютере под управлением Windows. Когда у вас есть класс реализации, вы можете добавить его, создав модуль Guice и передав его в список модулей, предоставляемых при создании контекста jclouds. Что-то вроде:?

// Create the custom module to inject your implementation 
Module windowsAdminAccess = new AbstractModule() { 
    @Override protected void configure() { 
     bind(AdminAccessConfiguration.class).to(YourCustomWindowsImpl.class).in(Scopes.SINGLETON); 
    } 
}; 

// Provide the module in the module list when creating the context 
ComputeServiceContext context = ContextBuilder.newBuilder("aws-ec2") 
    .credentials("api-key", "api-secret") 
    .modules(ImmutableSet.<Module> of(windowsAdminAccess, new SshjSshClientModule())) 
    .buildView(ComputeServiceContext.class); 
+0

Я получаю ошибку компиляции «AdminAccessConfiguration не может быть разрешен к переменной» в 'Bind (....', любые предложения или любые ресурсы вы можете указать мне в – Athafoud

+0

Это был typo. В 'AdminAccessConfiguration' отсутствовал' .class'. Я уже редактировал сообщение. –

Смежные вопросы