在本地搭建一個擬真的雲端環境對於開發和測試至關重要。EC2Stack 提供了一個輕量級的解決方案,讓開發者可以在本地執行與 AWS EC2 相容的 API。藉由 AWS CLI,我們可以輕鬆地與 EC2Stack 互動,如同操作真正的 EC2 instance。這篇文章將引導你完成 EC2Stack 的安裝、AWS CLI 的組態,以及一些常用的操作範例,讓你快速上手本地雲端開發。更進一步,我們也會探討如何使用 Python 的 Boto 函式庫與 EC2Stack 互動,以及如何利用 gstack 連線 Google Compute Engine (GCE),實作更彈性的開發環境。最後,我們將會介紹 CloudStack 如何與 OCCI 標準整合,為你的雲端架構提供更標準化的管理方式。

釋放本地雲潛力:使用 AWS CLI 操作 EC2Stack

在雲端技術的世界中,能夠在本地環境模擬雲端服務,對於開發、測試和學習來說都非常重要。EC2Stack 提供了一個輕量級的解決方案,讓我們可以在本地執行一個與 AWS EC2 相容的 API。這篇文章將探討如何使用 AWS CLI 與 EC2Stack 互動,釋放本地雲的潛力。

為什麼選擇 EC2Stack?我的本地雲探索之旅

在過去幾年,我參與了多個雲端專案,深刻體會到在本地環境快速驗證想法的重要性。EC2Stack 正好滿足了這個需求。它不僅易於安裝和組態,而且與 AWS CLI 的相容性也非常好。

安裝與組態:讓 AWS CLI 與 EC2Stack 無縫連線

首先,我們需要安裝 AWS CLI。雖然可以直接從 PyPI 安裝,但我建議指定版本,以確保與 EC2Stack 的相容性。

$ sudo pip install awscli==1.3.10

這個小技巧可以避免版本不相容導致的問題。玄貓建議使用經驗證過的版本,可以減少不必要的麻煩。

接下來,組態 AWS CLI,輸入你的 API 金鑰和 Secret Key。這些金鑰通常來自你的 CloudStack 佈署。

$ aws configure
AWS Access Key ID [None]: PQogHs2sk_3uslfvrASjQFDlZbt0mEDd14iN
AWS Secret Access Key [None]: aHuDB2ewpgxVuQlvD9P1o313BioI1W4v
Default region name [None]: CH-GV2
Default output format [None]:

完成組態後,你會在 ~/.aws/config 檔案中看到這些設定。

註冊使用者:EC2Stack 的關鍵一步

在使用 AWS CLI 之前,還需要在 EC2Stack 中註冊使用者。先升級 requests 模組:

$ sudo pip install --upgrade requests

然後,使用 ec2stack-register 命令註冊你的 API 金鑰:

$ ec2stack-register http://localhost:5000 <API accesskey> <API secret key>

如果看到 “Successfully Registered!” 的訊息,就表示一切順利。

實際操作:使用 AWS CLI 與 EC2Stack 互動

現在,你可以使用 AWS CLI 傳送請求到 EC2Stack 端點了。例如,列出所有可用的映像檔:

$ aws ec2 describe-images --endpoint=http://localhost:5000

或者,建立一個新的金鑰對:

$ aws ec2 create-key-pair --endpoint=http://localhost:5000 --key-name=test

啟動一個新的 instance:

$ aws ec2 run-instances --image-id=20d4ebc3-8898-431c-939e-adbcf203acec --endpoint=http://localhost:5000

image-id 引數是 CloudStack 的 UUID,你可以透過 aws ec2 describe-images 找到它。

擴充套件 EC2Stack API:為開源貢獻一份力量

EC2Stack 的 API 覆寫範圍有限,但由於它是開源的,我們可以輕鬆地貢獻程式碼,增加我們需要的 API。

如何貢獻?玄貓的開源經驗分享

在過去的專案中,我經常需要修改或擴充套件開源工具,以滿足特定需求。EC2Stack 也是一個很好的例子。如果你發現缺少某些 API,可以 fork 它的 GitHub 倉函式庫,然後提交 pull request。

目前支援的 API:EC2Stack 的功能一覽

目前,EC2Stack 支援以下 AWS API:

