cloud-init工作原理

cloud-init是linux的一个工具,当系统启动时,cloud-init可从nova metadata服务或者config drive中获取元数据,完成包括但不限于下面的定制化工作:

  1. 设置默认语言环境

  2. 设置主机名

  3. 添加ssh键到.ssh / authorized_keys

  4. 设置用户密码

  5. 配置网络

  6. 安装软件包

为了实现instance定制工作,cloud-init会按4个阶段执行任务:

  1. 本地

  2. 在里面

  3. 配置

  4. 最后

cloud-init安装时会将这4个阶段执行的任务以服务的形式注册到系统中,比如在systemd的环境下,我们能够看到这4个阶段分别对应的服务:

  1. local - cloud-init-local.service

  2. init - cloud-init.service

  3. config - cloud-config.service

  4. final - cloud-final.service

39.5.png

当地阶段


作为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定义了三个阶段分别要执行的任务,任务以模形式指定。

39.6.png

instance真正的定制工作就是由这些模块完成的.module决定做哪些定制化工作,而元则则决定最终定制化的结果。

举个例子,如果cloud.cfg中指定了  set_hostname 这个模块,则意味着cloud-int会设置instance的主机名,而具体设置成哪个主机名则由元数据中  hostname 参数决定。

有些模块是有默认行为的,比如  growpart,如果元数据中没有特别指定,它会自动扩展  / 分区。

由于篇幅限制,这里就不一一讨论每个模块了,具体可参阅文档  https://cloudinit.readthedocs.io/en/latest/topics/modules.html

后面我们会讨论cloud-init典型的使用场景,其中也会涉及常用模块的示例

 

 

摘自“每天

5分钟玩转OpenStack

posted @ 2019-06-24 15:01  那个谁866  阅读(2152)  评论(0编辑  收藏  举报