在openstack中使用jclouds传递ssh密钥

在openstack中使用jclouds传递ssh密钥,ssh,openstack,jclouds,Ssh,Openstack,Jclouds,我使用jclouds在openstack中创建了一个服务器。虽然我能够创建服务器,但我还希望传递我的公共ssh密钥,以便在cloud init完成后连接到服务器。下面是我的代码 package org.chris.jcloud; import static com.google.common.io.Closeables.closeQuietly; import java.io.Closeable; import java.io.File; import java.io.IOException

我使用jclouds在openstack中创建了一个服务器。虽然我能够创建服务器,但我还希望传递我的公共ssh密钥,以便在cloud init完成后连接到服务器。下面是我的代码

package org.chris.jcloud;

import static com.google.common.io.Closeables.closeQuietly;

import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.util.Set;
import java.util.concurrent.TimeoutException;

import org.jclouds.ContextBuilder;
import org.jclouds.compute.ComputeService;
import org.jclouds.compute.ComputeServiceContext;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.TemplateBuilder;
import org.jclouds.compute.options.RunScriptOptions;
import org.jclouds.io.Payloads;
import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
import org.jclouds.openstack.nova.v2_0.NovaApi;
import org.jclouds.openstack.nova.v2_0.NovaAsyncApi;
import org.jclouds.openstack.nova.v2_0.domain.Server;
import org.jclouds.openstack.nova.v2_0.domain.ServerCreated;
import org.jclouds.openstack.nova.v2_0.features.ServerApi;
import org.jclouds.openstack.nova.v2_0.options.CreateServerOptions;
import org.jclouds.predicates.SocketOpen;
import org.jclouds.rest.RestContext;
import org.jclouds.scriptbuilder.ScriptBuilder;

import com.google.common.collect.ImmutableSet;
import com.google.inject.Module;
import com.google.common.base.Predicate;
import com.google.common.io.Closeables;
import com.google.common.net.HostAndPort;

import org.jclouds.compute.RunNodesException;
import org.jclouds.compute.domain.Template;
import org.jclouds.scriptbuilder.domain.OsFamily;
import org.jclouds.sshj.config.SshjSshClientModule;

import static java.util.concurrent.TimeUnit.SECONDS;
import static org.jclouds.compute.config.ComputeServiceProperties.POLL_INITIAL_PERIOD;
import static org.jclouds.compute.config.ComputeServiceProperties.POLL_MAX_PERIOD;
import static org.jclouds.compute.options.TemplateOptions.Builder.authorizePublicKey;

public  class JClouds implements Closeable {
   private ComputeService compute;
   private RestContext<NovaApi, NovaAsyncApi> nova;
   private Set<String> zones;

   public static void main(String[] args) throws IOException {
      JClouds jCloudsNova = new JClouds();

      try {
         jCloudsNova.init();
         jCloudsNova.listServers();
         jCloudsNova.close();
         jCloudsNova.createServers();
      }
      catch (Exception e) {
         e.printStackTrace();
      }
      finally {
         jCloudsNova.close();
      }
   }

   private void init() {
      Iterable<Module> modules = ImmutableSet.<Module> of(new SLF4JLoggingModule());

      String provider = "openstack-nova";
      String identity = "admin:admin"; // tenantName:userName
      String password = "test"; // demo account uses ADMIN_PASSWORD too

      ComputeServiceContext context = ContextBuilder.newBuilder(provider)
            .endpoint("http://192.168.1.33:5000/v2.0/")
            .credentials(identity, password)
            .modules(modules)
            .buildView(ComputeServiceContext.class);
      compute = context.getComputeService();
      nova = context.unwrap();
      zones = nova.getApi().getConfiguredZones();
   }

   private void listServers() {
      for (String zone: zones) {
         ServerApi serverApi = nova.getApi().getServerApiForZone(zone);

         System.out.println("Servers in " + zone);

         for (Server server: serverApi.listInDetail().concat()) {
            System.out.println("  " + server);
         }
      }
   }

   private void createServers() {
    for (String zone : zones) {
        ServerApi serverApi = nova.getApi().getServerApiForZone(zone);
        CreateServerOptions sv = CreateServerOptions.Builder.adminPass("test");
        ServerCreated newServer = serverApi.create("paparia", "ab8fbee6-4907-4e59-ba77-471362bc8200", "1", sv);
    //  TemplateBuilder templateBuilder = compute.templateBuilder();
    //  Template template = templateBuilder.options(authorizePublicKey(Payloads.newPayload(new File("/home/me/.ssh/id_rsa.pub")).toString())).build();


        System.out.println("Servers in " + zone);
        listServers();
    }
}

@Override
public void close() throws IOException {
    // TODO Auto-generated method stub

}