def _get_action(action):
    actions = {
        'AttachVolume': volumes.attach_volume,
        'AuthorizeSecurityGroupEgress':
            security_groups.authenticate_security_group_egress,
        'AuthorizeSecurityGroupIngress':
            security_groups.authenticate_security_group_ingress,
        'CreateKeyPair': keypairs.create_keypair,
        'CreateSecurityGroup': security_groups.create_security_group,
        'CreateTags': tags.create_tags,
        'CreateVolume': volumes.create_volume,
        'DeleteKeyPair': keypairs.delete_keypair,
        'DeleteSecurityGroup': security_groups.delete_security_group,
        'DeleteTags': tags.delete_tags,
        'DeleteVolume': volumes.delete_volume,
        'DescribeAvailabilityZones': zones.describe_zones,
        'DescribeImageAttribute': images.describe_image_attribute,
        'DescribeImages': images.describe_images,
        'DescribeInstanceAttribute': instances.describe_instance_attribute,
        'DescribeInstances': instances.describe_instances,
        'DescribeKeyPairs': keypairs.describe_keypairs,
        'DescribeSecurityGroups': security_groups.describe_security_groups,
        'DescribeTags': tags.describe_tags,
        'DescribeVolumes': volumes.describe_volumes,
        'DetachVolume': volumes.detach_volume,
        'GetPasswordData': passwords.get_password_data,
        'ImportKeyPair': keypairs.import_keypair,
        'RebootInstances': instances.reboot_instance,
        'RegisterSecretKey': register_secret_key,
        'RemoveSecretKey': remove_secret_key,
        'RevokeSecurityGroupEgress':
            security_groups.revoke_security_group_egress,
        'RevokeSecurityGroupIngress':
            security_groups.revoke_security_group_ingress,
        'RunInstances': instances.run_instance,
        'StartInstances': instances.start_instance,
        'StopInstances': instances.stop_instance,
        'TerminateInstances': instances.terminate_instance,
    }

從程式碼中可以看到,EC2Stack 主要針對 CloudStack basic zones。它模擬了 AWS EC2 的一些核心功能,例如 SSH 金鑰對和安全群組。目前還不支援 Virtual Private Clouds (VPCs)。

使用 Python Boto 操作 EC2Stack

除了 AWS CLI,我們還可以使用 Python Boto 與 EC2Stack 互動。Boto 是一個 Python 套件,提供了 AWS API 的客戶端繫結。

為什麼選擇 Boto?玄貓的 Python 雲端開發經驗

在我的經驗中,Boto 是一個非常強大的工具,可以用於自動化雲端任務。它不僅支援 EC2,還支援 S3、CF、EMR 等多種 AWS 服務。

安裝 Boto:Python 的雲端利器

安裝 Boto 非常簡單:

$ sudo pip install boto

安裝完成後,你就可以在 Python 指令碼中匯入 Boto 模組,並建立一個連線物件到你的 EC2 介面端點。

透過本文,玄貓與大家分享瞭如何使用 AWS CLI 和 Python Boto 與 EC2Stack 互動。EC2Stack 是一個非常有用的工具,可以幫助我們在本地環境模擬雲端服務,提高開發和測試效率。同時,我也鼓勵大家參與開源專案,為 EC2Stack 貢獻自己的力量。


### 為你的 CloudStack 雲端環境啟用 AWS 相容性:例項啟動與 Eutester 整合

在 CloudStack 環境中,如果需要與 AWS 服務互動,可以透過 AWS EC2 介面來達成。本文將介紹如何使用 Boto 啟動例項,並利用 Eutester 測試 AWS 相容性。

#### 使用 Boto 啟動 CloudStack 例項

首先,確認你的客戶端機器上已安裝 Boto,並且 AWS EC2 介面正在 CloudStack 前端執行。接著,可以使用以下 Python 指令碼來啟動例項。

