我可以使用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
错误。检查密钥和每个细节 - 如果我不提供用户数据脚本,我就可以登录。
我是否正确更改了主机名?还有其他方法可以实现自动化吗?
答案 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发行版