virt-install 集成 cloud-init
virt-install 的 --cloud-init 选项可以把 user-data 注入使用 NoCloud 数据源的镜像:设置初始用户、SSH 公钥、root 密码与首次启动脚本,让虚机开机即达到可用状态,不必手工登录做初始化。它属于 libvirt / virt-install 在 Linux(RHEL、Debian 系)上的能力。
基本信息
| 参数形态 | --cloud-init user-data=/path/user-data.yaml,root-password=密码 |
|---|---|
| 镜像要求 | 镜像内已安装 cloud-init 且支持 NoCloud 数据源 |
| 常用内容 | 初始用户、SSH 公钥、首次启动脚本、包安装 |
| 风险点 | root 密码会出现在命令历史与运维平台日志里 |
| 校验方式 | 进系统后查 cloud-init 日志与 /var/lib/cloud 目录 |
| 替代方案 | 也可手工制作 seed 镜像(ISO 或 vfat)挂载给虚机 |
典型使用场景
- 批量创建同构虚机,用 user-data 区分主机名与网络参数
- 只注入 SSH 公钥、从第一天就禁用密码登录
- 首次启动执行装机脚本:装包、写配置、拉取代码
- 验收镜像时快速验证它能否被 cloud-init 正常初始化
- 在 CI 里自动起虚机跑集成测试
用 cloud-init 创建初始用户
用 cloud-init 创建初始用户
cat > /tmp/user-data.yaml <<'EOF'
#cloud-config
users:
- name: ops
sudo: ALL=(ALL) NOPASSWD:ALL
ssh_authorized_keys:
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA...(替换为实际公钥)
EOF
virt-install --name app01 --memory 2048 --vcpus 2 --import \
--disk path=/data/images/rocky9.qcow2,bus=virtio \
--network network=default,model=virtio --graphics none \
--console pty,target_type=serial \
--cloud-init user-data=/tmp/user-data.yaml
ssh ops@<虚机地址> 'cloud-init status --long' # 进机后确认初始化已完成常见注入项
| 项目 | user-data 写法 | 作用 |
|---|---|---|
| 初始用户 | users: | 创建账号并配置 sudo 权限 |
| SSH 公钥 | ssh_authorized_keys | 免密登录,替代密码 |
| 首次脚本 | runcmd: | 开机后执行装机命令 |
| 主机名 | hostname: / fqdn: | 一次性设定名称 |
| root 密码 | root-password= 参数 | 走命令行参数,注意泄露风险 |
root 密码写在命令行里会进入 shell 历史与各类平台日志;生产做法是只注入公钥并禁用密码登录,密码类参数交付后立即轮换。
注入能生效的前提是镜像内置 cloud-init 且识别 NoCloud 数据源:未做 cloud 化的传统安装镜像不会读取这些数据,开机后仍是默认账号。第一次用新镜像时,建议先起一台验证初始化日志,再批量铺开。