0

我已经使用以下代码成功配置了 Bare Metal Cloud 计算实例:

public static Instance createInstance(
        ComputeClient computeClient,
        String compartmentId,
        AvailabilityDomain availabilityDomain,
        String instanceName,
        Image image,
        Shape shape,
        Subnet subnet
    ) {

    LaunchInstanceResponse response = computeClient.launchInstance(
        LaunchInstanceRequest.builder()
            .launchInstanceDetails(
                LaunchInstanceDetails.builder()
                    .availabilityDomain(availabilityDomain.getName())
                    .compartmentId(compartmentId)
                    .displayName(instanceName)
                    .imageId(image.getId())
                    .shape(shape.getShape())
                    .subnetId(subnet.getId())
                    .build())
            .build());  

    return response.getInstance();
}

但是,我无法通过 SSH 连接到通过上面的代码创建的任何实例,因为没有参数launchInstance可以传递我的 SSH 密钥对的公钥。

如何告诉实例允许使用什么 SSH 公钥?我知道这一定是可能的,因为控制台 UI 允许我提供 SSH 公钥作为实例创建的一部分。

4

1 回答 1

1

根据启动实例 API 文档ssh_authorized_keys,您需要通过参数字段传递您的 SSH 公钥metadata

提供 Cloud-Init 元数据

您可以使用以下元数据键名向 Cloud-Init 提供信息:

"ssh_authorized_keys" - 为实例上的默认用户提供一个或多个公共 SSH 密钥以包含在 ~/.ssh/authorized_keys 文件中。使用换行符分隔多个键。SSH 密钥必须采用 authorized_keys 文件所需的格式

Java SDK 中的代码如下所示:

public static Instance createInstance(
        ComputeClient computeClient,
        String compartmentId,
        AvailabilityDomain availabilityDomain,
        String instanceName,
        Image image,
        Shape shape,
        Subnet subnet
    ) {

    String sshPublicKey = "ssh-rsa AAAAB3NzaC1y...key shortened for example...fdK/ABqxgH7sy3AWgBjfj some description";

    Map<String, String> metadata = new HashMap<>();
    metadata.put("ssh_authorized_keys", sshPublicKey);

    LaunchInstanceResponse response = computeClient.launchInstance(
        LaunchInstanceRequest.builder()
            .launchInstanceDetails(
                LaunchInstanceDetails.builder()
                    .availabilityDomain(availabilityDomain.getName())
                    .compartmentId(compartmentId)
                    .displayName(instanceName)
                    .imageId(image.getId())
                    .metadata(metadata)
                    .shape(shape.getShape())
                    .subnetId(subnet.getId())
                    .build())
            .build());  

    return response.getInstance();
}

然后,该实例将允许您使用该公钥的 SSH 密钥对 SSH 到它。

于 2016-11-23T22:32:20.427 回答