我正在使用 cloud-init 自动准备一个 AWS 映像(AMI)以供在生产环境中使用 - 这样我就可以在源代码控制系统中跟踪环境设置过程,但是当我需要新的生产服务器时,我可以跳过这个漫长的过程。
因此,流程如下:
- 使用 cloud-init 文件启动新的基础映像(Ubuntu 14.04 cloud-image)
- 等待 cloud-init 完成,然后从正在运行的实例创建映像并终止它
- 为了启动新的生产服务器,我使用小型 cloud-init 从 AMI 启动并执行最终配置(设置正确的主机名、部署软件等)。
我遇到的问题是第一个 cloud-init 配置文件使用disk_setup
和mounts
模块来挂载 EBS 卷。完成后,实例已/etc/fstab
更新,一切正常。但是,执行步骤 3 后,生成的实例已正确连接和挂载了 EBS 卷(实际上是它的副本),但/etc/fstab
不包含该卷的挂载。幸运的是,我在第 3 步之后没有重新启动,但我可能会重新启动,这会破坏服务器。
知道发生了什么吗?我没有使用mounts
步骤 3 中的 cloud-init 配置,但是为什么它不保留fstab
图像中的设置?
答案1
我无法真正解释您所遇到的行为,但 AWS 本身建议您不要使用 fstab 条目,而是使用 RC init 脚本。请参阅下面的引文Cindy@AWS。虽然这个论坛帖子已经很旧了,并且并不是真正解决您遇到的相同问题的答案,但也许这样做也可以解决您的问题。
我建议考虑使用 RC init 脚本,而不是使用 fstab 来实现此目的(对于 EC2 实例)。如果 fstab 中列出的设备无法挂载,那么这将停止启动过程,并且您将无法通过 ssh 进入实例。相反,使用 RC 脚本可以允许发生“软故障”,以便您仍可以通过 ssh 进入,然后解决问题。
来源:https://forums.aws.amazon.com/message.jspa?messageID=304528#304549
答案2
问题在于第二个 cloud-init 配置(用于在 OP 的第 3 步启动生产实例)包含一小mounts
部分用于挂载其他实例特定卷。当 cloud-init 遇到某个mounts
部分时,它不会将找到的任何配置附加到当前 fstab,而是覆盖上游 cloud-init 创建的任何 cloud-init 设置。
解决方案是包含所有先前生成的挂载配置,或者不包含任何新配置并在步骤 1 中完成所有卷配置。