cloud-init:延迟 disk_setup 和 fs_setup

Posted

技术标签:

【中文标题】cloud-init:延迟 disk_setup 和 fs_setup【英文标题】:cloud-init: delay disk_setup and fs_setup 【发布时间】:2021-01-12 05:59:45 【问题描述】:

我有一个 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 来创建基础架构。

谢谢!

【问题讨论】:

【参考方案1】:

我猜 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, -c, "sleep 1000" ]
 - [ sh, -c, "echo after sleep:`date` >> /tmp/user_data.log" ]
 
<Rest of the script> 

PS:如果有帮助,请将其标记为答案或点赞。

【讨论】:

忘了提到我想将格式保留在 cloud-init 空间内,而不是依赖于命令,因为我的任务是将旧的 shell 脚本转换为 cloud.init。无论如何,如果不可能推迟这个,那么我必须试一试。 ;) 当然。发回以防万一您碰巧找到任何差异选项。此外,使用“runcmd”仍然是 cloud-init 的一部分,但只是您仍将执行 linux cmds(但仍然没有外部 shell 脚本......至少在某种程度上如此整洁)。干杯,祝你好运!【参考方案2】:

我能够通过两个更改来解决问题:

    更改了挂载选项,添加了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:延迟 disk_setup 和 fs_setup的主要内容,如果未能解决你的问题,请参考以下文章

如何在不重启的情况下重新运行 cloud-init

在本地KVM中使用cloud-init

cloud-init 工作原理 - 每天5分钟玩转 OpenStack(171)

cloud-init 工作原理 - 每天5分钟玩转 OpenStack(171)

在 cloud-init 过程中显示 scp 的进度

cloud-init 执行分析