问题描述
我有一个cloud-init文件,该文件为我们的AWS实例设置了所有要求,其中一部分要求是格式化和装入EBS卷。问题在于,在某些情况下,实例启动后会发生卷附加,因此当cloud-init执行卷/dev/xvdf
时尚不存在而失败。
我有类似的东西:
#cloud-config
resize_rootfs: false
disk_setup:
/dev/xvdf:
table_type: 'gpt'
layout: true
overwrite: false
fs_setup:
- label: DATA
filesystem: 'ext4'
device: '/dev/xvdf'
partition: 'auto'
mounts:
- [xvdf,/data,auto,"defaults,discard","0","0"]
并且希望在磁盘配置块之前有一个类似sleep 60
的东西。
如果可以延迟整个cloud-init的执行时间,那对我也将适用。
此外,我正在使用terraform创建基础结构。
谢谢!
解决方法
我猜想cloud-init确实具有运行临时命令的选项。看一下这个链接。
https://cloudinit.readthedocs.io/en/latest/topics/modules.html?highlight=runcmd#runcmd
不确定您的代码是什么样,但是我只是尝试将以下内容作为AWS中的user_data传递,并且可以看到init脚本睡眠了1000秒钟...(只是添加了一些echo语句以供以后检查)。我想您也可以添加更多逻辑来验证卷的存在。
#cloud-config
runcmd:
- [ sh,-c,"echo before sleep:`date` >> /tmp/user_data.log" ]
- [ sh,"sleep 1000" ]
- [ sh,"echo after sleep:`date` >> /tmp/user_data.log" ]
<Rest of the script>
PS:如果有帮助,请标记为答案或赞扬。
,我能够通过以下两项更改来解决该问题:
- 更改了挂载选项,添加了
nofail
选项。 - 在
runcmd
块中添加了一行,删除disk_setup的信号灯文件。
所以我的新cloud-init文件现在看起来像这样:
#cloud-config
resize_rootfs: false
disk_setup:
/dev/xvdf:
table_type: 'gpt'
layout: true
overwrite: false
fs_setup:
- label: DATA
filesystem: 'ext4'
device: '/dev/xvdf'
partition: 'auto'
mounts:
- [xvdf,/data,auto,"defaults,discard","0","0"]
runcmd:
- [rm,-f,/var/lib/cloud/instances/*/sem/config_disk_setup]
power_state:
mode: reboot
timeout: 30
它将重新启动,然后将再次执行disk_setup
模块。届时,该卷将被附加,因此操作不会失败。
我想这是解决问题的一种方法,因此,如果有人有更好的答案(例如如何延迟整个cloud-init的执行时间),请分享它。