2015-02-10 120 views
2

我正尝试使用JClouds将新卷附加到我的实例。但我找不到办法。JClouds:如何将新卷附加到AWS EC2实例

final String POLL_PERIOD_TWENTY_SECONDS = String.valueOf(SECONDS.toMillis(20)); 

    Properties overrides = new Properties(); 
    overrides.setProperty(ComputeServiceProperties.POLL_INITIAL_PERIOD, POLL_PERIOD_TWENTY_SECONDS); 
    overrides.setProperty(ComputeServiceProperties.POLL_MAX_PERIOD, POLL_PERIOD_TWENTY_SECONDS); 

    Iterable<Module> modules = ImmutableSet.<Module> of(new SshjSshClientModule(), new SLF4JLoggingModule()); 
    //Iterable<Module> modules = ImmutableSet.<Module> of(new SshjSshClientModule()); 

    ComputeServiceContext context = ContextBuilder.newBuilder("aws-ec2") 
      .credentials("valid user", "valid password") 
      .modules(modules) 
      .overrides(overrides) 
      .buildView(ComputeServiceContext.class); 
    ComputeService computeService = context.getComputeService(); 

    // Ubuntu AMI 
    Template template = computeService.templateBuilder() 
      .locationId("us-east-1") 
      .imageId("us-east-1/ami-7c807d14") 
      .hardwareId("t1.micro") 
      .build(); 

    // This line creates the volume but does not attach it 
    template.getOptions().as(EC2TemplateOptions.class).mapNewVolumeToDeviceName("/dev/sdm", 100, true); 

    Set<? extends NodeMetadata> nodes = computeService.createNodesInGroup("m456", 1, template); 

    for (NodeMetadata nodeMetadata : nodes) { 
     String publicAddress = nodeMetadata.getPublicAddresses().iterator().next(); 
     //String privateAddress = nodeMetadata.getPrivateAddresses().iterator().next(); 
     String username = nodeMetadata.getCredentials().getUser(); 
     String password = nodeMetadata.getCredentials().getPassword(); 
     // [...] 
     System.out.println(String.format("ssh %[email protected]%s %s", username, publicAddress, password)); 
     System.out.println(nodeMetadata.getCredentials().getPrivateKey()); 
    } 

如何创建将卷附加到目录“/ var”? 如何创建具有更多硬盘空间的实例?

回答

3

您可以在jclouds中使用ElasticBlockStoreApi。您所创建的实例了,所以创建和附加这样的量:

// Get node 
NodeMetadata node = Iterables.getOnlyElement(nodes); 

// Get AWS EC2 API 
EC2Api ec2Api = computeServiceContext.unwrapApi(EC2Api.class); 

// Create 100 GiB Volume 
Volume volume = ec2Api.getElasticBlockStoreApi().get() 
     .createVolumeInAvailabilityZone(zoneId, 100); 

// Attach to instance 
Attachment attachment = ec2Api.getElasticBlockStoreApi().get() 
     .attachVolumeInRegion(region, volume.getId(), node.getId(), "/dev/sdx"); 

现在,你有一个EBS卷连接,以及VM具有为其创建一个块设备,你只需要运行正确的命令将其挂载在/var目录中,这取决于您的特定操作系统。你可以运行这样的脚本:

// Run script on instance 
computeService.runScriptOnNode(node.getId(), 
     Statements.exec("mount /dev/sdx /var"));