```python
#!/usr/bin/env python
import sys
import os
import boto
import boto.ec2

# 設定區域資訊
region = boto.ec2.regioninfo.RegionInfo(endpoint="localhost")

# 替換為你的 API 金鑰
apikey='GwNnpUPrO6KgIdZu01z_ZhhZnKjtSdRwuYd4DvpzvFpyxGMvrzno2q05MB0ViBoFYtdqKd'
secretkey='t4eXLEYWw7chBhDlaKf38adCMSHx_wlds6JfSx3z9fSpSOm0AbP9Moj0oGIzy2LSC8iw'

def main():
    '''建立與 EC2 雲端的連線'''
    conn =boto.connect_ec2(aws_access_key_id=apikey,
                            aws_secret_access_key=secretkey,
                            is_secure=False,
                            region=region,
                            port=5000,
                            path="/",
                            api_version="2014-02-01")

    '''取得我擁有的映像檔列表'''
    images = conn.get_all_images()
    myimage = images[0]

    '''選擇一個例項型別'''
    vm_type='m1.small'
    reservation = myimage.run(instance_type=vm_type,security_groups=['default'])

if __name__ == '__main__':
    main()

程式碼解密

  1. 引入必要的函式庫
    • sysos:用於系統相關操作。
    • botoboto.ec2:AWS SDK,用於與 EC2 互動。
  2. 設定區域資訊
    • region = boto.ec2.regioninfo.RegionInfo(endpoint="localhost"):定義 EC2 介面的端點。
  3. API 金鑰
    • apikeysecretkey:替換為你的 AWS API 金鑰。
  4. 建立連線
    • conn = boto.connect_ec2(...):使用提供的金鑰和端點資訊建立與 EC2 雲端的連線。
  5. 取得映像檔列表
    • images = conn.get_all_images():取得你擁有的所有映像檔。
    • myimage = images[0]:選擇第一個映像檔。
  6. 啟動例項
    • vm_type = 'm1.small':選擇例項型別。
    • reservation = myimage.run(...):使用指定的映像檔和安全組啟動例項。

這個指令碼會在一個啟用了安全組的區域中啟動一個 m1.small 型別的例項。你可以傳遞額外的引數到 run 方法,例如金鑰對。

使用互動式 Shell 與 CloudStack 互動

如果你喜歡使用互動式 Shell 與雲端互動,可以使用 IPython。以下是一個簡單的 Shell 指令碼:

#!/usr/bin/env python
import boto
import boto.ec2
from IPython.terminal.embed import InteractiveShellEmbed

# 替換為你的 API 金鑰
accesskey="my api key"
secretkey="my secret key"

# 設定區域資訊
region = boto.ec2.regioninfo.RegionInfo(endpoint="localhost")

# 建立連線
conn = boto.connect_ec2(aws_access_key_id=accesskey,
                        aws_secret_access_key=secretkey,
                        is_secure=False,
                        region=region,
                        port=5000,
                        path="/",
                        api_version="2014-02-01")

# 啟動 IPython Shell
ipshell = InteractiveShellEmbed(banner1="Hello, Cloud Shell!")
ipshell()

程式碼解密

  1. 引入必要的函式庫
    • botoboto.ec2:AWS SDK,用於與 EC2 互動。
    • IPython.terminal.embed.InteractiveShellEmbed:用於嵌入 IPython Shell。
  2. API 金鑰
    • accesskeysecretkey:替換為你的 AWS API 金鑰。
  3. 建立連線
    • conn = boto.connect_ec2(...):使用提供的金鑰和端點資訊建立與 EC2 雲端的連線。
  4. 啟動 IPython Shell
    • ipshell = InteractiveShellEmbed(...):建立 IPython Shell 例項。
    • ipshell():啟動 IPython Shell。

啟動這個互動式 Shell 後,你可以透過輸入 conn. 並按下 Tab 鍵來探索連線物件中所有可用的方法。請注意,CloudStack 的 AWS 介面尚未 100% 相容於 AWS API,因此並非所有 Boto 方法都能正常運作。

選擇 EC2Stack 或 CloudStack 原生 AWS API

在這個例子中,我們使用了 EC2Stack 介面,但你也可以使用 CloudStack 原生提供的介面。你可以使用 service cloudstack-awsapi start 命令來啟動它。玄貓個人比較喜歡 EC2Stack,因為玄貓參與了它的開發,並且它支援較新的 api_version

使用 Eutester 測試 CloudStack 的 AWS 相容性

Eutester 是由 Eucalyptus 的開發者建立的,它提供了一個框架來為 AWS 區域和根據 Eucalyptus 的雲端建立功能測試。Eutester 的有趣之處在於,它可以比較多個雲端的 AWS 相容性。

那麼,我們可以在 CloudStack 中使用 Eutester 嗎?答案是肯定的。雖然它可能需要更多的工作,但基本功能已經存在。它允許你編寫測試場景,並比較 AWS EC2 可用區域和 CloudStack 雲端之間的結果。

安裝 Eutester

你可以使用 pip 從 Python 套件索引中取得二進位檔案,或者從 GitHub 上的原始碼構建它。

$ sudo pip install eutester

玄貓最近修補了一個測試分支的 fork,並在他們的 GitHub 頁面上開啟了一個 issue。如果你想大量使用 Eutester,建議你檢查它的狀態。

要將 Eutester 與 CloudStack 搭配使用,請克隆玄貓的 Eutester fork 的測試分支。然後手動安裝它:

$ git clone -b testing https://github.com/runseb/eutester.git
$ cd eutester
$ sudo python ./setup.py install

使用 Eutester 撰寫功能測試

安裝 Eutester 後,你可以編寫一個 Python 指令碼來向你的 CloudStack 雲端發出請求。

#!/usr/bin/env python
from eucaops import ec2ops
from IPython.terminal.embed import InteractiveShellEmbed

# 替換為你的 API 金鑰
accesskey="my api key"
secretkey="my secret key"

# 建立連線
conn.ec2ops.EC2ops(endpoint="localhost",
                   aws_access_key_id=apikey,
                   aws_secret_access_key=secretkey,
                   is_secure=False,
                   port=5000,
                   path="/",
                   APIVersion="2014-02-01")

# 啟動 IPython Shell
ipshell = InteractiveShellEmbed(banner1="Hello, Cloud Shell!")
ipshell()

程式碼解密

  1. 引入必要的函式庫
    • eucaops.ec2ops:Eutester 的 EC2 操作模組。
    • IPython.terminal.embed.InteractiveShellEmbed:用於嵌入 IPython Shell。
  2. 建立連線
    • conn.ec2ops.EC2ops(...):使用提供的金鑰和端點資訊建立與 EC2 雲端的連線。
  3. 啟動 IPython Shell
    • ipshell = InteractiveShellEmbed(...):建立 IPython Shell 例項。
    • ipshell():啟動 IPython Shell。

在撰寫本文時,Eutester 有 145 個方法。只有透過你將使用的 CloudStack AWS EC2 介面可用的方法才可以使用。例如,get_zonesget_instances 將傳回:

In [3]: conn.get_zones()
Out[3]: [u'ch-gva-2']

In [4]: conn.get_instances()
[2014-05-21 05:39:45,094] [EUTESTER] [DEBUG]:
--->(ec2ops.py:3164)Starting method: get_instances(self, state=None,
idstring=None, reservation=None, rootdevtype=None, zone=None,
key=None, pubip=None, privip=None, ramdisk=None, kernel=None,
image_id=None, filters=None)
Out[4]:
[Instance:5a426582-3aa3-49e0-be3f-d2f9f1591f1f,
Instance:95ee8534-b171-4f79-9e23-be48bf1a5af6,
Instance:f18275f1-222b-455d-b352-3e7b2d3ffe9d,
Instance:0ea66049-9399-4763-8d2f-b96e9228e413,
Instance:7b2f63d6-66ce-4e1b-a481-e5f347f7e559,
Instance:46d01dfd-dc81-4459-a4a8-885f05a87d07,
Instance:7158726e-e76c-4cd4-8207-1ed50cc4d77a,
Instance:14a0ce40-0ec7-4cf0-b908-0434271369f6]

這個範例顯示,玄貓目前在一個名為 ch-gva-2 的區域中執行八個例項,這是 exoscale 雲的一個區域。選擇其中一個例項物件將會顯示更多資訊。

總之,透過 Boto 和 Eutester,你可以更輕鬆地在 CloudStack 環境中管理和測試 AWS 相容性。這些工具不僅簡化了例項管理,還提供了一種驗證 CloudStack AWS EC2 介面是否正常運作的方法。


```text

### 玄貓評估:Eutester在整合測試中的應用與侷限性

Eutester 提供了一種便捷的方式來進行整合測試並建立測試情境。它允許你存取執行個體的所有可用方法,包括列出、刪除和建立金鑰對,以及管理安全群組等。然而,玄貓認為,若要為應用程式構建客戶端,Boto(在 Recipe 4.4 中介紹)會是更好的選擇。

### 雲端介面新選擇:使用gstack連線CloudStack與GCE

Google Compute Engine (GCE) 是 Google 的公有雲端服務。自 2013 年正式 GA 以來,它已成為市場上領先的雲端平台之一,與 AWS 和 Microsoft Azure 並駕齊驅。CloudStack 提供了一個與 GCE 相容的介面,讓使用者可以使用 GCE 客戶端(例如 gcloud 和 gcutil)來存取他們的 CloudStack 雲。

#### gstack 的運作原理

就像 EC2Stack 一樣,gstack 是一個 Python Flask 應用程式,提供與 GCE API 相容的 REST API,並將請求轉發到相應的 CloudStack API。玄貓發現,這種方式對於需要在不同雲平台間遷移或整合服務的團隊來說,非常實用。

#### 如何安裝 gstack

gstack 的原始碼可在 GitHub 上取得,二進位檔案則可透過 PyPI 下載。

**問題**

你希望在你的機器上安裝 gstack。

**解決方案**

從 Python Package Index 使用 pip 取得二進位檔案,或者從 GitHub 克隆原始碼。

**討論**

你可以使用 pip 從 PyPI 取得 gstack 二進位包,只需一個命令:

