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>