Cloud init入门 - AaronPei/blog GitHub Wiki

Cloud-init介绍

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

  • 设置 default locale
  • 设置 hostname
  • 添加 ssh keys到 .ssh/authorized_keys
  • 设置用户密码
  • 配置网络
  • 安装软件包

简单的说:将cloud-init的配置构建在镜像中可以让instance启动时完成一系列配置,让你登录即可使用自己想要的系统。

Cloud-init 相关信息

配置文件: /etc/cloud/cloud.cfg 日志:/var/log/cloud-init.log 存放关键数据的目录: /var/lib/cloud/

工作原理

cloudinit分四个阶段执行,具体它们以4个服务的形式注册到系统中按如下顺序依次运行:

  • local - cloud-init-local.service # 从云平台获取配置信息,配置网络等
  • init - cloud-init.service # 系统启动,分区,设置主机名,SSH配置等
  • config - cloud-config.service # 执行一些配置模块
  • final - cloud-final.service # 安装包等,做一些收尾工作

实列介绍

在制作系统镜像的时候会用到cloud.cfg,cloud.cfg这部分步骤很简单,不过要配合镜像构造的要求来配置和使用。 1.安装cloud-init cloud-utils

# centos / Fedora/ redhat 等
yum install cloud-init cloud-utils -y
# or ubuntu等
apt-get install cloud-init cloud-utils -y
  1. 修改cloud-init配置 以下一个完整的虚机cloud-init配置,
$ vim /etc/cloud/cloud.cfg
users:
 - default

disable_root: 0
ssh_pwauth:   1 # 启用密码登录方式
chpasswd:
 list: | # list里可以设置一个用户列表和对应密码
      root:xxxxxx # 默认root用户密码为‘xxxxxx’
 expire: true # instance启动时如果没有注入密码,第一次登录后会提示修改密码

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 # resize文件系统,适配新的大小。 默认对根目录执行
 - disk_setup # disk_setup&mounts两个模块用于分区磁盘和挂载
 - mounts
 - set_hostname # 根据元数据设置主机名
 - update_hostname
 - update_etc_hosts
 - rsyslog
 - users-groups # 根据cloud.cfg的配置创建用户组和用户
 - ssh # 配置sshd

cloud_config_modules:
 - locale
 - set-passwords
 - rh_subscription
 - yum-add-repo
 - package-update-upgrade-install
 - timezone
 - 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

device_aliases: 
  {'ephemeral0': '/dev/vdb'} # 添加/dev/vdb磁盘的别名ephemeral0,此处需注意平台vm的磁盘name
disk_setup:
  ephemeral0:
    table_type: 'gpt' # 设置Disklabel type
    layout: True
    overwrite: True

fs_setup:
  - label: data0
    filesystem: 'ext4'  
    device: '/dev/vdb1'
    partition: 'auto'
    overwrite: True

mounts:
 - [ ephemeral0, null ]
 - [ /dev/vdb1, /data0, "ext4"] # 挂载/dev/vdb1 到/data0目录

system_info:
  default_user: # 设置默认用户为root并可以密码登录
    name: root
    lock_passwd: false 
    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

参考

源码: https://github.com/cloud-init/cloud-init 文档: https://cloudinit.readthedocs.io/en/latest/ cloud-init学习笔记