以编程方式更改新创建的AWS实例的主机名

时间:2016-08-31 06:58:23

标签: linux amazon-web-services amazon-ec2 aws-sdk

我可以使用AWS Java SDK创建EC2实例(Amazon Linux):

RunInstancesRequest runInstancesRequest = new RunInstancesRequest()
                .withInstanceType(InstanceType.valueOf("T2Micro"))
                .withImageId("ami-12345abc")
                .withMinCount(1)
                .withMaxCount(1)
                .withSecurityGroupIds("some-group")
                .withKeyName("my-key")

RunInstancesResult runInstancesResult = ec2.runInstances(runInstancesRequest);

现在我希望以编程方式更改这样创建的服务器的hostname。通过此AWS documentation可以手动进行。我想自动执行此操作,因此我尝试将user data shell scripts用作:

RunInstancesRequest runInstancesRequest = new RunInstancesRequest()
                .withInstanceType(InstanceType.valueOf("T2Micro"))
                ......
                .withUserData(getUserDataScript());
RunInstancesResult runInstancesResult = ec2.runInstances(runInstancesRequest);

private static String getUserDataScript() {
        String str = "#!/bin/bash\n" +
                     "sudo sed -i -e 's/[before]/after/' /etc/sysconfig/network\n" + 
                     "sudo init 6";
        return Base64.getEncoder().encodeToString(str.getBytes());
}

现在的麻烦是我无法再登录到这样创建的实例。只是给出一个简单的connection refused错误。检查密钥和每个细节 - 如果我不提供用户数据脚本,我就可以登录。

我是否正确更改了主机名?还有其他方法可以实现自动化吗?

1 个答案:

答案 0 :(得分:2)

当您运行sudo init 6时,您需要重新启动,这可能需要一些时间,这就是您无法立即登录的原因;

您可以尝试运行hostname命令直接使用新主机名,因此脚本将类似于

    String str = "#!/bin/bash\n" +
                 "sudo sed -i -e 's/[before]/new_hostname/' /etc/sysconfig/network\n" + 
                 "sudo echo 'new_hostname' >> /etc/hostname" +
                 "sudo hostname new_hostname"; 

注意:我没有完全测试这个但是我希望它应该在不重启的情况下使用new_hostname所以它应该允许你连接 - 根据你的Linux发行版的味道它可能有点不同,我建议你先正常登录到实例并运行命令以确保ti适用于您的Linux发行版