返回部落格

使用 CloudInit 進行伺服器佈署簡介

使用 CloudInit 進行伺服器佈署簡介

本月我們宣布了一個非常令人興奮的 與 Canonical 的合作夥伴關係,他們是 Ubuntu 的開發商。最重要的是,這次合作的核心要素是在 CloudSigma 雲端與 Ubuntu 之間導入完整的 CloudInit 支援。

CloudInit 簡介

如果您對 CloudInit 還不熟悉,它是引導雲端伺服器的業界標準。具體來說,如果您使用的是簡單的 DSL  便可以在首次開機時輕鬆執行任務。同樣值得指出的是,CloudInit 並不限於 Ubuntu。如今,您會在大多數現代 Linux 發行版中找到 CloudInit 支援(但支援的雲端會有所不同)。

在開始使用 CloudInit 之前,了解 CloudInit 在佈署生態系統中的定位非常重要。雖然可以將 CloudInit 作為獨立的佈署系統運行,但更常見的是將其與另一個佈署系統(如 Ansible、Chef、Puppet 或 Salt)結合使用。在這種情況下,您只需使用 CloudInit 將新伺服器引導至佈署系統可以接管的狀態。就我個人而言,我經常將 CloudInit 與 Ansible 結合使用。

在 CloudSigma 上使用 CloudInit

在 CloudSigma 上使用 CloudInit 非常簡單直接。

要在 Ubuntu 14.04 伺服器上使用 CloudInit,請執行以下步驟:

    • 複製硬碟 來自市集的 “Ubuntu 14.04 Cloud Image”(目前唯一完全支援 CloudInit 的硬碟)。請確保將複製的硬碟調整為所需的大小,它將在首次開機時自動擴充檔案系統。
    • 建立新伺服器。
    • 建立伺服器後,您將在伺服器狀態下方看到一個 CloudInit 按鈕。

CloudInit

    • 當您點擊此按鈕時,將出現以下對話框。

CloudInit_activate

  • 只需在此處貼上您的 CloudInit 資料,然後按下 ‘Activate’。
  • 您可以啟動伺服器,該指令碼將在首次開機時執行。

使用 CloudInit 安裝 SSH 金鑰

現在您已經知道如何 在我們的雲端上使用 CloudInit,讓我們利用這些新學到的知識來安裝兩個 SSH 金鑰。我們將使用的兩個虛擬公鑰為 ‘ssh-rsa AAA[…] user1@host‘ 和 ‘ssh-rsa AAA[…] user2@host‘。(要了解更多關於產生 SSH 金鑰的資訊,請參閱 此頁面 (在 Github 上)。)

在 Ubuntu Cloud Images 上,預設的使用者名稱為 ‘ubuntu’。因此,金鑰將安裝到該使用者帳戶中。

對此的 CloudInit 設定如下所示:

[ruby]
#cloud-config
ssh_authorized_keys:
- ssh-rsa AAA[...] user1@host
- ssh-rsa AAA[...] user2@host
[/ruby]

請注意 空格非常重要。在 ‘-‘ 之前有兩個空格。如果您只放一個,伺服器可能無法讀取。

儲存 CloudInit 設定並啟動伺服器後,您應該能夠使用 ‘ubuntu’ 使用者透過 SSH 連線到伺服器:

[bash light="true"]
$ ssh ubuntu@aaa.bbb.ccc.ddd
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-36-generic x86_64)

* Documentation: https://help.ubuntu.com/

System information as of Sun Oct 19 21:51:54 UTC 2014

System load: 0.0 Users logged in: 0
Usage of /: 77.4% of 39.34GB IP address for eth0: aaa.bbb.ccc.ddd
Memory usage: 26%
Swap usage: 0%
Processes: 113

Graph this data and manage this system at:
https://landscape.canonical.com/

Get cloud support with Ubuntu Advantage Cloud Guest:
http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.
[...]
ubuntu@myserver:~$
[/bash]

使用 CloudInit 安裝系統更新

