cloud-init是linux的一个工具,当系统启动时,cloud-init可从nova metadata服务或者config drive中获取元数据,完成包括但不限于下面的定制化工作:
-
设置默认语言环境
-
设置主机名
-
添加ssh键到.ssh / authorized_keys
-
设置用户密码
-
配置网络
-
安装软件包
为了实现instance定制工作,cloud-init会按4个阶段执行任务:
-
本地
-
在里面
-
配置
-
最后
cloud-init安装时会将这4个阶段执行的任务以服务的形式注册到系统中,比如在systemd的环境下,我们能够看到这4个阶段分别对应的服务:
-
local - cloud-init-local.service
-
init - cloud-init.service
-
config - cloud-config.service
-
final - cloud-final.service
当地阶段
作为cloud-init执行的第一个阶段,此时实例还不知道该如何配置网卡,cloud-init的任务就是从配置驱动中获取配置信息,然后写入/ etc / network / interfaces文件(如果是centos则写入/ etc / sysconfig / network-scripts / ifcfg-xxx)。
如果没有配置驱动,则将所有网卡配置成dhcp模式。这是非常关键的一步,只有当网卡正确配置后,才能获取到元数据。
关于local阶段下一节会通过实验详细分析。
init,config和final阶段
正常情况下,在这三个阶段执行之前实例网络已经配置好了,并且已经成功获取到metadata.cloud-init的配置文件/etc/cloud/cloud.cfg定义了三个阶段分别要执行的任务,任务以模形式指定。
instance真正的定制工作就是由这些模块完成的.module决定做哪些定制化工作,而元则则决定最终定制化的结果。
举个例子,如果cloud.cfg中指定了 set_hostname
这个模块,则意味着cloud-int会设置instance的主机名,而具体设置成哪个主机名则由元数据中 hostname
参数决定。
有些模块是有默认行为的,比如 growpart
,如果元数据中没有特别指定,它会自动扩展 /
分区。
由于篇幅限制,这里就不一一讨论每个模块了,具体可参阅文档 https://cloudinit.readthedocs.io/en/latest/topics/modules.html
后面我们会讨论cloud-init典型的使用场景,其中也会涉及常用模块的示例
摘自“每天
5分钟玩转OpenStack
”