```bash
$ sudo pip install gstack

或者,如果你計劃探索原始碼並進行修改,你可以克隆儲存函式庫並手動安裝:

$ git clone https://github.com/NOPping/gstack.git
$ sudo python ./setup.py install
玄貓解密:安裝步驟詳解
  1. pip 安裝:使用 pip install gstack 可以快速安裝 gstack,這會自動下載並安裝所有必要的依賴項。
  2. 原始碼安裝:如果你需要修改 gstack 的程式碼,或者想了解其內部運作,可以選擇從 GitHub 克隆原始碼並手動安裝。
  3. 二進位檔案位置:這兩種安裝方法都會在你的路徑中安裝 gstackgstack-configure 二進位檔案,方便你從終端機執行它們。

gstack 的組態

在執行 gstack 之前,你必須先進行組態。執行以下命令:

$ gstack-configure

當提示時,輸入你的組態資訊。你需要指定 gstack 執行的主機和埠,以及 gstack 將請求轉發到的 CloudStack 端點。在下面的例子中,我們使用 exoscale 雲:

$ gstack-configure
gstack bind address [0.0.0.0]: localhost
gstack bind port [5000]:
Cloudstack host [localhost]: api.exoscale.ch
Cloudstack port [8080]: 443
Cloudstack protocol [http]: https
Cloudstack path [/client/api]: /compute
玄貓提示:組態引數的意義
  • gstack bind address: 指定 gstack 繫結的 IP 地址。預設值為 0.0.0.0,表示監聽所有可用的網路介面。
  • gstack bind port: 指定 gstack 監聽的埠。預設值為 5000
  • Cloudstack host: CloudStack API 的主機名稱。
  • Cloudstack port: CloudStack API 的埠。
  • Cloudstack protocol: CloudStack API 使用的協定,可以是 httphttps
  • Cloudstack path: CloudStack API 的路徑。

這些資訊將儲存在一個組態檔案中,該檔案位於 ~/.gstack/gstack.conf

$ cat ~/.gstack/gstack.conf
PATH = 'compute/v1/projects/'
GSTACK_BIND_ADDRESS = 'localhost'
GSTACK_PORT = '5000'
CLOUDSTACK_HOST = 'api.exoscale.ch'
CLOUDSTACK_PORT = '443'
CLOUDSTACK_PROTOCOL = 'https'
CLOUDSTACK_PATH = '/compute'
玄貓解密:組態檔案的結構

這個組態檔案定義了 gstack 運作所需的各種引數。例如,CLOUDSTACK_HOSTCLOUDSTACK_PORT 指定了 CloudStack API 的位置,而 GSTACK_BIND_ADDRESSGSTACK_PORT 則指定了 gstack 服務的繫結地址和埠。

啟動 gstack

你可以像這樣輕鬆啟動 gstack:

$ gstack

與 EC2Stack 類別似,這將在前台執行 gstack。這對於測試目的來說是可以接受的,但如果你想在生產環境中將 gstack 作為服務執行,可以考慮使用一些 WSGI HTTP 伺服器來提供 gstack。在生產環境中,你還需要為 gstack 建立一個適當簽署的憑證,並替換自簽憑證。

使用 gcutil 工具操作 gstack

問題

在你的機器上安裝並執行 gstack 後,你希望使用 gcutil 命令列工具向你的 CloudStack 雲發出請求。

解決方案

安裝並組態獨立的 gcutil 工具,並開始透過你執行的 gstack 伺服器向 CloudStack 發出命令。

討論

當前版本的 gstack 僅適用於獨立版本的 gcutil。不要使用 Google Cloud SDK 中捆綁的版本。相反,安裝 0.14.2 版本的 gcutil

玄貓提示:gcutil 版本選擇的重要性

由於 gstack 與特定版本的 gcutil 相容,因此務必使用正確的版本。否則,可能會遇到相容性問題。

gstack 自帶一個用於本地端點的自簽憑證 gstack/data/server.crt,將該憑證複製到 gcutil 憑證檔案 gcutil/lib/httplib2/httplib2/cacerts.txt

玄貓解密:憑證的重要性

憑證用於驗證伺服器的身份,確保你的 gcutil 工具正在與正確的 gstack 伺服器通訊。

在此階段,你的 CloudStack API 金鑰和金鑰需要輸入到 gcutil/lib/google_compute_engine/gcutil/ 目錄下的 gcutil auth_helper.py 檔案中。這遠非理想。因此,我們向 Google 提出了一個功能請求,希望將 client_idclient_secret 作為選項傳遞給 gcutil。希望未來版本的 gcutil 允許我們這樣做。

玄貓觀察:安全性的考量

將 API 金鑰和金鑰直接寫入程式碼中存在安全風險。更好的做法是將這些敏感資訊儲存在環境變數或安全組態檔案中,並在執行時讀取它們。

gcutil 建立一個快取的引數檔案。假設你在本地機器上執行 gstack,使用在組態階段建議的預設值。修改 ~/.gcutil_params 檔案,內容如下:

--auth_local_webserver
--auth_host_port=9999
--dump_request_response
--authorization_uri_base=https://localhost:5000/oauth2
--ssh_user=root
--fetch_discovery
--auth_host_name=localhost
--api_host=https://localhost:5000/

確保將 --auth_host_name 變數設定為與你的 ~/.gstack/gstack.conf 檔案中的 GSTACK_BIND_ADDRESS 相同的值。否則,你會看到憑證錯誤。

玄貓提醒:組態一致性的重要性

--auth_host_name 必須與 GSTACK_BIND_ADDRESS 保持一致,以避免憑證驗證錯誤。

完成此設定後,gcutil 將向本地 Flask 應用程式發出請求,取得 OAuth 令牌,向你的 CloudStack 端點發出請求,並以 GCE 相容的格式傳回回應。

完成設定步驟後,你可以開始發出標準的 gcutil 命令。為了說明目的,我們使用 exoscale。

雲端帳戶的那些事:為何 CloudStack 資訊在 gstack 中如此重要?

在使用 gcutil 這個工具時,你會發現它需要 CloudStack 的帳戶資訊。這主要是因為 gstack 專案在設計上與 CloudStack 有著千絲萬縷的聯絡。因此,你會看到專案需要你提供 email 作為專案值。

玄貓觀點:我認為這部分可以最佳化,讓使用者經驗更好。

接下來,讓我們看看如何使用 gcutil 列出可用區域(Availability Zones):

$ gcutil --cached_flags_file=~/.gcutil_params --project=runseb@gmail.com listzones

這個指令會顯示類別似以下的輸出:

+----------+--------+------------------+
| name     | status | next-maintenance |
+----------+--------+------------------+
| ch-gva-2 | UP     | None scheduled   |
+----------+--------+------------------+

接著,我們可以列出可用的機器型別。在 CloudStack 的術語中,這相當於計算服務產品和可用的映像列表:

$ gcutil --cached_flags_file=~/.gcutil_params --project=runseb@gmail.com listmachinetypes

輸出範例:

+-------------+----------+------+-----------+-------------+
| name        | zone     | cpus | memory-mb | deprecation |
+-------------+----------+------+-----------+-------------+
| Micro       | ch-gva-2 | 1    | 512       |             |
+-------------+----------+------+-----------+-------------+
| Tiny        | ch-gva-2 | 1    | 1024      |             |
| Small       | ch-gva-2 | 2    | 2048      |             |
| Medium      | ch-gva-2 | 2    | 4096      |             |
| Large       | ch-gva-2 | 4    | 8182      |             |
| Extra-large | ch-gva-2 | 4    | 16384     |             |
| Huge        | ch-gva-2 | 8    | 32184     |             |
+-------------+----------+------+-----------+-------------+

內容解密

  • name: 機器型別名稱,例如 Micro, Tiny, Small 等。
  • zone: 機器型別所在的可用區域。
  • cpus: 虛擬 CPU 數量。
  • memory-mb: 記憶體大小,單位為 MB。
  • deprecation: 是否已棄用。

同樣,你也可以列出可用的映像:

$ ./gcutil --cached_flags_file=~/.gcutil_params --project=runseb@gmail.com listimages

輸出範例:

+---------------------------------+-------------+--------+
| name                              | deprecation | status |
+---------------------------------+-------------+--------+
| CentOS 5.5(64-bit) no GUI (KVM) |             | Ready  |
| Linux CentOS 6.4 64-bit           |             | Ready  |
| Linux Ubuntu 12.04 LTS 64-bit    |             | Ready  |
| Windows Server 2008 R2 SP1        |             | Ready  |
| Windows Server 2012               |             | Ready  |
+---------------------------------+-------------+--------+

內容解密

  • name: 映像名稱,通常包含作業系統和版本資訊。
  • deprecation: 是否已棄用。
  • status: 映像狀態,例如 Ready 表示可用。

防火牆設定:gstack 如何對應 CloudStack 安全群組?

gstack 中,防火牆對應於 CloudStack 的安全群組。你可以使用以下指令建立一個安全群組:

$ ./gcutil --cached_flags_file=~/.gcutil_params --project=runseb@gmail.com addfirewall ssh --allowed=tcp:22

這個指令會建立一個名為 ssh 的防火牆,允許 TCP 埠 22 的流量。

你可以使用 getfirewall 指令檢視防火牆的詳細資訊:

$ ./gcutil --cached_flags_file=~/.gcutil_params --project=runseb@gmail.com getfirewall ssh

輸出範例:

+---------------+-----------+
| property      | value     |
+---------------+-----------+
| name          | ssh       |
| description   |           |
| creation-time |           |
| network       |           |
| source-ips    | 0.0.0.0/0 |
| source-tags   |           |
| target-tags   |           |
| allowed       | tcp: 22   |
+---------------+-----------+

內容解密

  • name: 防火牆名稱。
  • description: 防火牆描述。
  • source-ips: 允許流量的來源 IP 位址。
  • allowed: 允許的流量協定和埠。

啟動執行個體:互動式提示與注意事項

要啟動一個執行個體,你可以按照 gcutil 提供的互動式提示操作。記得加上 --permit_root_ssh 引數,這是一個需要特別注意的設定。互動式提示會讓你選擇機器型別和映像,然後啟動執行個體:

$ ./gcutil --cached_flags_file=~/.gcutil_params --project=runseb@gmail.com addinstance foobar

接著會出現互動式選單,讓你選擇可用區域、機器型別和映像。

輸出範例:

Selecting the only available zone: CH-GV2
1: Extra-large Extra-large 16384mb 4cpu
2: Huge Huge 32184mb 8cpu
3: Large Large 8192mb 4cpu
4: Medium Medium 4096mb 2cpu
5: Micro Micro 512mb 1cpu
6: Small Small 2048mb 2cpu
7: Tiny Tiny 1024mb 1cpu
7
1: CentOS 5.5(64-bit) no GUI (KVM)
2: Linux CentOS 6.4 64-bit
...<snip>...
INFO: Waiting for insert of instance . Sleeping for 3s.
INFO: Waiting for insert of instance . Sleeping for 3s.
Table of resources:
+--------+--------------+--------------+----------+---------+
| name   | network-ip   | external-ip  | zone     | status  |
+--------+--------------+--------------+----------+---------+
| foobar | 185.1.2.3    | 185.1.2.3    | ch-gva-2 | RUNNING |
+--------+--------------+--------------+----------+---------+
Table of operations:
+--------------+--------+--------------------------+----------------+
| name         | status | insert-time              | operation-type |
+--------------+--------+--------------------------+----------------+
| e4180d83-31d0| DONE   | 2014-06-09T10:31:35+0200 | insert         |
+--------------+--------+--------------------------+----------------+

玄貓提醒:在選擇機器型別和映像時,請根據你的實際需求進行選擇。

執行個體管理:列出與刪除

啟動執行個體後,你可以使用 listinstances 指令列出所有執行個體,並使用 deleteinstance 指令刪除執行個體:

$ ./gcutil --cached_flags_file=~/.gcutil_params --project=runseb@gmail.com deleteinstance foobar

系統會提示你確認是否刪除執行個體:

Delete instance foobar? [y/n]
y
WARNING: Consider passing '--zone=CH-GV2' to avoid the unnecessary zone lookup which requires extra API calls.
INFO: Waiting for delete of instance . Sleeping for 3s.
+--------------+--------+--------------------------+----------------+
| name         | status | insert-time              | operation-type |
+--------------+--------+--------------------------+----------------+
| d421168c-4acd| DONE   | 2014-06-09T10:34:53+0200 | delete         |
+--------------+--------+--------------------------+----------------+

玄貓建議:在刪除執行個體前,請務必確認你不再需要它。

gstack 的未來:混合雲解決方案的根本

gstack 仍在開發中,但它已經相容於 GCE GA v1.0 API。儘管 API 語義上的一些差異需要進一步研究,並且需要支援額外的 API 呼叫,但它為在 GCE 公有雲和根據 CloudStack 的私有雲之間建立混合解決方案奠定了堅實的基礎。

總結來說,gstack 提供了一個橋樑,讓你可以更輕鬆地在不同的雲端環境中管理資源。雖然還有一些細節需要完善,但它絕對是一個值得關注的專案。


### 玄貓解析:在 CloudStack 中支援 OCCI 標準

開放雲端運算介面(OCCI)是由開放網格論壇(OGF)制定的標準。OCCI 最初是為雲端運算的 IaaS 層設計的遠端管理 API,但後來也擴充套件到 PaaS 和 SaaS 層。與 CIMI 一樣,它是雲端供應商 API 的兩個雲端標準之一,並由標準組織支援。CloudStack 有自己的 API,但它不是標準。AWS EC2 和 Google GCE 也不是標準。像 libcloud 和 jclouds 這樣的雲端封裝器可以很好地作為非官方標準,抽象化雲端供應商 API 的差異。對使用 OCCI 或 CIMI 感興趣的使用者需要在 CloudStack API 之上使用一個封裝器,以提供 CIMI 或 OCCI 實作。目前沒有適用於 CloudStack 的 CIMI 介面,但透過 rOCCI,有一個 OCCI 介面。本文將介紹 rOCCI CloudStack 驅動程式的安裝、組態和使用。

OCCI 有多種實作方式。rOCCI 是其中之一,目前正在進行一些重構。

#### 為何需要 OCCI?解決 API 標準化問題

CloudStack API 非常好,但它沒有標準組織的支援。如果您關心標準,並且希望使用開放網格論壇的 OCCI 與您的 CloudStack 雲端互動,從而消除非標準 API 的任何潛在問題,該怎麼辦?

#### 解決方案:安裝並組態 rOCCI 伺服器

在您的基礎架構中安裝 rOCCI 伺服器,並組態為使用 CloudStack 驅動程式。然後,您可以使用任何 OCCI 客戶端向其發出雲端請求。rOCCI 會將請求轉發到 CloudStack API 伺服器,並將適當的回應傳送回去。

#### 探討:OCCI 如何簡化 CloudStack 管理?

將 OCCI 與 CloudStack 結合使用涉及執行 rOCCI 伺服器和使用 OCCI 客戶端與之介面。rOCCI 伺服器提供 OCCI 標準 API 和 CloudStack API 之間的 API 對映。在本討論中,rOCCI 客戶端用於發出 OCCI API 請求,而不是使用像 CloudMonkey 這樣的 CloudStack 專用客戶端。

#### 安裝並執行 rOCCI 伺服器

您可以透過在 GitHub 上複製該專案、使用 Ruby 的 bundler 進行構建,以及設定一些組態檔案來安裝 rOCCI 伺服器:

```bash
$ git clone https://github.com/isaacchiang/rOCCI-server.git
$ gem install bundler
$ bundle install
$ cd etc/backend
$ cp cloudstack/cloudstack.json default.json

