Cloud-init简介
参考文档:cloud-init17.1官方文档
1 cloud-init概述
cloud-init(简称ci)在AWS、Openstack和Cloudstack上都有使用,所以应该算是事实上的云主机元数据管理标准。 cloud-init 是云上linux系统的一个配置工具,当系统启动时,cloud-init 可从云的datasource中获取 metadata,完成包括但不限于下面的定制化工作:
- 设置主机名
- 配置语言、时区
- 配置网络
- 配置SSH
- 设置密码
- 安装软件包
- 扩展磁盘分区和文件系统
- 执行定制化脚本
2 cloud-init基本概念
metadata:cloud-init初始化依赖的数据,比如要设置成什么hostname,网络详细信息如ip、掩码、dns,密码等是由nova提供的,这些数据我们称之为元数据(metadata) 。
datasource:数据来源。元数据存在的载体我们叫做datasource。比如nova可以将这些元数据放到一个iso里,以cdrom的形式挂载到虚拟机上,我们把这样的iso叫做configdrive,configdrive就是一种datasource;同样的,nova还支持通过网路地址的方式访问nova api获取到metadata,这样的方式叫做metadata service,metadata service也是一种datasource。简而言之,datasource就是包含metadata的一种媒介。
userdata: metadata是openstack根据虚拟机实际情况自动生成的,但有时候用户需要一些自定义的数据,例如创建虚拟机时,自动创建一个XXX用户等操作,就需要通过userdata的方式传到虚拟机里。userdata的载体也是datasource。
3 cloud-init工作原理
cloud-init包含四个服务,分别启动在开机过程的不同阶段。
- cloud-init-local.service: 在网络启动之前启动该服务,用于寻找datasource,配置网络,配置user-data,运行指定plugin。
- cloud-init.service: 在网络启动之后启动该服务,用于寻找datasource,配置网络,配置user-data,运行指定plugin。
- cloud-config.service: 在cloud-init服务启动之后启动,运行指定plugin。
- cloud-final.service: 在rc.local服务启动之后启动,几乎处在开机过程的结束阶段,比较靠后,运行指定plugin。
4 cloud-init服务
cloud-init有四个服务,按启动先后顺序依次为
- cloud-init-local.service
- cloud-init.service
- cloud-config.service
- cloud-final.service
cloud-init-local.service:从configdrive里获取datasource,配置网络,并运行cloud-init配置文件里"cloud_init_modules"部分的模块。
cloud-init.service:从nova的metadata service里获取datasource,配置网络,并运行cloud-init配置文件里"cloud_init_modules"部分的模块。
cloud-config.service: 运行cloud-init配置文件里"cloud_config_modules"部分的模块。
cloud-final.service: 运行cloud-init配置文件里"cloud_final_modules"部分的模块。
5 cloud-init配置文件
cloud-init的配置文件主要包括/etc/cloud/cloud.cfg, /etc/cloud/cloud.cfg.d/*,/var/lib/cloud/instance/cloud-config.txt等。其中,/etc/cloud/cloud.cfg,是一个yaml格式的配置文件。其内容部分如下所示:
users:
- default
disable_root: 0
ssh_pwauth: 1
......
cloud_init_modules:
- resolv-conf
- migrator
- bootcmd
- write-files
- growpart
- resizefs
- set_hostname
- update_etc_hosts
- rsyslog
- users-groups
- ssh
......
cloud_config_modules:
- locale
- set-passwords
- rh_subscription
......
cloud_final_modules:
- rightscale_userdata
- scripts-per-once
- scripts-per-boot
- scripts-per-instance
- scripts-user
......
datasource_list: [ ConfigDrive,OpenStack ]
datasource:
ConfigDrive:
dsmode: local
OpenStack:
metadata_urls: ["xxxxxx"]
max_wait: 120
timeout: 10
retries: 5
6 cloud-init缓存目录
cloud-init在运行过一次之后,会在/var/lib/cloud/生成缓存目录。目录里用来记录datasource和metadata信息、模块的运行记录以及用户的自定义脚本等等。
7 datasource结构介绍
以configdrive为例,openstack云平台里启动一个虚拟机之后,执行"lsblk"可以查看虚拟机有个cdrom,我们对该cdrom进行挂载,发现其内部结构如下:
metadata信息存放在/mnt/openstack/latest/目录之下的文件里。其中:
- meta_data.json 记录了虚拟机的基本metadata,包含了主机名、uuid等信息。
- network_data.json 记录了虚拟机的网络信息。
- user_data 记录了用户传入的user data。
- vendor_data.json 记录了厂商信息,我们一般用不到这个文件。
8 cloud-init如何设置网络
cloud-init是通过cloud-init-local.service中配置网络的,网络的配置依赖于configdrive,如果没有configdrive,cloud-init-local.service会生成一个dhcp方式的网卡eth0的配置文件,以保证后面的初始化过程可以访问nova metadata service。
当使用configdrive时,cloud-init会读取network_data.json,并根据mac地址和本地的网卡设备互相匹配,然后生成网卡配置文件。注意:cloud-init配置网络只会在每个实例首次开机时配置一次,后续不会再配置网络。
9 cloud-init如何禁用网络配置
如果想禁止cloud-init修改网络配置文件(比如用户作镜像时已经配死了网络,不希望别人修改),那么可以在/etc/cloud.cfg.d/里新建一个名为"99-disable-network-config.cfg"的配置文件,内容如下:
99-disable-network-config.cfg network: {config: disabled}
或者在/etc/cloud/cloud.cfg中配置
network:
config: disabled
10 cloud-init如何进行自动扩盘和文件系统
cloud-init扩展分区是通过"growpart"模块来做的,分区扩展后,文件系统的扩展是通过"resizefs"模块来做的,这两个模块都位于/etc/cloud/cloud.cfg的"cloud_init_modules"部分。
说明:
- "growpart"模块依赖于growpart的命令,对centos7以上的系统,需要安装cloud-utils-growpart包;对centos6而言,要安装"linux-rootfs-resize-master.zip"包;对ubuntu16.04而言,要安装cloud-utils包,没有这些包,无法对系统分区进行扩展。
- growpart默认只能扩展"/"分区,而且"/"分区必须位于磁盘的最末一个分区。否则也无法扩展磁盘,或者需要手动修改/etc/cloud/cloud.cfg文件。