` cloud-init(一) | 听云轩

cloud-init(一)

    cloud-init是一个支持多操作系统的软件包,用于处理云主机早期的初始化操作,当系统启动时,cloud-init可以在云的datasource中获取metadata(nova metadata服务或者config drive(config drive是一个特殊的文件系统,openstack会将metadata写到config drive,并在instance启动的时候挂载给instance,然后去读metadata)),完成包括但不限于下面所列举的定制化工作:

  • 设置default locale
  • 设置云主机hostname
  • 生成实例的SSH私钥
  • 添加SSH KEYS到.ssh/authorized_keys ,使用户可以登录
  • 设置临时挂载点
  • 设置用户密码
  • 配置网络
  • 安装软件包

GcToIU.png

    从图中可知道相关的一个流程:当cloud-init启动后会去读取源数据,如果配置了dhcp服务,则去nova-metadata中读取,如果没有配置的话就去cloud drive读取;当去metadata里面去读的话默认是从l3-agent里面读取。

注:云主机中lsblk查看块设备,挂载/dev/sr0,进入这个目录可以查看相关文件:

Gc7edf.png

    我们查看日志进行分析:
    第一阶段:扫描文件系统、挂载/dev/sr0,读取数据,卸载、加载config driver、读取文件cloud.cfg。

Gc7Bl9.png

GcHB4S.png

    第二阶段:扫描网卡、配置网卡、写入到文件、配置dns、完成第二阶段

GcHo34.png

GcHqD1.png

    第三阶段:init-network,读取check-cache,调用相关cloud_init_module初始化(主机名初始化,check-cache、consume-user-data、consume-vendor-data、config-migrator、config-bootcmd、config-write-files、config-growpart、config-resizefs、config-set_hostname、config-update_etc_hosts、config-rsyslog、config-users-groups、config-ssh)

GcbAVP.png

Gcbm8g.png

    第四阶段:调用config_modules的相关模块,mounts,locale,set-passwords,yum-add-repo,package-update-upgrade-install,timezone,puppet,chef,salt-minion,mcollective,disable-ec2-metadata,runcmd

GcbdM9.png

    第五阶段:调用final_modules模块,config-rightscale_userdata、config-scripts-per-boot、config-scripts-per-instance、config-scripts-user、config-ssh-authkey-fingerprints、config-keys-to-console、config-phone-home、config-final-message

GcbhqI.png

    cloud-init会在云主机上创建如下的目录结构用来记录相关的信息:

GcqkQJ.png

其中:

  • data目录会记录云主机的instance id,datasource,hostname等信息
  • instances目录下记录了云主机的instance的user-data,cloud-config,用到的datasource,运行的命令等信息。
  • scripts下的per-boot存放运行启动脚本,系统引导时运行;per-once:只运行一次脚本;per-instance:一个实例初始化会执行一次

配置文件cloud.cfg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
users:
- default

disable_root: 0
ssh_pwauth: 1

mount_default_fields: [~, ~, 'auto', 'defaults,nofail', '0', '2']
resize_rootfs_tmp: /dev
ssh_deletekeys: 0
ssh_genkeytypes: ~
syslog_fix_perms: ~

cloud_init_modules:
- migrator
- bootcmd
- write-files
- growpart
- resizefs
- set_hostname
- update_hostname
- update_etc_hosts
- rsyslog
- users-groups
- ssh

cloud_config_modules:
- mounts
- locale
- set-passwords
- yum-add-repo
- package-update-upgrade-install
- timezone
- puppet
- chef
- salt-minion
- mcollective
- disable-ec2-metadata
- runcmd

cloud_final_modules:
- rightscale_userdata
- scripts-per-once
- scripts-per-boot
- scripts-per-instance
- scripts-user
- ssh-authkey-fingerprints
- keys-to-console
- phone-home
- final-message

system_info:
default_user:
name: ec2-user
lock_passwd: true
gecos: Cloud User
groups: [wheel, adm, systemd-journal]
sudo: ["ALL=(ALL) NOPASSWD:ALL"]
shell: /bin/bash
distro: rhel
paths:
cloud_dir: /var/lib/cloud
templates_dir: /etc/cloud/templates
ssh_svcname: sshd

# vim:syntax=yaml

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

  • generator - cloud-config.target
  • local - cloud-init-local.service
  • nework - cloud-init.service
  • config - cloud-config.service
  • final - cloud-final.service

这些进程只会执行一次,不会以常驻进程的形式存在:

  • generator

    读取配置文件cloud.cfg

  • local

    此时instance还不知道该如何配置网卡,cloud-init的任务就是从config drive中获取配置信息,然后写入/etc/network/interfaces文件,如果没有config drive,则将所有网卡配置成dhcp模式,只有当网卡正确配置以后,才能获取到metadata。

  • network

    在local阶段之后,当网络设置完成了才进行这个阶段,这个阶段会调用。两个模块disk_setup,mounts来完成磁盘格式化分区,添加挂载点等操作,另外执行一些系统引导早期可以调用的模块,读取cloud_init_modules模块的指定配置。

  • config

    执行配置模块,读取cloud_config_modules模块的指定配置

  • final

    这个阶段初始化已经基本完成,因此大部分的模块在这个阶段都能正常运行,比如安装软件,运行一些自动化工具,如puppet,salt等,以及用户定义的脚本。

cloud-init传入脚本

比如设置hostname:

1
2
3
#cloud-config
hostname: my1.cloudman.cc
manage_etc_hosts: true

    cloud-init 只会读取以 #cloud-config 开头的数据,所以这一行一定要写对。hostname: http://my1.cloudman.cc 告诉 cloud-init 将 hostname 设置为 http://my1.cloudman.cc。manage_etc_hosts: true 告诉 cloud-init 更新 /etc/hosts 文件。

脚本传递到instance:

  • instance 部署时,直接将其粘贴到 Customization Script 输入框中(社区版)
  • 将其保存为文件,命令行 nova boot 或者 openstack server create 部署 instance 时,使用参数 --user-data 传入。
  • 将其保存为文件进行上传

Gcz89x.png

------ 本文结束 ------
您的支持将鼓励我继续创作