云初始化:延迟 disk_setup 和 fs_setup
cloud-init: delay disk_setup and fs_setup
我有一个 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 确实有 运行 临时命令的选项。看看这个 link.
https://cloudinit.readthedocs.io/en/latest/topics/modules.html?highlight=runcmd#runcmd
不确定您的代码是什么样的,但我只是尝试在 AWS 中将下面的代码作为 user_data 传递,并且可以看到初始化脚本休眠了 1000 秒...(刚刚添加了一些回声声明稍后检查)。我想您还可以添加更多逻辑来验证卷的存在。
#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>
我通过两个更改解决了这个问题:
- 更改了挂载选项,添加了
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
模块。此时,卷将被附加,因此操作不会失败。
我想这是解决这个问题的一种 hacky 方法,所以如果有人有更好的答案(比如如何延迟整个 cloud-init 执行)请分享。
我有一个 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 确实有 运行 临时命令的选项。看看这个 link.
https://cloudinit.readthedocs.io/en/latest/topics/modules.html?highlight=runcmd#runcmd
不确定您的代码是什么样的,但我只是尝试在 AWS 中将下面的代码作为 user_data 传递,并且可以看到初始化脚本休眠了 1000 秒...(刚刚添加了一些回声声明稍后检查)。我想您还可以添加更多逻辑来验证卷的存在。
#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>
我通过两个更改解决了这个问题:
- 更改了挂载选项,添加了
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
模块。此时,卷将被附加,因此操作不会失败。
我想这是解决这个问题的一种 hacky 方法,所以如果有人有更好的答案(比如如何延迟整个 cloud-init 执行)请分享。