最近在做一个功能,虚拟机开机时初始化用户、ip信息。linux系统的通过自启动脚本搞定了,windows的采用cloudbase-init 搞定。
CloudBase-init简介
cloudbase-init 是 Windows 和其他系统的云初始化程序,可以设置主机名、创建用户、设置静态ip、设置密码等。对应的linux初始化程序是cloudinit,都是开源的Python项目。官方文档:http://cloudbase-init.readthedocs.io/en/latest/index.html
cloudbase-init主要包括两部分services和plugins。Service主要为plugins提供数据来源,来源包括指定的云服务(openstack、ec2等)、本地配置文件(iso文件、物理磁盘)等。plugins即为执行相关操作的插件,像初始化ip、创建用户等。
实现功能
1、初始化ip2、初始化主机名3、初始化用户4、自动扩展磁盘业务场景
我们的业务场景是通过iso创建虚拟机----》导出虚拟机模板-----》通过模板创建虚拟机,
时序图虚拟机模板制作
Windows-CloudBaseinit-service
A metadata service hasthe role of pulling the guest provided data (configuration information) andexposing it to the Plugins fora general and basic initialization of the instance.
Cloudbaseinit可以通过Http或者本地文件来获取元数据。
在此,我们使用ConfigDriveService,因此,配置
metadata_services=cloudbaseinit.metadata.services.configdrive.ConfigDriveService
Windows-CloudBaseinit-plugins
初始化ipcloudbaseinit.plugins.common.networkconfig.NetworkConfigPlugin
发现问题:ip初始化有时候能成功有时候不能成功。
原因:cloudbaseinit运行时网卡设备未准备好。
解决方法:
修改C:\ProgramFiles\CloudbaseSolutions\Cloudbase-Init\Python\Lib\site-packages\cloudbase\plugins\common\networkconfig.py文件。在获取network_adapters位置添加如下代码:
初始化主机名
cloudbaseinit.plugins.common.sethostname.SetHostNamePlugin
Windows修改主机名后需重启,所以必须在conf文件中添加
allow_reboot=true
初始化administrator密码cloudbaseinit.plugins.windows.setuserpassword.SetUserPasswordPlugin
其中username为模板中用户名
初始化磁盘cloudbaseinit.plugins.common.userdata.UserDataPlugin
通过userdataplugin执行脚本,实现磁盘挂载。