2013-11-01 2 views
1

jclouds를 사용하여 openstack에서 서버를 생성했습니다. 서버를 만들 수 있지만 클라우드 초기화가 완료된 후 서버에 연결하기 위해 공개 ssh 키를 전달하려고합니다. 아래는 제 코드입니다.openstack에서 jclouds를 사용하여 ssh 키 전달

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()); 
    }*/ 
} 
+0

볼 수 있듯이 템플릿이 공개 키를 추가하는 것으로 주석 처리 된 것처럼 보입니다. 둘째, 템플릿은 생성 호출 중에 사용해야합니다. ['createNodesInGroup'은 당신이 만든 템플릿을 가져옵니다.] (https://github.com/jclouds/jclouds-examples/blob/f5f038cc4c92c85fb8bc61c7ca8a591b7b2dacad/rackspace/src/main/java/org/jclouds/examples/rackspace/cloudservers/CreateServer. java # L97-L106). –

답변

1

난 당신이 클라이언트 런타임 동안 새 키를 지정할 수 있지만 미리 정의 된 공공 이전 OpenStack은 업로드 키 사용 방법 공개 키의

CreateServerOptions.Builder.keyPairName(KEY_NAME) 

목록을 볼 수 있습니다를 사용하는 방법을 몰라 Openstack 대시 보드의 "Access & 보안"> "키 쌍". 수동 인스턴스 생성을위한 대시 보드 양식이 새로운 키 업로드를 지원하지 않기 때문에 인스턴스에 대한 새 키를 지정할 수 있다면 실제로 확신 할 수 없습니다. 대신에 새로운 NAMED 키를 가져 오지만 인스턴스 생성 후 위에서 언급 한 공개 키 목록에 추가됩니다.