內容解密:

  • git clone https://github.com/isaacchiang/rOCCI-server.git:從 GitHub 複製 rOCCI 伺服器專案。
  • gem install bundler:安裝 Ruby 的 bundler 套件管理器。
  • bundle install:使用 bundler 安裝專案所需的 Ruby 套件。
  • cd etc/backend:切換到 rOCCI 伺服器的後端組態目錄。
  • cp cloudstack/cloudstack.json default.json:複製 CloudStack 專用的組態檔案,並將其命名為 default.json,作為預設組態。

玄貓提醒:rOCCI CloudStack 後端是實驗性的,尚未合併到 rOCCI 伺服器專案中。

編輯 default.json 檔案,以包含有關您的 CloudStack 雲端、您的端點和您的 API 金鑰的資訊。在一個 shell 中啟動 rOCCI 伺服器:

$ bundle exec passenger start

內容解密:

  • bundle exec passenger start:使用 bundler 執行 passenger 伺服器,啟動 rOCCI 伺服器。

伺服器應在 http://0.0.0.0:3000 上執行,您可以嘗試執行基本測試:

$ bundle exec rspec

內容解密:

  • bundle exec rspec:使用 bundler 執行 rspec,對 rOCCI 伺服器進行基本測試。

您已準備好安裝 OCCI 客戶端,並使用它與您剛啟動的 rOCCI 伺服器通訊。請求將被轉發到您的 CloudStack 端點。

