本節介紹幾個 cloud-init 的典型應用:設置 hostanme,設置用戶初始密碼,安裝軟件。
設置 hostname
cloud-init 默認會將 instance 的名字設置為 hostname。但這樣不太方便,有時希望能夠將二者分開,可利用 cloud-init 的set_hostname
模塊實現。set_hostname
它會查詢 metadata 中 hostname 信息,默認值就是 instance 的名字。我們可以指定自己的 hostname,方法是將下面的內容傳給 cloud-init:
#cloud-config
hostname: my1.cloudman.cc
manage_etc_hosts: true
說明如下:
-
cloud-init 只會讀取以
#cloud-config
開頭的數據,所以這一行一定要寫對。 -
hostname: my1.cloudman.cc
告訴 cloud-init 將 hostname 設置為 my1.cloudman.cc。 -
manage_etc_hosts: true
告訴 cloud-init 更新 /etc/hosts 文件。
接下來的問題是:如何將這些信息傳給 cloud-init?
有三幾種方法:
① instance 部署時,直接將其粘貼到 Customization Script
輸入框中。
② 將其保存為文件,instance 部署時上傳(上圖 ② 所示)。
③ 將其保存為文件,命令行 nova boot
或者 openstack server create
部署 instance 時,使用參數 --user-data
傳入。
部署成功后,hostname 正確設置,/etc/hosts 也相應更新。
定制用戶初始密碼
官方的 cloud image 默認只能通過 ssh key 登錄。我們可以利用set-passwords
模塊為用戶設置密碼並啟用密碼登錄。需要傳入的腳本如下:
#cloud-config
chpasswd:
list: |
root:123456
ubuntu:123456
expire: false
ssh_pwauth: true
說明如下:
-
root 和 ubuntu 用戶密碼設置為 123456。
-
ssh_pwauth
啟用密碼登錄。
instance 啟動后 ssh 驗證:
ubuntu 用戶 ssh 密碼登錄成功,並且可通過密碼切換到 root。
安裝軟件
標准鏡像中不可能包含我們需要的所有軟件,定制安裝是不可避免的。一個辦法是部署完后手動安裝,另一個辦法是通過 package-update-upgrade-install
模塊讓 cloud-init 自動為我們安裝。
需要傳入的腳本如下:
#cloud-config
apt:
primary:
- arches: [default]
search:
- http://1.2.3.4
packages:
- pwgen
- pastebinit
- [libpython2.7, 2.7.3-0ubuntu3.1]
說明如下:
-
apt
指定安裝源的位置,這里為 http://1.2.3.4 。如果是 yum 源則用yum_repos
模塊指定,具體用法可參看官網文檔。 -
packages
指定需要安裝的軟件包,還可以指定具體版本。
instance 啟動后可看到 /etc/apt/sources.list 中安裝源已經更新為http://1.2.3.4。
由於 http://1.2.3.4 不是一個有效的 apt 源,安裝肯定會失敗,我們可以在 /var/log/cloud-init.log 看到失敗的信息。
雖然失敗了,但我們至少可以確定如下事情:
-
傳入的腳本是有效的,cloud-init 確實在嘗試安裝指定的軟件。
-
/var/log/cloud-init.log 會完整地記錄 cloud-init 運行的所有細節,是 debug 最重要的工具。
cloud-init 的模塊眾多,功能很全,是實現 instance 定制的神器。由於篇幅所限,這里只討論了幾個典型用例。更多用法以及示例可參看 https://cloudinit.readthedocs.io
關於 Metadata 和 cloud-init 的主題就討論到這里,下一次我們將開始新的教程 《每天5分鍾玩轉容器技術》,敬請期待。