使用cloud-init初始化云主机

云平台通过镜像模块创建云主机,生成的云主机具有相同的配置,这就需要对云主机进行个性化设置,以满足不同用户的需求。cloud-init是一个开源的云初始化程,能够对云主机进行一些初始化操作,如配置ip、主机名、密码、ssh登录等。


安装配置cloud-init

使用cloud-init,需要云主机安装了cloud-init程序,以ubuntu为例,安装配置执行如下:

// 在虚拟机安装
apt install cloud-init
// 设置开机启动
systemctl enable cloud-init-local.service
systemctl enable cloud-init.service
systemctl enable cloud-config.service
systemctl enable cloud-final.service


数据源设置

cloud-init通过数据源获取配置的信息,支持网络和本地数据源的方式,本文介绍的是本地数据源的方式,设置如下:

// 编辑/etc/cloud/cloud.cfg
添加 datasource_list: [NoCloud]


数据文件准备

在物理机生成meta-data、user-data、network-config文件,meta-data能实现一些固定功能设置,如主机名称,user-data则可以实现更多灵活的功能,如生成文件、执行脚本等等,network-config用于网络配置。


meta-data

instance-id: my-instance-id1
local-hostname: my-host-name4

cloud-init根据instance-id的值决定是否初始化,instance-id有变化则执行初始化,一般来说云主机只需要初始化一次,如果需要再次初始化,可以改变instance-id的值。


user-data

user-data是比较灵活的部分,可以实现很多自定义的功能,例如物理机通过write_files传输文件到虚拟机:

#cloud-config
write_files:
- encoding: b64
content: aGVsbG8gd29ybGQK
path: /rjy.test
permissions: '0755'
- content: |
alias xxx
hello world
path: /etc/rjy.test

文件可以是明文传输也可以是base64加密传输。


network-config

该文件定义网络配置,配置项也是熟悉的概念:

version: 2
ethernets:
eth0:
match:
mac_address: "52:54:00:da:17:ac"
addresses:
- 192.168.122.10/255.255.255.0
gateway4: 192.168.122.1
nameservers:
addresses: [8.8.8.8]


打包iso文件

定义好meta-data、user-data、network-config文件后,需要把这些文件打包成iso文件:

genisoimage -o config.iso -V cidata -r -J meta-data user-data network-config


挂载iso文件到cdrom

把打包的iso挂载到云主机的cdrom中,这样云主机才能读取到这些配置信息,以libvirt的xml文件为例:

<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/var/lib/libvirt/images/config.iso'/>
<backingStore/>
<target dev='hda' bus='ide'/>
<readonly/>
<alias name='ide0-0-0'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>

重启云主机,就可以看到初始化的效果了。


结束语

以上就是cloud-init通过no cloud方式初始化云主机的全部内容,只是简单了描述了一些配置的例子,更多的配置资料可以参考官方文档。