繁体   English   中英

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

[英]Programmatically change hostname of a newly created AWS instance

我可以使用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文档可以手动进行。 我想使它自动化,因此我尝试将用户数据shell脚本用作:

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错误。 检查了密钥和每个细节-如果我不提供用户数据脚本,则可以登录。

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

当您运行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 distro风格,它可能有所不同,我建议您首先正常登录实例,然后运行命令以确保ti在您的Linux发行版上正常工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM