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

  1. 设置 default locale

  2. 设置 hostname

  3. 添加 ssh keys到 .ssh/authorized_keys

  4. 设置用户密码

  5. 配置网络

  6. 安装软件包

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

  1. local

  2. init

  3. config

  4. final

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

local 阶段

作为 cloud-init 执行的第一个阶段,此时 instance 还不知道该如何配置网卡,cloud-init 的任务就是从 config drive 中获取配置信息,然后写入 /etc/network/interfaces 文件(如果是 centos 则写入 /etc/sysconfig/network-scripts/ifcfg-xxx)。

如果没有 config drive,则将所有网卡配置成 dhcp 模式。这是非常关键的一步,只有当网卡正确配置后,才能获取到 metadata。

关于 local 阶段下一节会通过实验详细分析。

init, config 和 final 阶段

正常情况下,在这三个阶段执行之前 instance 网络已经配置好了,并且已经成功获取到 metadata。cloud-init 的配置文件 /etc/cloud/cloud.cfg 定义了三个阶段分别要执行的任务,任务以 module 形式指定。

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

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

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

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

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

cloud-init 工作原理 - 每天5分钟玩转 OpenStack(171)的更多相关文章

  1. Neutron Router 工作原理 - 每天5分钟玩转 OpenStack(142)

    上一节我们创建了 router 连通了 vlan100 和 vlan101, 今天分析router是如何工作的.首先查看控制节点的网络结构发生了什么变化: br-int 上多了两个 port: 1. ...

  2. L2 Population 原理 - 每天5分钟玩转 OpenStack(113)

    前面我们学习了 VXLAN,今天讨论跟 VXLAN 紧密相关的 L2 Population. L2 Population 是用来提高 VXLAN 网络 Scalability 的. 通常我们说某个系统 ...

  3. Neutron Vlan Network 原理- 每天5分钟玩转 OpenStack(92)

    前面我们陆续学习了 Neutron local network,flat network 和 DHCP 服务,从本节将开始讨论 vlan network. vlan network 是带 tag 的网 ...

  4. CPU 和内存虚拟化原理 - 每天5分钟玩转 OpenStack(6)

    前面我们成功地把 KVM 跑起来了,有了些感性认识,这个对于初学者非常重要.不过还不够,我们多少得了解一些 KVM 的实现机制,这对以后的工作会有帮助. CPU 虚拟化 KVM 的虚拟化是需要 CPU ...

  5. Service IP 原理 - 每天5分钟玩转 Docker 容器技术(137)

    Service Cluster IP 是一个虚拟 IP,是由 Kubernetes 节点上的 iptables 规则管理的. 可以通过 iptables-save 命令打印出当前节点的 iptable ...

  6. 每天5分钟 玩转OpenStack 目录列表

    最近在学习 OpenStack 的相关知识,一直苦于 OpenStack 的体系庞大以及复杂程度,学习没有进度,停滞不前.偶然机会在 51CTO 上发现了一个热点的专题关于 OpenStack 的,题 ...

  7. 写在最前面 - 每天5分钟玩转 OpenStack(1)

    <每天5分钟玩转 OpenStack>是一个 OpenStack 教程,这是第 1 篇. 这个教程有下面两个特点: 系统讲解 OpenStack 从架构到各个组件:从整体到细节逐一讨论 重 ...

  8. floating IP 原理分析 - 每天5分钟玩转 OpenStack(107)

    上一节我们通过 Web UI 创建为 cirros-vm3 分配了浮动 IP,今天将分析其工作原理. 首先查看 router 的 interface 配置: 可以看到,floating IP 已经配置 ...

  9. 学习 OpenStack 的方法论 - 每天5分钟玩转 OpenStack(150)

    作为 OpenStack 的核心教程,我们已经到了最后总结的部分. OpenStack 目前已经有好几十个模块,本教程讨论的是最最重要的核心模块:Keystone,Nova,Glance,Cinder ...

随机推荐

  1. JSON - Qt 对 JSON的处理

    1.关于JSON的介绍参考www.json.org Qt提供处理JSON数据的支持.QJSonObject类用于封装JSON object:QJsonDocument类提供读写JSON文档的方法:QJ ...

  2. js设计模式--单体模式

    GOF里的23种设计模式, 也是在软件开发中早就存在并反复使用的模式. 如果程序员没有明确意识到他使用过某些模式, 那么下次他也许会错过更合适的设计 (这段话来自<松本行弘的程序世界>). ...

  3. path和classpath的用途

    1 path很明显是unix shell的环境变量,比如bash shell,输入一个命令,它会先去path指定的目录下查找是不是有该命令的可执行文件. 2 -classpath 只是用在下面这种不发 ...

  4. ionic接入广告

    一.获取Admob phonegap 广告插件(cordova 广告平台插件) 在cordova 和phonegap等html5手机应用里面展示Admob,百度移动联盟,广点通广告需要Cordova ...

  5. 深入了解Unity中LineRenderer与TrailRenderer

    LineRender和TrailRender是两个好东西,很多Unity拖尾特效都会使用到它们.一些简单的介绍可以参见官方的API文档.在这里探讨一下它们具体的渲染方式,而后给出一些Shader以便更 ...

  6. [编织消息框架][设计协议]bit基础

    理论部分 1字节等于8比特,也就是8个二进数,如下面公式 1Byte = 8bits = 0111 1111 1Short = 2Btye 1Int = 4Byte 那学这些有什么用呢? 可以用来做数 ...

  7. angular : direative : autoResize textarea auto resize

    今天为大家推出自己的auto resize 指令功能. 目的:解决textarea在给height的问题. 参考源码:http://monospaced.github.io/angular-elast ...

  8. 未来工厂——电器行业ERP案例

    江苏科兴电器有限公司位于全国著名的“银杏之乡”泰兴市南首,主要生产35kV及以下电流.电压互感器等系列产品.产品多次经国家及省市技术监督部门抽检合格,广泛应用于国家重点工程.“COSINE”商标荣获泰 ...

  9. TimerTask实现定期检查数据库操作

    最近在做一个P2P 的众筹网站,其他的内容还都可以,只是定期检查数库里面的项目是不是到期了,让我费了一些时间,现在写好了,我把它总结下来,以便以后使用.顺便和大家分享一下. Timer可以看成一个定时 ...

  10. MySQL优化四(优化表结构)

    body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...