Amazon ec2 cloud init:延迟磁盘\u设置和fs\u设置

Amazon ec2 cloud init:延迟磁盘\u设置和fs\u设置,amazon-ec2,terraform,cloud-init,Amazon Ec2,Terraform,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:

我有一个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"]
并且希望在磁盘配置块之前有类似于睡眠60的东西

如果整个cloud init执行可以延迟,那对我来说也可以

此外,我正在使用terraform创建基础设施


谢谢

我想cloud init确实有一个运行临时命令的选项。请查看此链接

不确定您的代码是什么样子,但我只是尝试在AWS中以用户_数据的形式传递下面的代码,可以看到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> 
#云配置
runcmd:
-[sh,-c,“睡眠前回声:`date`>>/tmp/user_data.log”]
-[sh,-c,“睡眠1000”]
-[sh,-c,“睡眠后回声:`date`>>/tmp/user_data.log”]

注:如果有帮助,请将其标记为“回答”或“投票”。

我通过两项更改解决了此问题:

  • 更改了装载选项,添加了
    nofail
    选项
  • runcmd
    块中添加了一行,删除用于磁盘安装的信号量文件
  • 因此,我的新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
    
    它将重新启动,然后将再次执行
    磁盘设置
    模块。此时,卷将被连接,因此操作不会失败


    我想这是一种很难解决的方法,因此如果有人有更好的答案(比如如何延迟整个cloud init执行),请分享。

    忘了提到我希望将格式化保持在cloud init空间内,而不是依赖命令,因为我被赋予了将旧shell脚本转换为cloud.init的任务。无论如何,如果不能推迟,那我就得试一试当然回发邮件,以防您发现任何差异选项。此外,使用“runcmd”仍然是cloud init的一部分,但您仍将执行linux cmds(但仍然并没有外部shell脚本…至少在某种程度上是如此整洁)。干杯,祝你好运!