# JavaScript 跨平臺云自動化
**[Steven 愛德華](https://msdn.microsoft.com/zh-cn/magazine/ee532098.aspx?sdmr=StevenEdouard&sdmi=authors)**
不是大伙兒微軟 Azure 具有跨平臺命令行界面 (xplat-cli) 為管理 Azure 基礎設施作為-即服務 (IaaS) 和平臺作為服務 (PaaS) 服務,但它確實。多年來,微軟一直主張使用 Windows PowerShell 作為一種腳本語言,運作良好,對資源調配的基于云的資源。但現在,更多的開發商參與部署和移動到云計算的應用程序,它使更多的意義,要使用 JavaScript。Azure 服務管理其他 Api 使這種跨平臺實現更容易。官方的蔚藍 xplat-cli 是在 Node.js,同一運行時常常用于構建高性能的 Web 站點和使用 JavaScript Api 實現的。
大樓頂上 Node.js 使腳本真正的跨平臺。這意味著您可以運行您的腳本,用于管理虛擬機 (Vm),SQL 數據庫、 Web 站點和虛擬網絡從任何一臺機器。這將使您做更多種類的語言和適用于更廣泛的客戶端計算機的自動化腳本 (請參閱**圖 1**)。
?
**圖 1 支持的腳本編寫環境**
有很多優點腳本云資源調配。例如,門戶網站不是可重復,需要人工輸入。另一個優點就是能夠源控制提供的步驟和部署您的服務使用不同的特定配置的值。這篇文章,走通過腳本創建 Vm 與親和力組和一個虛擬的網絡使用 Node.js 作為我們的腳本自動化環境相關聯的過程作好準備。
## 跨平臺 CLI
像 Azure PowerShell CLI,跨平臺版本提供了強大的腳本管理 IaaS、 PaaS 服務的能力。這允許您描述您的基礎結構代碼,它分享給你的團隊通過源代碼管理中,并自動創建開發、 測試和生產應用程序部署。
若要開始與 xplat cli,到長?[Nodejs.org](http://nodejs.org/)?并安裝適當的 Node.js 包為您的系統。在安裝節點之后,您可以在查看 azure cli 程序包?[npmjs.org/package/azure-cli](http://npmjs.org/package/azure-cli)。
程序包清單給你在 CLI 中,以及簡單的命令行來安裝包的所有相關文件。這個包是 CLI 中,所以它很有意義,在全球的 Node.js 包存儲區中安裝,它通過指定-g,所以你可以從任何目錄中,而無需顯式調用從一個特定的目錄 CLI 蔚藍命令行調用:
~~~
npm install azure-cli -g
~~~
后的輸出從節點軟件包管理器中的幾行,你會有你 azure cli 的安裝,您可以開始使用它立即。
## 完全自我發現的 CLI
CLI 了不起的事情是完全自我發現。你可以很容易開始只是通過鍵入的命令你想更多地了解。**圖 2**?顯示了當您調用基本 CLI 命令 Azure 時,會發生什么。

**圖 2 Azure xplat cli**
還有大量的可能的命令,你可以從基地蔚藍命令。說,你注意到 vm 命令中的幫助輸出**圖 2**。您可以深入到要更好地理解如何使用它,只需輸入蔚藍 vm 命令的命令 (請參見**圖 3**):

**圖 3 CLI 命令,以創建一臺虛擬機**
這個相同的模式適用于在 CLI 中的所有命令。它創建一個直觀的界面,為探索命令行。
## 從 CLI 訪問您的訂閱
不足為奇的是,大部分的蔚藍命令實際上行不通直到你注冊 Azure 的訂閱,并告訴什么蔚藍的訂閱以使用的命令行工具。類似于 Windows PowerShell 工具,您需要給您的訂閱的 CLI 訪問。有兩種方法做到這一點 — — 通過 Active Directory 帳戶使用微軟組織賬戶與 login 命令或使用該帳戶的便攜式.publishsettings 文件導入命令。后一種方法是更便于攜帶,因為它不需要組織帳戶設置。還有簡單的方法,通過執行下載您的.publishsettings:
~~~
azure account download
~~~
實際上,這將打開默認瀏覽器會要求你到你的 Azure 帳戶登錄并下載您的.publishsettings 文件的鏈接。文件下載后,您可以使用帳戶導入命令要加載的文件:
~~~
azure account import <PATH TO .publishsettings>
~~~
這將設置命令行使用 Azure 的訂閱在.publishsettings 在 CLI 上調用任何蔚藍命令中指定。若要查看如果 CLI 工作,打電話給站點列表命令輸出所有 Web 站點在您的當前訂購上運行。
## 從 CLI 創建一個 Dev VM
Vm 是 DevOps 情況下特別有用。您可以輕松地分配他們通過 xplat cli。
我最終會使用 CLI 通過他們使用在 Nodejs 上的 JavaScript 編寫腳本自動執行這些任務。例如,我將創建一個新的 Ubuntu VM。要這樣做,我需要找到一個 VM 映像。我可以通過執行命令獲取可用的虛擬機的列表:
~~~
azure vm image list
~~~
命令輸出顯示可用的公共和私人映像,您可以使用來提供一個 VM 的列表。由微軟,策劃了公眾形象,但您可以使用您自己上傳的圖片。
若要創建一個 VM,您需要一個數據中心的位置。若要獲取一個可以用來放置您的 VM 的有效位置的列表,請執行以下命令:
~~~
azure vm location list
~~~
當輸入到 vm 創建命令以創建一個新的 VM,您可以使用此位置:
~~~
azure vm create <yourdomainname> <imagename> <username> <password> --location '<selected datacenter region>'
~~~
現在,您已成功創建一個 VM 從命令行,看看多么容易,你可以做這個使用腳本。
## 在 JavaScript 中的腳本客場蔚藍資源
更多開發人員試圖使用 JavaScript 的事。資源調配的云資源也不例外。這支持了其他腳本語言,以及,Bash、 批處理和甚至 Windows PowerShell 等。對語言的選擇歸結為平臺上,你就會和您的語言首選項。
微軟將很快發布 Azure 資源管理器,將使用一個更具聲明性模型,而不是編程模型。直到 Azure 資源管理器是準備好了,你可以使用這些技術的一些自動化你的資源調配到云。
如果您將瀏覽密切的 azure cli npm 文件 ([npmjs.org/package/azure-cli](http://npmjs.org/package/azure-cli)),您會注意到對 azure cli 叫 azure 千奇百怪的依賴是一個庫。原來有人在開放源 Node.js 社區已經決定為 JavaScript 編寫 azure cli 命令行適配器。因為這座圖書館是一個命令行的包裝,你可以使用所有相同命令作為在 JavaScript 中的命令行上。下面是一個示例,將列出所有我們的虛擬機:
~~~
// Get the list of existing VMs on this subscription
scripty.invoke('vm list', function (err, result) {
? if (err) {
??? return cb(err);
? }
? for (var i in result) {
??? console.log(result[i].VMName);
? }
});
~~~
若要開始,請考慮一下你如何才能一批越南船民。首先,安裝必需的軟件包:
~~~
# a command-line wrapper for the azure-cli
npm install azure-scripty
# a small library that helps manage asynchronous tasks
npm install async
# a library that makes using JSON configuration files easy
npm install nconf
~~~
為了避免硬編碼分期、 測試和生產的配置設置,請使用配置文件來保持足夠的靈活性,為不同環境 (如開發、 測試和生產的腳本。調用此配置文件 config.json (見**圖 4**)。
**圖 4 Config.json 保持靈活的設置**
~~~
{
? "vnet_name":"azuretedvnet2",
? "vm_count": "3",
? "vm_image_name":
??? "b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_04-LTS-amd64-server-20140416.1-en-us-30GB",
? "vm_base_name":"sedouardmachine",
? "vm_username":"sedouard",
? "vm_password":"p@assW0rd",
? "affinity_group":{
??? "name":"azureteddemoaffinitygroup",
??? "label":"sedouard",
??? "location":"West US"
? }
}
~~~
您可以使用該配置文件來設置開發環境,完成三個是親和群 (azureteddemoaffinitygroup) 和相應的虛擬網絡 (azuretedvnet2) 的一部分的 Ubuntu Vm。這種方法是聲明性的意味著你只需要到一個配置文件來更改您的開發環境設置的方式進行更改。你也可以有其他版本的分期、 測試和生產 — — 和控制每個源。
自定義的 JavaScript 代碼將解析配置文件,所以將具有正確的名稱和值設置依賴項,如親合團體。在 config.json 文件中,該腳本可以讀取為親和組 (azureteddemoaffinitygroup) 所需的名稱。從那里,它可以查詢檢查以查看是否已創建了親和團體通過遍歷列表中已存在于數據中心中的資源調配親合團體 (見**圖 5**)。
**圖 5 創建親和組**
~~~
//////////////////////////////////////////////////////////////////////////////
//Creates an affinity group if the specified one doesn't exist
//////////////////////////////////////////////////////////////////////////////
function createAffinityGroup(cb) {
? console.log('Getting affinity groups...');
??scripty.invoke('account affinity-group list', function (err, result) {
??? // Check for errors.
??? if (err) {
????? return cb(err);
??? }
??? console.log('Current affinity groups');
??? // For debugging purposes, list out names of existing affinity groups.
??? for (var i in result) {
????? console.log(result[i].name);
??? }
??? // Get the name of the desired affinity group from the config.json file.
??? var affinityGroup = nconf.get('affinity_group').name;
??? var label = nconf.get('affinity_group').label;
??? // Verify that affinity group hasn't already been created.
??? for (var i in result) {
????? if (result[i].name === affinityGroup && result[i].label === label) {
??????? // The affinty group to use in the config already exists.
??????? return cb();
????? }
??? }
??? // Create affinity group because it doesn't exist.
??? console.log('Specified affinity group ' + affinityGroup +
????? ' does not exist, creating new one...');
??? var cmd = {
????? command: 'account affinity-group create',
????? positional: [affinityGroup],
????? location: '\"West US\"',
????? label: label
??? };
??? scripty.invoke(cmd, function (err) {
????? if (err) {
??????? cb(err);
????? }
????? return cb();
??? });
? });
}
~~~
請注意如何 azure 千奇百怪的圖書館讓您輕松地從 azure cli 通過回調函數結果參數解析輸出。它還允許您創建 CLI 命令,通過以聲明方式指定命令、 定位參數和命名參數。
在模式**圖 6**?是同一個你使用來創建你的虛擬網絡,使用 azure 千奇百怪的圖書館中以同樣的方式。
**圖 6 創建一個虛擬的網絡**
~~~
//////////////////////////////////////////////////////////////////////////////
//Creates the config specified vnet, if it doesn't already exist
//////////////////////////////////////////////////////////////////////////////
function createVirtualNetwork(cb) {
? console.log('Getting networks...');
? scripty.invoke('network vnet list', function (err, result) {
??? if (err) {
????? return cb(err);
??? }
??? var networkName = nconf.get('vnet_name');
??? for (var i in result) {
????? console.log(result[i].name);
??? }
??? // Check if VNet name listed in config.json exists.
??? // If it doesn't, create the VNet.
? });
}
~~~
中的代碼的一些**圖 6**?為簡潔起見,省略了,但同樣的模式存在。在配置文件中指定所需的資源。您需要提供它,如果它不存在。
一旦您已經創建的依賴關系 (親合團體和網絡),您可以創建一批越南船民。在 config.json 配置文件中的 vm_count 字段中指定的 Vm,您將創建數。遵循同樣的模式,首先列出訂閱當前 Vm,檢查是否任何 Vm,您將創建已經存在并創建只有那些根本不存在。
**圖 7**?將遵循一個簡單的算法來命名 Vm 使用 config.json 中的 vm_base_name 字段,并將數字 0 — — (vm_count-1) 追加到 VM 名稱的末尾。鑒于當前的 config.json,創建 sedouardmachine0、 sedouardmachine1 和 sedouardmachine2,因為沒有這些機器已經存在于該訂閱。
**圖 7 創建虛擬機提供的列表**
~~~
scripty.invoke('vm list', function (err, result) {
? if (err) {
??? return cb(err);
? }
? // Read the desired VM name from config.json.
? var baseName = nconf.get('vm_base_name');
? var vmNames = [];
? // Create the array of the computed VM names.
? for (var z = 0; z < count; z++) {
??? vmNames.push(baseName + z.toString());
? }
? // Go through the list of existing VMs.
? for (var i in result) {
??? for (var k in vmNames) {
????? if (result[i].VMName === vmNames[k]) {
??????? // A VM we intend on creating already exists on this sub.
??????? // Remove it on the list of VMs to create.
??????? delete vmNames[k];
????? }
??? }
? }
? // vmNames now only contains the name of VMs that do not exist.
? // Create them.
~~~
**圖 7**?證實 vmNames 數組中非現有虛擬機的列表。**圖 8**?將使用異步庫來管理會走開,創建的 Vm 的異步任務。
**圖 8 完成資源調配虛擬機**
~~~
var domainName = nconf.get('dns_name');
var userName = nconf.get('vm_username');
var password = nconf.get('vm_password');
var imageName = nconf.get('vm_image_name');
var vmCreationTasks = [];
var taskArguments = [];
for (var m in vmNames) {
? if (vmNames[m]) {
??? var cmd = {
????? command: 'vm create',
????? positional: [vmNames[m], imageName, userName, password],
????? 'affinity-group': nconf.get('affinity_group').name,
????? 'virtual-network-name': nconf.get('vnet_name')
??? }
??? // Define the async task function that will create each VM.
??? var task = function (args, cb) {
???? ?console.log('Creating vm ' + vmNames[args[0]]);
????? scripty.invoke(args[1], function (err) {
??????? if (err) {
????????? console.log('Vm creation failed: ' + vmNames[args[0]]);
????????? return cb(err);
??????? }
??????? console.log('vm creation of ' + vmNames[args[0]] + ' successful');
??????? cb();
??? });
? }
? // Bind this function to this context and pass the index and VM create command.
? task = task.bind(this, [m, cmd]);
? vmCreationTasks.push(task);
}
}
// Execute each VM creation task using the async libray.
async.series(vmCreationTasks, function (err) {
? if (err) {
??? return cb(err);
? }
? console.log('All VMs created successfully!');
? cb();
})
~~~
**圖 8**?,您需要創建的每個虛擬機創建一個任務。然后,您需要將這些任務添加到一個數組中,vmCreationTasks。每個任務的函數綁定到必要的論證,召喚蔚藍的 azure cli 使用正確的虛擬機名稱。隨后,使用異步庫運行系列中每個任務和執行與空值或錯誤參數,該參數指示是否 Vm 已成功創建回調。**圖 9**確認腳本的輸出,并列出了已創建的所有虛擬機。

**圖 9 的虛擬機的最后名單**
每個你的虛擬機已成功創建。你可以連檢查回到您的門戶網站,以確認已創建機器,指定虛擬網絡的一部分。使用在 GitHub 資料庫?[bit.ly/azure-xplat-cli](http://bit.ly/azure-xplat-cli)?開始腳本使用 Node.js 你蔚藍的安裝程序。
## 總結
蔚藍的 xplat cli 允許您完全實現自動化配置和部署 Azure 資源可以在幾乎任何操作系統使用的便攜式腳本中的過程。它還允許您使用源控制和配置文件來簡化共享。你可以有多個版本的 config.json,每一個代表測試、 臨時和生產部署模型。
快速、 高效地,您也可以重新創建部署過程。即將到來的蔚藍資源管理器微軟將在 2015 年發行將超越了什么所示,但這種做法是與 Azure 資源管理器將做什么幾乎完全相同 — — 它們是以聲明方式指定資源在 Azure 數據中心中的設置如何。