searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Cloud-init简介

2023-10-09 08:13:26
482
0

Cloud-init简介

参考文档:cloud-init17.1官方文档

1 cloud-init概述

cloud-init(简称ci)在AWS、Openstack和Cloudstack上都有使用,所以应该算是事实上的云主机元数据管理标准。 cloud-init 是云上linux系统的一个配置工具,当系统启动时,cloud-init 可从云的datasource中获取 metadata,完成包括但不限于下面的定制化工作:

  • 设置主机名
  • 配置语言、时区
  • 配置网络
  • 配置SSH
  • 设置密码
  • 安装软件包
  • 扩展磁盘分区和文件系统
  • 执行定制化脚本

2 cloud-init基本概念

metadata:cloud-init初始化依赖的数据,比如要设置成什么hostname,网络详细信息如ip、掩码、dns,密码等是由nova提供的,这些数据我们称之为元数据(metadata) 。

datasource:数据来源。元数据存在的载体我们叫做datasource。比如nova可以将这些元数据放到一个iso里,以cdrom的形式挂载到虚拟机上,我们把这样的iso叫做configdrive,configdrive就是一种datasource;同样的,nova还支持通过网路地址的方式访问nova api获取到metadata,这样的方式叫做metadata service,metadata service也是一种datasource。简而言之,datasource就是包含metadata的一种媒介。

userdata: metadata是openstack根据虚拟机实际情况自动生成的,但有时候用户需要一些自定义的数据,例如创建虚拟机时,自动创建一个XXX用户等操作,就需要通过userdata的方式传到虚拟机里。userdata的载体也是datasource。

3 cloud-init工作原理

cloud-init包含四个服务,分别启动在开机过程的不同阶段。

  • cloud-init-local.service: 在网络启动之前启动该服务,用于寻找datasource,配置网络,配置user-data,运行指定plugin。
  • cloud-init.service: 在网络启动之后启动该服务,用于寻找datasource,配置网络,配置user-data,运行指定plugin。
  • cloud-config.service: 在cloud-init服务启动之后启动,运行指定plugin。
  • cloud-final.service: 在rc.local服务启动之后启动,几乎处在开机过程的结束阶段,比较靠后,运行指定plugin。

4 cloud-init服务

cloud-init有四个服务,按启动先后顺序依次为

  1. cloud-init-local.service
  2. cloud-init.service
  3. cloud-config.service
  4. cloud-final.service

cloud-init-local.service:从configdrive里获取datasource,配置网络,并运行cloud-init配置文件里"cloud_init_modules"部分的模块。

cloud-init.service:从nova的metadata service里获取datasource,配置网络,并运行cloud-init配置文件里"cloud_init_modules"部分的模块。

cloud-config.service: 运行cloud-init配置文件里"cloud_config_modules"部分的模块。

cloud-final.service: 运行cloud-init配置文件里"cloud_final_modules"部分的模块。

5 cloud-init配置文件

