http://cloudinit.readthedocs.io/en/latest/topics/examples.html
介绍:
cloud-init是专为云环境中虚拟机的初始化而开发的工具,它从各种数据源读取相关数据并据此对虚拟机进行配置。
向一台数据服务器获取元数据(meta data)和用户数据(user data),前者是指VM的必要信息,
如主机名、网络地址等;后者是系统或用户需要的数据和文件,如用户组信息、启动脚本等。
当cloud-init获取这些信息后,开始使用一些模块对数据进行处理,如新建用户、启动脚本等。常见的配置包括:设定虚拟机的hostname、hosts文件、设定用户名密码、更新apt -get的本地缓存、调整文件系统的大小(注意不是调整分区的大小)等。
工作原理:
首先,数据服务器开启HTTP服务,cloud-init会向数据服务器发送请求,确认数据源模块,依次获取版本、数据类型和具体数据内容信息。
功能:
用户可配置性
可以通过用户数据配置Cloud-init的行为。
用户数据可以给用户在实例启动时输出
例如,这可以通过--user-data或--user-data-file参数到ec2-run-instances
特征
设置默认域
设置一个实例的主机名
生成实例SSH秘钥
将SSH密钥添加到用户的.ssh / authorized_keys,以便他们可以登录
设置临时挂载点
配置网络设备
可用性:
它目前安装在Ubuntu Cloud Images中,还有在EC2,Azure,GCE和许多其他云端上提供的官方Ubuntu映像。
支持诸多linux发行版本,ubuntu、fedora、debian、rhel、centos等等
Gzip压缩:
发现gzip压缩的内容将被解压缩。 然后将使用未压缩的数据,如同未压缩的数据一样。
这通常是有用的,因为用户数据被限制在〜16384 [1]个字节。
用户数据:
配置文件(Cloud Config Data),类型为Content-Type: text/cloud-config,系统配置文件,如管理用户等,与/etc/cloud下的cloud.cfg最后合并配置项
启动任务(Upstart Job),类型为Content-Type: text/upstart-job,建立Upstart的服务
用户数据脚本(User-Data Script),类型为Content-Type: text/x-shellscript,用户自定义的脚本,在启动时执行
包含文件(Include File),类型为Content-Type: text/x-include-url,该文件内容是一个链接,这个链接的内容是一个文件, (Cloud Boothook),类型为Content-Type: text/cloud-boothook
压缩内容( Gzip Compressed Content),
处理句柄(Part Handler),类型为Content-Type: text/part-handler,内容为python脚本,根据用户数据文件的类型做相应的处理
多部分存档(Mime Multi Part archive),当客户端需要下载多个上述用户数据文件时,可用Mime编码为Mime Multi Part archive一次下载
目录结构:
启动阶段:
Generator
Local
Network
Config
Final
当在systemd下引导时,将运行一个生成器,以确定cloud-init.target是否应包含在引导目标中。
默认情况下,此生成器将启用cloud-init。 它不会启用cloud-init,如果:
Generator:
当在systemd下引导时,将运行一个生成器,以确定cloud-init.target是否应包含在引导目标中。
默认情况下,此生成器将启用cloud-init。 它不会启用cloud-init,如果:A file exists: /etc/cloud/cloud-init.disabled
/proc/cmdline contains cloud-init=disabled
local:
cloud-init-local.service
找到本地的数据源
对系统应用及网络进行配置
网络配置:
数据源
网卡dhcp
禁用网络
Network:
cloud-init.service
http
解压gzip
格式化磁盘、分区
bootcmd
Config:
cloud-config.service
配置模块modules
Final:
cloud-final.service
启动最后阶段rc.local
包的安装
配置管理插件、chef、puppet
用户脚本,runcmd
数据源:
数据源是cloud-init的配置数据源,通常来自用户(也称为用户数据)或来自创建配置驱动器(也称为元数据)的堆栈。
型的用户数据将包括文件,yaml和shell脚本,而典型的元数据将包括服务器名称,实例ID,
显示名称和其他云具体细节。
由于有多种方式来提供这些数据(每个云解决方案似乎都喜欢自己的方式)内部创建了一个数据源抽象类,
以允许单一方式访问不同的云系统方法,以通过典型的子类使用提供此数据。
支持的方式:
Alt Cloud:
RHEVm
vSphere
Azure
CloudSigma
CloudStack
Config Drive
Digital Ocean
Amazon EC2
MAAS
NoCloud
OpenNebula
OVF
SmartOS Datasource
OpenStack:
metadata_urls http://169.254.169.254返回200ok
max_wait default 1
timeout default 10
retries default 5重试次数
#cloud-config
datasource:
OpenStack:
metadata_urls: ["http://169.254.169.254"]
max_wait: -1
timeout: 10
retries: 5
Logging:
支持本地和远程日志记录是通过 python 的内置-在日志记录配置并通过云 init rsyslog 模块可配置、
默认cloud-init将其输出配置从/etc/cloud/cloud.cfg.d/05_logging.cfg加载
默认配置将stdout和stderr从所有cloud-init阶段引导到/var/log/cloud-init-output.log
Modules:
Apt Configure配置ubuntu 源列表
Bootcmd:在引导过程的早期运行命令,用于在引导过程中不能完成的
Byobu:该模块控制是否启用或禁用系统范围以及默认系统用户
CA Certs:添加CA证书
Chef:安装chef client
Debug:帮助调试内部数据结构
Disable EC2 Metadata:默认禁用,该模块通过拒绝发送到169.254.169.254的路由,从而禁用ec2数据源。
Disk Setup:配置分区和文件系统
Emit Upstart:发出启动配置,不需要配置
Fan:配置ubuntu网络
Final Message:当cloud-init完成时输出最终消息
version: cloud-init version版本
timestamp: time at cloud-init finish 完成耗时
datasource: cloud-init data source源数据
uptime: system uptime系统运行时间
Foo:示例显示模块结构,不做任何事情
Growpart:调整分区大小以填充可用磁盘空间
growpart:
mode: auto
devices: ["/"]
ignore_growroot_disabled: false
Grub Dpkg:配置哪个设备用作grub安装的目标,默认情况下,此模块应正常工作无须配置。
Keys to Console:控制哪些ssh密钥可以写入控制台
出于安全考虑,可能不希望将ssh指纹和密钥写入控制台。
为了避免将ssh键的类型指纹写入控制台,可以使用ssh_fp_console_blacklist配置密钥。
默认情况下,所有类型的键都将其指纹写入控制台。
为了避免将密钥类型的密钥写入控制台,可以使用ssh_key_console_blacklist配置密钥。
默认情况下,ssh-dss键不会写入控制台
Landscape:
Locale:配置系统区域设置并系统应用
LXD:
Mcollective:
Migrator:该模块处理将旧版本的cloud-init数据移动到较新版本
Mounts:配置挂载点和交换文件
NTP:处理ntp配置
ntp:
pools:
- 0.company.pool.ntp.org
- 1.company.pool.ntp.org
- ntp.myorg.org
servers:
- my.ntp.server.local
- ntp.ubuntu.com
- 192.168.23.2
Package Update Upgrade Install:
更新,升级和安装软件包
此模块允许在引导期间更新,升级或安装软件包
如果要安装任何软件包或执行升级,那么软件包缓存将首先更新。
如果软件包安装或升级需要重新启动,则如果指定了package_reboot_if_required,则可以执行重新启动。
可以提供要安装的软件包的列表。
列表中的每个条目可以是包名称或具有两个条目的列表,第一个是包名称,第二个是要安装的特定包版本。
Phone Home:
引导完成后,该模块可用于将数据发布到远程主机, 可以发布所有数据或发布的密钥列表。
Power State Change:
改变电源状态
所有配置模块都运行后,该模块处理关机/重新启动。
Puppet:
安装、配置puppet
Resizefs:调;整文件系统的大小以使用分区上的所有可用空间。
Resolv Conf:
manage_resolv_conf: <true/false>
resolv_conf:
nameservers: ['8.8.4.4', '8.8.8.8']
searchdomains:
- foo.example.com
- bar.example.com
domain: example.com
options:
rotate: <true/false>
timeout: 1
Debian / Ubuntu默认情况下会使用resovlconf,同样的RedHat也会使用sysconfig
RedHat Subscription:
通过用户名和密码或激活和组织注册一个RedHat系统
Rsyslog:
此模块使用rsyslog配置远程系统日志记录
Runcmd:
在类似级别的rc.local上运行任意命令,并输出到控制台
所有的命令必须是正确的yaml,因此您必须引用yaml所符合的任何字符
runcmd:
- [ ls, -l, / ]
- [ sh, -xc, "echo $(date) ': hello world!'" ]
- [ sh, -c, echo "=========hello world'=========" ]
- ls -l /root
- [ wget, "http://example.org", -O, /tmp/index.html ]
如果项目是一个列表,它将被正确执行,就好像传递给execve()(以第一个arg为命令)。
如果项目是一个字符串,它将被写入一个文件并使用sh进行解释
Salt Minion:配置公钥和私钥
Scripts Per Boot:运行启动脚本
数据源中的scripts / per-boot目录中的任何脚本都将在系统引导时运行。
Scripts Per Instance:实例运行脚本,系统引导时运行
Scripts Per Once:运行一次脚本
Scripts User:运行用户脚本
该模块运行所有用户脚本。
用户脚本未在数据源中的scripts目录中指定,而是存在于实例配置中的脚本目录中。
Scripts Vendor:数据源中脚本/供应商目录中的任何脚本将在首次引导新实例时运行。
Seed Random:生成随机秘钥
Set Hostname:设置主机名和fqdn
Set Passwords:设置系统密码,启用或禁用ssh密码认证。
chpasswd配置密钥接受一个包含两个密钥中的一个的字典,即过期或列表。
如果expire被指定并设置为false,那么将使用password全局配置密钥作为所有用户帐户的密码。
如果指定了过期密钥,并设置为true,则用户密码将过期,从而防止使用默认系统密码。
ssh_pwauth: <yes/no/unchanged>
password: password1
chpasswd:
expire: <true/false>
chpasswd:
list: |
user1:password1
user2:RANDOM
user3:password3
user4:R
##
# or as yaml list
##
chpasswd:
list:
- user1:password1
- user2:RANDOM
- user3:password3
- user4:R
- user4:$6$rL..$ej...
SSH:该模块处理ssh和ssh密钥的大部分配置
SSH Authkey Fingerprints:为每个用户写入授权密钥的指纹记录日志
SSH Import Id:此模块通过公钥钥匙服务器(通常是启动板或github)使用ssh-import-id导入ssh密钥
Timezone:设置系统时区
timezone: <timezone>
Update Etc Hosts:更新/etc/hosts
该模块将根据config中指定的主机名/ fqdn更新/ etc / hosts的内容。
/ etc / hosts的管理使用manage_etc_hosts进行控制。
如果设置为false,则cloud-init将不会管理/ etc / hosts
如果设置为true或template,cloud-init将使用位于/etc/cloud/templates/hosts.tmpl中的模板生成/ etc / hosts。
如果manage_etc_hosts设置为localhost,那么cloud-init将不会完全重写/ etc / hosts,而是确保/ etc / hosts中存在具有ip 127.0.1.1的fqdn的条目
manage_etc_hosts: <true/"template"/false/"localhost">
fqdn: <fqdn>
hostname: <fqdn/hostname>
Update Hostname:该模块将更新系统主机名和fqdn。
preserve_hostname: <true/false>
fqdn: <fqdn>
hostname: <fqdn/hostname>
Users and Groups:配置用户和组
groups:
- <group>: [<user>, <user>]
- <group>
users:
- default
- name: <username>
expiredate: <date>
gecos: <comment>
groups: <additional groups>
homedir: <home directory>
inactive: <true/false>
lock_passwd: <true/false>
no-create-home: <true/false>
no-log-init: <true/false>
no-user-group: <true/false>
passwd: <password>
primary-group: <primary group>
selinux-user: <selinux username>
shell: <shell path>
snapuser: <email>
ssh-authorized-keys:
- <key>
- <key>
ssh-import-id: <id>
sudo: <sudo config>
system: <true/false>
uid: <user id>
Write Files:
将任意内容写入文件,可选择设置权限。 内容可以用纯文本或二进制格式指定。
可以指定使用base64或二进制gzip数据编码的数据,并在写入之前对其进行解码。
write_files:
- encoding: b64
content: CiMgVGhpcyBmaWxlIGNvbnRyb2xzIHRoZSBzdGF0ZSBvZiBTRUxpbnV4...
owner: root:root
path: /etc/sysconfig/selinux
permissions: '0644'
- content: |
# My new /etc/sysconfig/samba file
SMDBOPTIONS="-D"
path: /etc/sysconfig/samba
- content: !!binary |
f0VMRgIBAQAAAAAAAAAAAAIAPgABAAAAwARAAAAAAABAAAAAAAAAAJAVAAAAAA
AEAAHgAdAAYAAAAFAAAAQAAAAAAAAABAAEAAAAAAAEAAQAAAAAAAwAEAAAAAAA
AAAAAAAAAwAAAAQAAAAAAgAAAAAAAAACQAAAAAAAAAJAAAAAAAAcAAAAAAAAAB
...
path: /bin/arch
permissions: '0555'
Yum Add Repo:
将yum存储库配置添加到/etc/yum.repos.d。
yum_repos:
<repo-name>:
baseurl: <repo url>
name: <repo name>
enabled: <true/false>