cloudinit是专为云环境中虚拟机的初始化而开发的工具,它从各种数据源读取相关数据并据此对虚拟机进行配置。常见的数据源包括:云平台的metadata服务、ConfigDrive等,常见的配置包括:设定虚拟机的hostname、hosts文件、设定用户名密码、更新apt -get的本地缓存、调整文件系统的大小(注意不是调整分区的大小)等。
本文在openstack下进行测试。
(1)安装
centos 6.4和ubuntu server 12.04的官方源中已经包含cloudinit,直接采用yum 或者 apt -get安装即可
源码地址:https://launchpad.net/cloud-init
(2)配置
配置文件/etc/cloud/cloud.cfg
user: root
disable_root: 0
manage_etc_hosts: True
preserve_hostname: False
cloud_init_modules:
- bootcmd
- resizefs
- set_hostname
- update_hostname
- update_etc_hosts
- ca-certs
- rsyslog
- ssh
cloud_config_modules:
- mounts
- ssh-import-id
- locale
- set-passwords
- grub-dpkg
- landscape
- timezone
- puppet
- chef
- salt-minion
- mcollective
- disable-ec2-metadata
- runcmd
- byobu
cloud_final_modules:
- rightscale_userdata
- scripts-per-once
- scripts-per-boot
- scripts-per-instance
- scripts-user
- keys-to-console
- phone-home
- final-message
配置文件大致分为两部分,开头的变量/参数定义部分、后边要运行的模块列表(包括三大类cloud_init_modules、cloud_config_modules、cloud_final_modules)。
各模块在运行时,会根据之前定义的变量/参数的值,配置虚拟机的状态。
这里举一个简单的例子,update_etc_hosts模块(源文件:/usr/lib/python2.7/dist-packages/cloudinit/CloudConfig/cc_update_etc_hosts.py)
顾名思义,该模块用来设置主机的hosts文件,其中就用到了hostname、fqdn、manage_etc_hosts等变量的值。模块首先尝试从cloudinit的配置文件中读取这些变量的值,如果没有定义,则尝试从其他的数据源中获取变量的值,例如对于openstac来讲,可以从metadata service(http://169.254.169.254/latest/meta-data/hostname)获取虚拟机的主机名。
(3)运行流程
cloudinit会在虚拟机启动的过程中分四个阶段运行,按照时间顺序分为:cloud-init-local, cloud-init, cloud-config, cloud-final,例如对于centos:
cloud-init-local阶段主要是运行本地的一些初始化脚本(缓存下来的脚本??)
cloud-init阶段执行配置文件中名为cloud_init_modules下的所有模块,如果模块列表为空,则什么都不运行。其他两个阶段类似,就不介绍了。
分阶段执行的必要性在于,有些模块的执行对系统当前的状态会有要求(比如网络ready、文件系统挂载over),因此cloudinit抽象出了四个阶段,编写自己的初始化模块时可以根据情况归入不同的阶段。
另外,模块有多种运行模式,包括per-once、per-instance、per-always,对于模式为per-once的模块,一旦运行完毕会在一个名为sem的目录中创建一个信号文件,从而防止模块的在下次启动时重复运行。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)