1. 官方文档:
cloudinit.readthedocs.io/en/latest/t…
2. 配置运行
- 相关文件
-
配置文件:
/etc/cloud/cloud.cfg
-
运行数据:
/var/lib/cloud
confg-driver盘:/dev/vdb 64M
-
日志文件:
/var/log/cloud.log
- 安装:rpm安装 cloud-init 安装时会将这 4个阶段执行的任务以服务的形式注册到系统中,比如在 systemd 的环境下,我们能够看到这4个阶段分别对应的服务:
- local - cloud-init-local.service
- nework - cloud-init.service
- config - cloud-config.service
- final - cloud-final.service 这些服务是一次性进程, 即systemd启动之后这些进程或者命令只会执行一次, 不会以常驻进程存在。各个service的启动命令如下:
- cloud-init-local.service: /usr/bin/cloud-init init --local ; /bin/touch /run/cloud-init/network-config-ready
- cloud-init.service: /usr/bin/cloud-init init
- cloud-config.service: /usr/bin/cloud-init modules --mode=config
- cloud-final.service: /usr/bin/cloud-init modules --mode=final
- 大致运行步骤: 为了实现 instance 定制工作,cloud-init 会主要按 4个阶段执行任务(事实上还有一个generator阶段只有在systemd管理下才会触发,这里不做叙述):
- Local: 作为 cloud-init 执行的第一个阶段,此时 instance 还不知道该如何配置网卡,cloud-init 的任务就是从 config drive 中获取配置信息,然后写入 /etc/network/interfaces 文件(如果是 centos 则写入 /etc/sysconfig/network-scripts/ifcfg-xxx)。如果没有 config drive,则将所有网卡配置成 dhcp 模式。这是非常关键的一步,只有当网卡正确配置后,才能获取到 metadata。
- Network (执行cloud.cfg中的cloud_init_modules)
- Config (执行cloud.cfg中的cloud_config_modules)
- Final (执行cloud.cfg中的cloud_final_modules)
- cloud.cfg例子:
users:
- default
disable_root: 1
ssh_pwauth: 0
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
- rh_subscription
- 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
- power-state-change
system_info:
default_user:
name: centos
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
preserve_hostname: false
manage_etc_hosts: true
4. 源码分析:
- 程序入口: cloudinit/cmd/main.py
- 运行代码:main_init函数中
stage1-7为local阶段进行网络配置
stage10为network,config,final阶段执行cloud.cfg中定义的模块,具体执行脚本如左侧cc_xxx.py