语境
我正在使用https://wiki.jenkins.io/display/JENKINS/Amazon+EC2+Plugin for jenkins,它允许我在 AWS EC2 中动态配置新的云实例作为构建从属。
我正在启动ami-d834aba1
(Amazon Linux 2017.09.1)。
该插件也支持提供用户数据和块设备映射,目前我在阅读https://cloudinit.readthedocs.io/en/latest/后提供这样的配置
用户数据
#cloud-config
repo_update: true
repo_upgrade: all
package_upgrade: true
bootcmd:
- [ cloud-init-per, once, mkfs, -t, ext4, /dev/nvme1n1 ]
fs_setup:
- cmd: mkfs -t %(filesystem)s -L %(label)s %(device)s
label: jenkins
filesystem: 'ext4'
overwrite: false
device: '/dev/nvme1n1'
mounts:
- [ /dev/nvme1n1, /jenkins, "ext4", "defaults,nofail", "0", "2" ]
users:
- default
- name: jenkins
homedir: /jenkins
lock_passwd: true
ssh_authorized_keys:
- a-key
块设备映射
/dev/sdd=:100:true:gp2::encrypted
期望的行为
该实例将启动并附加一个新的 100GB 加密 EBS 卷,该卷将被格式化ext4
并安装/jenkins
为 jenkins 用户的主目录。
观察到的行为
实例启动,创建 100GB 加密 EBS 卷并将其附加到 EC2 实例(在 AWS 控制台中显示为正在使用并附加)。然而,
1)df -h
不显示文件系统。
2)
cat /etc/fstab
/dev/nvme1n1 /jenkins ext4 defaults,nofail,comment=cloudconfig 0 2
确实显示它
3)sudo file -s /dev/nvme1n1
/dev/nvme1n1: data
将卷显示为data
格式化而不是ext4
4) sudo mount-a 由于文件系统不是 ext4 而失败。
手动破解
如果我在启动后手动 SSH 到机器并运行:
sudo mkfs -t ext4 /dev/nvme1n1
mke2fs 1.42.12 (29-Aug-2014)
Creating filesystem with 26214400 4k blocks and 6553600 inodes
Filesystem UUID: 7a434f7a-c048-4c3d-8098-b810e2ff8f84
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
然后 sudo mount -a
它似乎安装了卷。
问题
有什么方法可以自动格式化和安装设备?我试过有和没有
bootcmd:
- [ cloud-init-per, once, mkfs, -t, ext4, /dev/nvme1n1 ]
理想情况下,这一切都发生在用户被创建之前,因为新用户的主目录将在这个新的挂载上。
如果实例停止并启动/重新启动,我不希望在启动时再次发生重新格式化而丢失所有数据。