inux開發人員經常使用 Python 完成小塊的工作,因為你可以編寫指令碼的情況很容易。它已經成為完成配置和部署等小任務的一個流行方式。Windows Azure,微軟的雲,也沒有什麼不同。通過 Python SDK 所提供的可用性,Python 成為 Windows Azure 的頭等公民。讓我們看看我們如何能夠使用Python無需其它而只需一個Windows Azure訂閱就可以用編程方式從 vmdepot 部署一個映像到 Windows Azure上。
建立一個管理憑證
任何與 Windows Azure 的互動都需要兩個東西:
我們假設你使用 Linux 運行這個指令碼(如果不是,請和我聯絡,我會告訴你如何使用 Windows 來做同樣的事情)。 如果沒有安裝OpenSSL,請從root提示使用如下命令:
yum install openssl
以下將建立一個 .pem 檔案,之後可被翻譯成一個 .cer 檔案,並匯出和上傳到Windows Azure。
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout elasta.pem -out elasta.pem
用下面命令匯出 .cer:
openssl x509 -inform pem -in elasta.pem -outform der -out elasta.cer
這樣你就得到它了,一個可以上傳到你的 Windows Azure 訂閱的管理憑證。當做完這個時,你應該已經能夠以編程方式使用 Windows Azure 了。
用你的微軟帳戶或者 Windows Azure 活動目錄憑據登入到 Windows Azure。管理入口網站位於https://manage.windowsazure.com 。
選擇設定標籤:
從菜單中選擇管理憑證:
下方的應用工具條包含一個上傳按鈕:
選擇這個按鈕,上傳前面匯出的 .cer 檔案:
在“結果”面板中你應該會看到類似這樣的認證入口。
為了有助於解釋這篇文章,我已經寫了一個Python指令碼,可在這裡下載:
https://github.com/elastacloud/python-vmdepot-deploy
你可以閱讀安裝說明獲知如何使用指令碼。本文的目的是帶你領略 Windows Azure 的 Python API 的一些能夠幫你開發完全自動化部署的關鍵功能。
要使用 Windows Azure 中的任何服務管理功能,我們需要一個服務管理對象:
self.sms = ServiceManagementService(vars.subscription_id, vars.certificate_path)
這對我們接下來要做的很有用。正如你能看到的,這需要一個認證和訂閱ID作為參數。
構造一個虛擬機器
虛擬機器映像是一個模板,我們可以用它建立虛擬機器。在本例中,我們將使用一個 CentOS 映像,它是從一個由微軟的全資子公司 MS Open Tech 持有的稱為 vmdepot 的位置拷貝過來的。
我們可以通過列出我們的訂閱中所有命名的映像來檢查我們是否之前已經複製過指定的映像和註冊過現存的。
def _image_by_name(self, name): # return the first one listed, which should be the most stable for i in self.sms.list_os_images(): if name in i.name: return True return False
如果沒有,我們可以繼續我們的工作流程了。
下面示範了一個建立一個儲存體帳戶(需要一個名稱和位置)的簡潔過程。因為我在倫敦,所以我會使用“北歐”資料中心(位雩都柏林),但在世界各地有超過10個資料中心而且還有一堆正在建設。當儲存體帳戶建立完,它允許最多 200 TB 的blob資料被儲存,並由2512位的AES保護,可以用它來訪問帳戶。儲存資料的邏輯單元被稱為是一個容器,所以我們需要建立這樣的一個容器來讓我們儲存我們複製的映像。
self._create_storage_account_if_not_exists(vars.storage_account_name, vars.deploy_location)account_key = self._get_primary_account_key(vars.storage_account_name)self._create_container_if_not_exists()
我們現在應該能夠從遠程位置複製blob。這是通過使用 Windows Azure 提供的一個被稱為 copyblob 的 API 完成的。實現代碼如下:
self.blob_service.copy_blob(container_name=Constants.storage_container_name, blob_name=Constants.vhd_blob_name, x_ms_copy_source=Constants.centos_minimal_image)self._wait_for_async_copy(Constants.storage_container_name, Constants.vhd_blob_name)
你可以看到,這是一個非同步方法呼叫,允許從遠程位置複製任何 blob。這個 API 的偉大是,你可以用它來從 Windows Azure 的內部或外部複製任何 HTTP 端點,並且使用它沒有任何成本。缺點是,它沒有 SLA(譯者註:Service-Level Agreement的縮寫,服務等級協議,是網路服務供應商和客戶間的合約)。
然後 blob 就可以在你的 Windows Azure 訂閱中註冊為一個映像,你可以使用這個來建立多個虛擬機器。
self.sms.add_os_image(label=Constants.image_name, media_link=storageimage_uri, name=Constants.image_name, os='Linux')
這個指令碼將建立一個“雲端服務”的包含虛擬機器的公用端點,然後設定一個公用端點轉寄到虛擬機器的連接埠,這樣你就可以通過 SSH 進入他們。指令碼是這樣寫的,如果你每次選擇相同的雲端服務,它將從連接埠22向上遞增來添加另一個準備給SSH進入的開放連接埠來作為雲端服務的虛擬機器。
我們正在從含有映像的 vmdepot 複製映像。通過它,我正在我的訂閱中複製和註冊 CentOS 迷你映像。
https://vmdepotneurope.blob.core.windows.net/linux-community-store/community-32167-508624a5-01d1-4d57-b109-df2af5b4b232-1.vhd
你可以從這個地址瀏覽 vmdepot:
http://vmdepot.msopentech.com/List/Index
最後,我們將使用一個非常簡單的演算法來確定虛擬機器已經部署到雲端服務上,即通過查看儲存賬戶中相關的blob,每個虛擬機器都有一個虛擬硬碟(.vhd)。
index = -1blob_exists = Truewhile blob_exists: index += 1 blob_exists = self._blob_exists(Constants.storage_container_name, "elastavm" + str(index) + ".vhd") vm_media_link = self._make_blob_url(vars.storage_account_name, Constants.storage_container_name, "elastavm" + str(index) + ".vhd") self._create_vm_linux(vars.storage_account_name, vars.storage_account_name, "elastavm" + str(index), vm_media_link, vars.deploy_location, index, vars.username, vars.password)
結果是,我們可以為我們的雲端服務添加多個虛擬機器。
以上都是從 Setup.py 檔案完成的。你可以在下面地址的檔案中看到上面所有代碼:
https://github.com/elastacloud/python-vmdepot-deploy/blob/master/elastacloud/pyvms/Setup.py
根據 readme.md 中的指示啟用指令碼,你就可以準備開始了。
你可以在下面地址複製 Windows Azure 的 Python SDK: :
https://github.com/WindowsAzure/azure-sdk-for-python
樂之!