3

精简版:

userdatacloud-init在 EC2 上运行脚本后,如何让 init.d 脚本运行?

长版:

我们的部署过程是构建 AMI,上面安装了所有东西(tomcat、nginx、应用程序等),但遗漏了某些配置值。在启动时,userdata 脚本添加缺少的配置值,然后应用程序堆栈可以启动

我们当前的 EC2 基于旧版本的官方 Debian AMI,它具有脚本ec2-run-user-data. 此脚本在启动时运行,并下载并运行 EC2 用户数据。在构建 AMI 时,我简单地编辑了 tomcat、nginx 等的 init.d 脚本,以在其“Required-Start:”行中包含 ec2-run-user-data,以便它们在运行 userdata 后启动。

不幸的是,这种方法不再可行,因为我们想开始使用安装了 cloud-init 而不是 ec2-run-user-data 的 hvm 基础 AMI。但是我无法弄清楚 cloud-init 是如何工作得足够好来弄清楚如何使这个过程工作的。

据我所知,userdata 脚本由 cloud-final 步骤运行,但 cloud-final 在它的“Required-Start:”行中有 $all。我可以删除它,但我不知道这可能会产生什么后果。

我试过让tomcat等在cloud-init或cloud-config之后运行,但是用户数据到那时还没有运行。此外,它看起来像 cloud-init 和 cloud-config 启动进程然后退出,这可能解释了为什么 cloud-final 需要在Required-Start 中有 $all

更多信息:

  1. 我们使用“烘焙 AMI”方法,在该方法中,我们创建一个安装了所有包/应用程序的 AMI,然后告诉现有的 Autoscaling 组用基于新 AMI 的新 EC2(通过 CloudFormation)替换他们的 EC2。有些配置信息在烘焙时是未知的,但必须通过 userdata 脚本插入。
  2. 当我们的 tomcat 应用程序启动时,它希望读取文件 /etc/appname/application.conf。该文件中包含文本<<REPLACE_THIS>><<REPLACE_TIME>>如果在更换之前尝试运行 Tomcat 将无法启动
  3. userdata 脚本类似于:
    #!/bin/bash sed -i 's!<<REPLACE_TIME>>!{New value to use, determined at deploy time}!' /etc/appname/application.conf
  4. tomcat 的默认Required-Start 是“$local_fs $remote_fs $network”。在烘焙时,我将其更改为“$local_fs $remote_fs $network ec2-run-user-data”

通过这样做,/etc/appname/application.conf 中的文本在 tomcat 运行之前被替换。但是就像我上面说的,我想改用cloud-init,我不知道在cloud-init运行了userdata之后我需要做什么才能让tomcat启动。我得到的印象是 cloud-init 直到过程的很晚才运行用户数据。我可以将userdata脚本更改为最后包含“/etc/init.d/tomcat restart”,但是让tomcat无法启动然后重新启动似乎有点愚蠢。

4

0 回答 0