cloud-init是一个支持多操作系统的软件包,用于处理云主机早期的初始化操作,当系统启动时,cloud-init可以在云的datasource中获取metadata(nova metadata服务或者config drive(config drive是一个特殊的文件系统,openstack会将metadata写到config drive,并在instance启动的时候挂载给instance,然后去读metadata)),完成包括但不限于下面所列举的定制化工作:
- 设置default locale
- 设置云主机hostname
- 生成实例的SSH私钥
- 添加SSH KEYS到.ssh/authorized_keys ,使用户可以登录
- 设置临时挂载点
- 设置用户密码
- 配置网络
- 安装软件包
从图中可知道相关的一个流程:当cloud-init启动后会去读取源数据,如果配置了dhcp服务,则去nova-metadata中读取,如果没有配置的话就去cloud drive读取;当去metadata里面去读的话默认是从l3-agent里面读取。
注:云主机中lsblk查看块设备,挂载/dev/sr0,进入这个目录可以查看相关文件:
我们查看日志进行分析:
第一阶段:扫描文件系统、挂载/dev/sr0,读取数据,卸载、加载config driver、读取文件cloud.cfg。
第二阶段:扫描网卡、配置网卡、写入到文件、配置dns、完成第二阶段
第三阶段:init-network,读取check-cache,调用相关cloud_init_module初始化(主机名初始化,check-cache、consume-user-data、consume-vendor-data、config-migrator、config-bootcmd、config-write-files、config-growpart、config-resizefs、config-set_hostname、config-update_etc_hosts、config-rsyslog、config-users-groups、config-ssh)
第四阶段:调用config_modules的相关模块,mounts,locale,set-passwords,yum-add-repo,package-update-upgrade-install,timezone,puppet,chef,salt-minion,mcollective,disable-ec2-metadata,runcmd
第五阶段:调用final_modules模块,config-rightscale_userdata、config-scripts-per-boot、config-scripts-per-instance、config-scripts-user、config-ssh-authkey-fingerprints、config-keys-to-console、config-phone-home、config-final-message
cloud-init会在云主机上创建如下的目录结构用来记录相关的信息:
其中:
- data目录会记录云主机的instance id,datasource,hostname等信息
- instances目录下记录了云主机的instance的user-data,cloud-config,用到的datasource,运行的命令等信息。
- scripts下的per-boot存放运行启动脚本,系统引导时运行;per-once:只运行一次脚本;per-instance:一个实例初始化会执行一次
配置文件cloud.cfg:
1 | users: |
cloud-init安装时会将这几个阶段执行的任务以服务的形式注册到系统中,比如在systemd的环境下,我们能够看到这几个阶段分别对应的服务:
- generator - cloud-config.target
- local - cloud-init-local.service
- nework - cloud-init.service
- config - cloud-config.service
- final - cloud-final.service
这些进程只会执行一次,不会以常驻进程的形式存在:
- generator
读取配置文件cloud.cfg
- local
此时instance还不知道该如何配置网卡,cloud-init的任务就是从config drive中获取配置信息,然后写入/etc/network/interfaces文件,如果没有config drive,则将所有网卡配置成dhcp模式,只有当网卡正确配置以后,才能获取到metadata。
- network
在local阶段之后,当网络设置完成了才进行这个阶段,这个阶段会调用。两个模块disk_setup,mounts来完成磁盘格式化分区,添加挂载点等操作,另外执行一些系统引导早期可以调用的模块,读取cloud_init_modules模块的指定配置。
- config
执行配置模块,读取cloud_config_modules模块的指定配置
- final
这个阶段初始化已经基本完成,因此大部分的模块在这个阶段都能正常运行,比如安装软件,运行一些自动化工具,如puppet,salt等,以及用户定义的脚本。
cloud-init传入脚本
比如设置hostname:
1 | #cloud-config |
cloud-init 只会读取以 #cloud-config 开头的数据,所以这一行一定要写对。hostname: http://my1.cloudman.cc 告诉 cloud-init 将 hostname 设置为 http://my1.cloudman.cc。manage_etc_hosts: true 告诉 cloud-init 更新 /etc/hosts 文件。
脚本传递到instance:
- instance 部署时,直接将其粘贴到 Customization Script 输入框中(社区版)
- 将其保存为文件,命令行 nova boot 或者 openstack server create 部署 instance 时,使用参数 --user-data 传入。
- 将其保存为文件进行上传