cloud-init 配置深度解析与 OpenStack 集成实践
cloud-init 是 Linux 云镜像启动时的初始化工具,负责完成实例的首次配置。通过调整 /etc/cloud/cloud.cfg 中的参数,可以精细控制实例的初始化流程。
核心配置项调整
启用 root 直接登录
默认情况下 root 账户禁止密码登录,如需开放:
disable_root: false
允许 SSH 密码认证
默认仅支持密钥登录,开启密码验证:
ssh_pwauth: true
持久化主机名
默认每次重启会重置 hostname,如需保留自定义主机名,从 cloud_init_modules 列表中移除以下两项:
cloud_init_modules:
- migrator
- bootcmd
- write-files
# - set_hostname # 注释或删除
# - update_hostname # 注释或删除
- update_etc_hosts
- users-groups
- ssh
用户密码管理
通过 chpasswd 模块批量设置账户凭证:
#cloud-config
chpasswd:
list: |
admin:Secret@789
deploy:AutoGenPwd
guest:RANDOM
expire: false
配置说明:
expire: false— 密码永不过期expire: true— 强制用户首次登录后修改密码RANDOM或R— 自动生成随机密码
随机密码可在以下位置查看:
- 虚拟控制台日志:
nova console-log <instance> - 本地日志文件:
/var/log/cloud-init-output.log
/var/lib/cloud/instance 并重新引导)。
完整配置示例
users:
- default
disable_root: false
ssh_pwauth: true
locale_configfile: /etc/sysconfig/i18n
resize_rootfs_tmp: /dev
ssh_deletekeys: false
ssh_genkeytypes: ~
syslog_fix_perms: ~
cloud_init_modules:
- migrator
- bootcmd
- write-files
- growpart
- resizefs
- set_hostname
- update_hostname
- update_etc_hosts
- rsyslog
- users-groups
- ssh
cloud_config_modules:
- mounts
- locale
- set-passwords
- yum-add-repo
- package-update-upgrade-install
- timezone
- puppet
- chef
- salt-minion
- mcollective
- disable-ec2-metadata
- runcmd
cloud_final_modules:
- rightscale_userdata
- scripts-per-once
- scripts-per-boot
- scripts-per-instance
- scripts-user
- ssh-authkey-fingerprints
- keys-to-console
- phone-home
- final-message
system_info:
default_user:
name: root
lock_passwd: true
gecos: Cloud User
groups: [wheel, adm, systemd-journal]
sudo: ["ALL=(ALL) NOPASSWD:ALL"]
shell: /bin/bash
distro: rhel
paths:
cloud_dir: /var/lib/cloud
templates_dir: /etc/cloud/templates
ssh_svcname: sshd
chpasswd:
list: |
root:Temp#Pass123
expire: true
OpenStack 集成注意事项
配置驱动(Config Drive)的关联机制
| 镜像状态 | nova.conf 配置 | 行为结果 |
|---|---|---|
| 无 cloud-init | force_config_drive = true | 忽略元数据,正常启动 |
| 有 cloud-init | 未配置/force_config_drive = false | 尝试获取元数据,可能产生延迟和报错 |
| 有 cloud-init | force_config_drive = true | 正常读取配置驱动 |
典型故障场景
当计算节点从"无 cloud-init 镜像"迁移到"有 cloud-init 镜像"环境时,若 nova.conf 中启用了 force_config_drive = true,原有实例重启后可能出现 ERROR 或 NO STATE 状态。
现象分析:
# 正常实例磁盘
rbd ls vms | grep instance-uuid
instance-uuid_disk
# 启用 config drive 后的磁盘结构
instance-uuid_disk
instance-uuid_disk.config # 新增的配置驱动卷
旧实例因缺少 .config 卷,cloud-init 无法定位元数据源,导致初始化失败。
修复方案
- 临时修复:更新 Nova 数据库中实例的
config_drive字段,关闭实例后冷启动 - 长期建议:统一镜像标准,避免混合使用 cloud-init 与非 cloud-init 镜像
force_config_drive 配置与镜像 cloud-init 状态保持一致,避免运行时冲突。