我有一个云init文件,它为我们的AWS实例设置了所有需求,其中一部分需求正在形成和安装一个EBS卷。问题是,在某些实例上,卷附件是在实例运行后发生的,所以当云-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
的东西。
如果整个云-init的执行可以被延迟,那对我也是有效的。
另外,我正在使用terraform创建基础设施。
谢谢!
发布于 2020-09-28 20:25:32
我能够通过两个改变来解决这个问题:
nofail
选项。runcmd
块添加了一行,删除了disk_setup.的信号量文件。
所以我的新的云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
模块。此时,卷将被附加,以便操作不会失败。
我想这是一种解决这个问题的方法,所以如果有人有一个更好的答案(比如如何延迟整个云-init执行),请分享它。
发布于 2020-09-28 01:40:50
我想云-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, -c, "sleep 1000" ]
- [ sh, -c, "echo after sleep:`date` >> /tmp/user_data.log" ]
<Rest of the script>
https://stackoverflow.com/questions/64071917
复制相似问题