   /*public void close() {
      closeQuietly(compute.getContext());
   }*/
}
package org.chris.jcloud;
导入静态com.google.common.io.Closeables.closequity;
导入java.io.Closeable;
导入java.io.File;
导入java.io.IOException;
导入java.util.Set;
导入java.util.concurrent.TimeoutException;
导入org.jclouds.ContextBuilder;
导入org.jclouds.compute.ComputeService;
导入org.jclouds.compute.ComputeServiceContext;
导入org.jclouds.compute.domain.NodeMetadata;
导入org.jclouds.compute.domain.TemplateBuilder;
导入org.jclouds.compute.options.RunScriptOptions;
导入org.jclouds.io.Payloads;
导入org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
导入org.jclouds.openstack.nova.v2_0.NovaApi;
导入org.jclouds.openstack.nova.v2_0.NovaAsyncApi;
导入org.jclouds.openstack.nova.v2_0.domain.Server;
导入org.jclouds.openstack.nova.v2_0.domain.ServerCreated;
导入org.jclouds.openstack.nova.v2_0.features.ServerApi;
导入org.jclouds.openstack.nova.v2_0.options.CreateServerOptions;
导入org.jclouds.predicates.SocketOpen;
导入org.jclouds.rest.RestContext;
导入org.jclouds.scriptbuilder.scriptbuilder;
导入com.google.common.collect.ImmutableSet;
导入com.google.inject.Module;
导入com.google.common.base.Predicate;
导入com.google.common.io.Closeables;
导入com.google.common.net.HostAndPort;
导入org.jclouds.compute.RunNodesException;
导入org.jclouds.compute.domain.Template;
导入org.jclouds.scriptbuilder.domain.OsFamily;
导入org.jclouds.sshj.config.sshjsclientModule;
导入静态java.util.concurrent.TimeUnit.SECONDS;
导入静态org.jclouds.compute.config.ComputeServiceProperties.POLL\u初始期;
导入静态org.jclouds.compute.config.ComputeServiceProperties.POLL\u MAX\u PERIOD;
导入静态org.jclouds.compute.options.TemplateOptions.Builder.authorizePublicKey;
公共类JClouds实现可关闭{
私有计算机服务计算;
私有rest-nova;
私人区域;
公共静态void main(字符串[]args)引发IOException{
JClouds jCloudsNova=新JClouds();
试一试{
jCloudsNova.init();
jCloudsNova.listServers();
jCloudsNova.close();
jCloudsNova.createServers();
}
捕获(例外e){
e、 printStackTrace();
}
最后{
jCloudsNova.close();
}
}
私有void init(){
Iterable modules=ImmutableSet.of(新的SLF4JLoggingModule());
字符串提供程序=“openstack nova”;
String identity=“admin:admin”;//租户名称:用户名
String password=“test”//演示帐户也使用ADMIN\u密码
ComputeServiceContext上下文=ContextBuilder.newBuilder(提供程序)
.endpoint(“http://192.168.1.33:5000/v2.0/")
.凭据(身份、密码)
.模块(模块)
.buildView(ComputeServiceContext.class);
compute=context.getComputeService();
nova=context.unwrap();
zones=nova.getApi().getConfiguredZones();
}
私有void列表服务器(){
用于(字符串区域:区域){
ServerApi ServerApi=nova.getApi().getServerApiForZone(zone);
System.out.println(“服务器位于”+区域);
对于(服务器:serverApi.listInDetail().concat()){
System.out.println(“+server”);
}
}
}
私有void createServers(){
用于(字符串区域:区域){
ServerApi ServerApi=nova.getApi().getServerApiForZone(zone);
CreateServerOptions sv=CreateServerOptions.Builder.adminPass(“测试”);
ServerCreated newServer=serverApi.create(“paparia”,“ab8fbee6-4907-4e59-ba77-471362bc8200”,“1”,sv);
//TemplateBuilder TemplateBuilder=compute.TemplateBuilder();
//Template Template=templateBuilder.options(authorizePublicKey(Payloads.newPayload(新文件(“/home/me/.ssh/id_rsa.pub”)).toString()).build();
System.out.println(“服务器位于”+区域);
listServers();
}
}
@凌驾
public void close()引发IOException{
//TODO自动生成的方法存根
}
/*公众假期结束(){
安静地关闭(compute.getContext());
}*/
}

我不知道如何在客户端运行时指定新密钥,但要使用先前上载到Openstack的预定义公钥,请使用方法

CreateServerOptions.Builder.keyPairName(KEY_NAME)

公钥列表可在Openstack仪表板上的“访问与安全”>“密钥对”中找到。实际上,我不确定是否可以为实例指定新密钥,因为手动创建实例的仪表板表单不支持新密钥上载。不过,它得到了一个新的命名密钥的导入,在创建实例后,它被添加到上述公钥列表中。

我不知道如何在客户端运行时指定一个新密钥,但要使用预定义的公钥(以前上载到Openstack),请使用方法

CreateServerOptions.Builder.keyPairName(KEY_NAME)

公钥列表可在Openstack仪表板上的“访问与安全”>“密钥对”中找到。实际上,我不确定是否可以为实例指定新密钥,因为手动创建实例的仪表板表单不支持新密钥上载。但是,它导入了一个新的命名密钥,在创建实例后,该密钥被添加到上述公钥列表中。

从我看到的情况来看,似乎模板被注释掉,将添加公钥。其次,模板需要在create调用期间使用。从我看到的情况来看,模板似乎被注释掉了,这将添加公钥。其次,模板需要在create调用期间使用。