安裝 rOCCI 客戶端

從 GitHub 複製 rOCCI-cli 客戶端。再次使用 bundler 構建它,並使用 rake 安裝它:

$ git clone https://github.com/gwdg/rOCCI-cli.git
$ cd rOCCI-cli
$ bundle install
$ bundle exec rake test
$ rake install

內容解密:

  • git clone https://github.com/gwdg/rOCCI-cli.git:從 GitHub 複製 rOCCI-cli 客戶端專案。
  • cd rOCCI-cli:切換到 rOCCI-cli 客戶端目錄。
  • bundle install:使用 bundler 安裝專案所需的 Ruby 套件。
  • bundle exec rake test:使用 bundler 執行 rake test,對 rOCCI-cli 客戶端進行測試。
  • rake install:使用 rake 安裝 rOCCI-cli 客戶端。

現在,您的路徑中應該有一個 occi 二進位制檔案。嘗試透過執行 --help 選項來使用它:

$ occi --help

內容解密:

  • occi --help:顯示 occi 客戶端的幫助資訊,確認安裝成功。

測試 OCCI 客戶端與伺服器

透過先前在 json 組態檔案中正確定義的雲端端點和 API 金鑰,您可以使用 OCCI 客戶端列出範本、位置和啟動執行個體。與 EC2Stack 類別似,您需要指定正在執行的 rOCCI 伺服器的端點。嘗試幾個 OCCI 客戶端命令:

