openstack-cloudinit

357 阅读2分钟

1. 官方文档:

cloudinit.readthedocs.io/en/latest/t…

2. 配置运行

  1. 相关文件
  • 配置文件:

    /etc/cloud/cloud.cfg

  • 运行数据:

    /var/lib/cloud

    confg-driver盘:/dev/vdb 64M

  • 日志文件:

    /var/log/cloud.log

  1. 安装: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
  1. 大致运行步骤: 为了实现 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)
  1. 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. 源码分析:

  1. 程序入口: cloudinit/cmd/main.py
  2. 运行代码:main_init函数中 stage1-7为local阶段进行网络配置 stage10为network,config,final阶段执行cloud.cfg中定义的模块,具体执行脚本如左侧cc_xxx.py