cloud-init的配置文件主要包括/etc/cloud/cloud.cfg, /etc/cloud/cloud.cfg.d/*,/var/lib/cloud/instance/cloud-config.txt等。其中,/etc/cloud/cloud.cfg,是一个yaml格式的配置文件。其内容部分如下所示:

users:
 - default

disable_root: 0
ssh_pwauth:   1
......

cloud_init_modules:
 - resolv-conf
 - migrator
 - bootcmd
 - write-files
 - growpart
 - resizefs
 - set_hostname
 - update_etc_hosts
 - rsyslog
 - users-groups
 - ssh
......

cloud_config_modules:
 - locale
 - set-passwords
 - rh_subscription
......

cloud_final_modules:
 - rightscale_userdata
 - scripts-per-once
 - scripts-per-boot
 - scripts-per-instance
 - scripts-user
......

datasource_list: [ ConfigDrive,OpenStack ]
datasource:
  ConfigDrive:
    dsmode: local
  OpenStack:
    metadata_urls: ["xxxxxx"]
    max_wait: 120
    timeout: 10
    retries: 5

6 cloud-init缓存目录

cloud-init在运行过一次之后,会在/var/lib/cloud/生成缓存目录。目录里用来记录datasource和metadata信息、模块的运行记录以及用户的自定义脚本等等。

7 datasource结构介绍

以configdrive为例,openstack云平台里启动一个虚拟机之后,执行"lsblk"可以查看虚拟机有个cdrom,我们对该cdrom进行挂载,发现其内部结构如下:

metadata信息存放在/mnt/openstack/latest/目录之下的文件里。其中:

  • meta_data.json 记录了虚拟机的基本metadata,包含了主机名、uuid等信息。
  • network_data.json 记录了虚拟机的网络信息。
  • user_data 记录了用户传入的user data。
  • vendor_data.json 记录了厂商信息,我们一般用不到这个文件。

8 cloud-init如何设置网络

cloud-init是通过cloud-init-local.service中配置网络的,网络的配置依赖于configdrive,如果没有configdrive,cloud-init-local.service会生成一个dhcp方式的网卡eth0的配置文件,以保证后面的初始化过程可以访问nova metadata service。

当使用configdrive时,cloud-init会读取network_data.json,并根据mac地址和本地的网卡设备互相匹配,然后生成网卡配置文件。注意:cloud-init配置网络只会在每个实例首次开机时配置一次,后续不会再配置网络。

9 cloud-init如何禁用网络配置

如果想禁止cloud-init修改网络配置文件(比如用户作镜像时已经配死了网络,不希望别人修改),那么可以在/etc/cloud.cfg.d/里新建一个名为"99-disable-network-config.cfg"的配置文件,内容如下:

99-disable-network-config.cfg network: {config: disabled}

或者在/etc/cloud/cloud.cfg中配置

network:  
  config: disabled

10 cloud-init如何进行自动扩盘和文件系统

cloud-init扩展分区是通过"growpart"模块来做的,分区扩展后,文件系统的扩展是通过"resizefs"模块来做的,这两个模块都位于/etc/cloud/cloud.cfg的"cloud_init_modules"部分。

说明:

  1. "growpart"模块依赖于growpart的命令,对centos7以上的系统,需要安装cloud-utils-growpart包;对centos6而言,要安装"linux-rootfs-resize-master.zip"包;对ubuntu16.04而言,要安装cloud-utils包,没有这些包,无法对系统分区进行扩展。
  2. growpart默认只能扩展"/"分区,而且"/"分区必须位于磁盘的最末一个分区。否则也无法扩展磁盘,或者需要手动修改/etc/cloud/cloud.cfg文件。

 

0条评论
0 / 1000
l****n
2文章数
0粉丝数
l****n
2 文章 | 0 粉丝
l****n
2文章数
0粉丝数
l****n
2 文章 | 0 粉丝
原创

Cloud-init简介

2023-10-09 08:13:26
482
0

Cloud-init简介

参考文档:cloud-init17.1官方文档

1 cloud-init概述

cloud-init(简称ci)在AWS、Openstack和Cloudstack上都有使用,所以应该算是事实上的云主机元数据管理标准。 cloud-init 是云上linux系统的一个配置工具,当系统启动时,cloud-init 可从云的datasource中获取 metadata,完成包括但不限于下面的定制化工作:

  • 设置主机名
  • 配置语言、时区
  • 配置网络
  • 配置SSH
  • 设置密码
  • 安装软件包
  • 扩展磁盘分区和文件系统
  • 执行定制化脚本

2 cloud-init基本概念

metadata:cloud-init初始化依赖的数据,比如要设置成什么hostname,网络详细信息如ip、掩码、dns,密码等是由nova提供的,这些数据我们称之为元数据(metadata) 。

datasource:数据来源。元数据存在的载体我们叫做datasource。比如nova可以将这些元数据放到一个iso里,以cdrom的形式挂载到虚拟机上,我们把这样的iso叫做configdrive,configdrive就是一种datasource;同样的,nova还支持通过网路地址的方式访问nova api获取到metadata,这样的方式叫做metadata service,metadata service也是一种datasource。简而言之,datasource就是包含metadata的一种媒介。

userdata: metadata是openstack根据虚拟机实际情况自动生成的,但有时候用户需要一些自定义的数据,例如创建虚拟机时,自动创建一个XXX用户等操作,就需要通过userdata的方式传到虚拟机里。userdata的载体也是datasource。

3 cloud-init工作原理

cloud-init包含四个服务,分别启动在开机过程的不同阶段。

  • cloud-init-local.service: 在网络启动之前启动该服务,用于寻找datasource,配置网络,配置user-data,运行指定plugin。
  • cloud-init.service: 在网络启动之后启动该服务,用于寻找datasource,配置网络,配置user-data,运行指定plugin。
  • cloud-config.service: 在cloud-init服务启动之后启动,运行指定plugin。
  • cloud-final.service: 在rc.local服务启动之后启动,几乎处在开机过程的结束阶段,比较靠后,运行指定plugin。

4 cloud-init服务

cloud-init有四个服务,按启动先后顺序依次为

  1. cloud-init-local.service
  2. cloud-init.service
  3. cloud-config.service
  4. cloud-final.service

cloud-init-local.service:从configdrive里获取datasource,配置网络,并运行cloud-init配置文件里"cloud_init_modules"部分的模块。

cloud-init.service:从nova的metadata service里获取datasource,配置网络,并运行cloud-init配置文件里"cloud_init_modules"部分的模块。

cloud-config.service: 运行cloud-init配置文件里"cloud_config_modules"部分的模块。

cloud-final.service: 运行cloud-init配置文件里"cloud_final_modules"部分的模块。

5 cloud-init配置文件

cloud-init的配置文件主要包括/etc/cloud/cloud.cfg, /etc/cloud/cloud.cfg.d/*,/var/lib/cloud/instance/cloud-config.txt等。其中,/etc/cloud/cloud.cfg,是一个yaml格式的配置文件。其内容部分如下所示:

users:
 - default

disable_root: 0
ssh_pwauth:   1
......

cloud_init_modules:
 - resolv-conf
 - migrator
 - bootcmd
 - write-files
 - growpart
 - resizefs
 - set_hostname
 - update_etc_hosts
 - rsyslog
 - users-groups
 - ssh
......

cloud_config_modules:
 - locale
 - set-passwords
 - rh_subscription
......

cloud_final_modules:
 - rightscale_userdata
 - scripts-per-once
 - scripts-per-boot
 - scripts-per-instance
 - scripts-user
......

datasource_list: [ ConfigDrive,OpenStack ]
datasource:
  ConfigDrive:
    dsmode: local
  OpenStack:
    metadata_urls: ["xxxxxx"]
    max_wait: 120
    timeout: 10
    retries: 5

6 cloud-init缓存目录

cloud-init在运行过一次之后,会在/var/lib/cloud/生成缓存目录。目录里用来记录datasource和metadata信息、模块的运行记录以及用户的自定义脚本等等。

7 datasource结构介绍

以configdrive为例,openstack云平台里启动一个虚拟机之后,执行"lsblk"可以查看虚拟机有个cdrom,我们对该cdrom进行挂载,发现其内部结构如下:

metadata信息存放在/mnt/openstack/latest/目录之下的文件里。其中:

  • meta_data.json 记录了虚拟机的基本metadata,包含了主机名、uuid等信息。
  • network_data.json 记录了虚拟机的网络信息。
  • user_data 记录了用户传入的user data。
  • vendor_data.json 记录了厂商信息,我们一般用不到这个文件。

8 cloud-init如何设置网络

cloud-init是通过cloud-init-local.service中配置网络的,网络的配置依赖于configdrive,如果没有configdrive,cloud-init-local.service会生成一个dhcp方式的网卡eth0的配置文件,以保证后面的初始化过程可以访问nova metadata service。

当使用configdrive时,cloud-init会读取network_data.json,并根据mac地址和本地的网卡设备互相匹配,然后生成网卡配置文件。注意:cloud-init配置网络只会在每个实例首次开机时配置一次,后续不会再配置网络。

9 cloud-init如何禁用网络配置

如果想禁止cloud-init修改网络配置文件(比如用户作镜像时已经配死了网络,不希望别人修改),那么可以在/etc/cloud.cfg.d/里新建一个名为"99-disable-network-config.cfg"的配置文件,内容如下:

99-disable-network-config.cfg network: {config: disabled}

或者在/etc/cloud/cloud.cfg中配置

network:  
  config: disabled

10 cloud-init如何进行自动扩盘和文件系统

cloud-init扩展分区是通过"growpart"模块来做的,分区扩展后,文件系统的扩展是通过"resizefs"模块来做的,这两个模块都位于/etc/cloud/cloud.cfg的"cloud_init_modules"部分。

说明:

  1. "growpart"模块依赖于growpart的命令,对centos7以上的系统,需要安装cloud-utils-growpart包;对centos6而言,要安装"linux-rootfs-resize-master.zip"包;对ubuntu16.04而言,要安装cloud-utils包,没有这些包,无法对系统分区进行扩展。
  2. growpart默认只能扩展"/"分区,而且"/"分区必须位于磁盘的最末一个分区。否则也无法扩展磁盘,或者需要手动修改/etc/cloud/cloud.cfg文件。

 

文章来自个人专栏
Star's Daily Blog
2 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0