$ occi --endpoint http://0.0.0.0:3000/ --action list --resource os_tpl
Os_tpl locations:
os_tpl#6673855d-ce9b-4997-8613-6830de037a8f
$ occi --endpoint http://0.0.0.0:3000/ --action list --resource resource_tpl
Resource_tpl locations:
resource_tpl##08ba0343-bd39-4bf0-9aab-4953694ae2b4
resource_tpl##f78769bd-95ea-4139-ad9b-9dfc1c5cb673
resource_tpl##0fd364a9-7e33-4375-9e10-bb861f7c6ee7

內容解密:

  • occi --endpoint http://0.0.0.0:3000/ --action list --resource os_tpl:使用 occi 客戶端列出可用的作業系統範本。
  • occi --endpoint http://0.0.0.0:3000/ --action list --resource resource_tpl:使用 occi 客戶端列出可用的資源範本。

您將從您在 CloudStack 中建立的範本和服務產品中識別出 uuid。這些 uuid 將會不同。要啟動執行個體:

$ occi --endpoint http://0.0.0.0:3000/
--action create
--resource compute
--mixin os_tpl#6673855d-ce9b-4997-8613-6830de037a8f
--mixin resource_tpl#08ba0343-bd39-4bf0-9aab-4953694ae2b4
--resource-title foobar

內容解密:

  • occi --endpoint http://0.0.0.0:3000/ --action create --resource compute --mixin os_tpl#6673855d-ce9b-4997-8613-6830de037a8f --mixin resource_tpl#08ba0343-bd39-4bf0-9aab-4953694ae2b4 --resource-title foobar:使用 occi 客戶端建立一個計算執行個體,指定作業系統範本、資源範本和執行個體標題。

您使用 OCCI 客戶端和 CloudStack API 之上的 OCCI 實作,在 CloudStack 雲端上啟動了一個執行個體。

玄貓帶你掌握組態管理與進階技巧

僅僅直接呼叫 CloudStack 或透過與公共雲端 API 相容的 API 介面呼叫 API 只是開始。最終,您希望使用更進階的工具來抽象化這些 API,使您可以利用您的雲端,並以可重複的方式輕鬆佈署應用程式。我們將介紹一些知名的組態管理工具(即 Ansible 和 Chef),以及一個在開發中使用的相對較新的工具(即 Vagrant)。這些工具是自動化和快速佈署的基礎。結合監控工具,它們通常與 DevOps 運動相關聯。

第五章:組態管理

自動化是可重現、容錯基礎架構的關鍵。雲端管理員應致力於自動化構建基礎架構的所有步驟,並能夠一鍵重新組態所有內容。這可以透過組態管理、監控和佈建工具的組合來實作。要開始建立將自動組態和佈建的裝置,有三個工具在武器函式庫中脫穎而出:Veewee、Packer 和 Vagrant。

玄貓提示:Veewee 正在被 Packer 取代。目前有一些工作正在為 Packer 建立 CloudStack 建構器。

Vagrant 是一個用於建立輕量級、可移植和可重現的開發環境的工具。具體來說,它允許您使用組態管理工具在本地(透過 VirtualBox)組態虛擬機器,然後透過 Vagrant 供應商將其佈署在雲端中。

Ansible 是組態管理和協調領域的一個新秀。Ansible 根據與執行個體的 SSH 通訊和無伺服器設定。它在核心上是根據推播的。它易於安裝和入門。當然,就像 Puppet、Salt 和 Chef 一樣,它可以與 Vagrant 結合使用。Ansible 有一些很棒的檔案,因此我們將快速瀏覽安裝過程,並直接深入瞭解一些關鍵概念和使用 Vagrant 的基本佈建。

總之,透過 rOCCI,CloudStack 可以支援 OCCI 標準,這使得使用者可以使用標準化的 API 與 CloudStack 雲互動,從而避免了使用非標準 API 可能產生的問題。


```tool_code