另一個您可以透過 CloudInit 輕鬆實現的非常實用的功能,是在首次開機時執行系統更新。雖然我們經常更新我們的磁碟映像檔,但採取額外的預防措施以確保您的系統是最新的仍然是一個好主意。

要在首次開機時安裝系統更新,請新增以下內容:

[ruby]
#cloud-config
apt_update: true
apt_upgrade: true
[/ruby]

您可能還會注意到有一個名為 ‘package_update’ 的類似選項,它是 Ubuntu 上 ‘apt_update’ 的發行版無關別名。

此外,如果設置了 ‘packages’(如下所示),‘apt_update’ 預設會被設置為 true,但我已在上方添加它以使其更明確。

使用 CloudInit 安裝套件

引導系統的一個基本部分是能夠在開機時安裝套件。幸運的是,CloudInit 也能輕鬆實現這一點。我們只需要在 ‘packages’ 下指定要安裝的套件列表即可。例如,如果我們想安裝 ‘python-pip’、‘fail2ban’ 和 ‘vim’,它看起來會像這樣:

[ruby]
#cloud-config
packages:
- python-pip
- fail2ban
- vim
[/ruby]

再次提醒,請注意 空格非常重要。在 ‘-‘ 之前有兩個空格。

使用 CloudInit 設置主機名稱

當您佈署新伺服器時,您可能也想為其設置主機名稱。

[ruby]
#cloud-config
hostname: mynode
fqdn: mynode.example.com
manage_etc_hosts: true
[/ruby]

使用 CloudInit 在首次開機時執行指令

假設您對伺服器進行了更複雜的操作,您很可能有一些需要在首次開機時執行的指令。

這就是 ‘runcmd’ 和 ‘bootcmd’ 發揮作用的地方。這兩者都允許您在首次開機時執行指令。區別在於 ‘bootcmd’ 在開機過程中的執行時間比 ‘runcmd’ 更早。

要使用這些指令中的任何一個,請將以下內容添加到您的 CloudInit 中:

[ruby]
#cloud-config
runcmd:
- ls -l /root
- [wget, "https://news.ycombinator.com", -O, /tmp/index.html]
[/ruby]

搭配組態管理器使用 CloudInit

最後,如果您是更進階的雲端使用者,您很可能正在使用某種組態管理器。幸運的是,CloudInit 對此已做好準備。然而,考慮到許多變數,這是一個相當複雜的主題。

因此,這裡有一些範例,應該能夠為您指明正確的方向:

如何將多個元素結合在一起

對於不熟悉 YAML 格式檔案的人來說,可能不太清楚如何將多個 CloudInit 元素串聯在一起。然而,這其實很簡單。在第一行,您需要 ‘#cloud-config‘。在那之後,您只需添加您的組態。

例如,將上述所有範例合併為一個組態,看起來會像這樣:

[ruby]
#cloud-config
ssh_authorized_keys:
- ssh-rsa AAA[...] user1@host
- ssh-rsa AAA[...] user2@host
hostname: mynode
fqdn: mynode.example.com
manage_etc_hosts: true
apt_update: true
apt_upgrade: true
packages:
- python-pip
- fail2ban
- vim
runcmd:
- ls -l /root
- [wget, "https://news.ycombinator.com", -O, /tmp/index.html]
[/ruby]

其他資源

在這篇文章中,我們真的只是觸及了 CloudInit 功能的皮毛。您還可以透過學習做很多其他事情,例如 建立使用者和群組, 將檔案寫入磁碟 以及 完成時呼叫 URL (用於通知其他系統)。

如果您想了解更多關於 CloudInit 的資訊,我推薦以下來源:

author

Viktor Petersson

作者 · CloudSigma

Preslav Dobrev 是 CloudSigma 的創意設計師,專注於透過傳統與創新行銷渠道建立一致的企業形象。他擅長將藝術願景與策略行銷相融合,創造具有影響力的品牌敘事。

留言

目前尚無留言。成為第一個留言的人吧。