1

语境

我正在使用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 ]

理想情况下,这一切都发生在用户被创建之前,因为新用户的主目录将在这个新的挂载上。

如果实例停止并启动/重新启动,我不希望在启动时再次发生重新格式化而丢失所有数据。

4

4 回答 4

9

Amazon Linux 上的 cloud-init支持该fs_setup模块。因此,您的磁盘未格式化。此外,主目录 /jenkins 是为用户创建的,并用作挂载点。这隐藏了主目录。

我会建议:

bootcmd:
 - test -z "$(blkid /dev/nvme1n1)" && mkfs -t ext4 -L jenkins /dev/nvme1n1
 - mkdir -p /jenkins

mounts:
 - [ "/dev/nvme1n1", "/jenkins", "ext4", "defaults,nofail", "0", "2" ]

runcmd:
 - useradd -m -b /jenkins jenkins 
于 2018-11-07T17:13:40.597 回答
1

我没有弄清楚如何使用默认的 AMI 和云初始化脚本来实现这一点。

我已经通过基于我想要的具有加密 EBS 卷的 AMI 创建自己的 AMI 解决了这个问题。现在我只需按 ID 启动这个 AMI,不用担心格式化 EBS、附加、安装等。

它更简单,需要更少的配置。然而,最大的缺点是当一个新的基础 AMI 出现时,我不能简单地将 AMI ID 更新为最新的。我需要自己创建一个新的基础 AMI。

不理想,但它有效。如果有人知道如何“正确”地做到这一点,我想听听更多关于它的信息。

于 2018-04-23T15:38:05.137 回答
1

在启动 EC2 实例时,您可以使用用户数据脚本轻松完成此操作。这是一个示例用户脚本:

# make a directory for a drive
sudo mkdir /data

# format disk
yes | sudo mkfs.ext4 /dev/sdb

# mount it
sudo mount /dev/sdb /data

# persist
uuid=$(sudo blkid /dev/sdb | sed -n 's/.*UUID=\"\([^\"]*\)\".*/\1/p')
sudo bash -c "echo 'UUID=${uuid}     /data       ext4   defaults' >> /etc/fstab"
于 2021-06-23T17:51:20.557 回答
0

神奇的x-systemd.makefsfstab 选项可以在 cloud-init 中使用。auto如果设备还没有文件系统,systemd 挂载单元会在挂载前自动格式化为指定的文件系统(不要使用)。

注意:手动安装 withmount不会触发格式化,而是通过 systemd 启动,直接 ( systemctl start mnt-foo.mount) 或通过单元依赖项(RequiresMountsFor参见https://www.freedesktop.org/software/systemd/man/systemd.unit.html ) 有效。

请参阅https://www.freedesktop.org/software/systemd/man/systemd.mount.html

于 2020-06-24T22:59:07.773 回答