Il presente articolo è stato tradotto automaticamente.

Microsoft Azure

使用 JavaScript 的跨平臺雲自動化

Steven Edouard

不是大夥兒微軟 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 並安裝適當的 Node.js 包為您的系統。在安裝節點之後,您可以在查看 azure cli 套裝程式 npmjs.org/package/azure-cli

套裝程式清單給你在 CLI 中,以及簡單的命令列來安裝包的所有相關檔。這個包是 CLI 中,所以它很有意義,在全球的 Node.js 包存儲區中安裝,它通過指定-g,所以你可以從任何目錄中,而無需顯式調用從一個特定的目錄 CLI 蔚藍命令列調用:

npm install azure-cli -g

後的輸出從節點封裝管理員的幾行,你會有你安裝的 azure cli 和你可以立即使用它。

完全自我發現的 CLI

CLI 了不起的事情是完全自我發現。你可以很容易開始只是通過鍵入的命令你想更多地瞭解。圖 2 顯示了當您調用基本 CLI 命令 Azure 時,會發生什麼。

Azure xplat cli
圖 2 Azure xplat cli

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

CLI 命令,以創建一台虛擬機器
圖 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),您會注意到對 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 開始腳本使用 Node.js 你蔚藍的安裝程式。

總結

蔚藍的 xplat cli 允許您完全實現自動化配置和部署 Azure 資源可以在幾乎任何作業系統使用的可擕式腳本中的過程。它還允許您使用源控制和設定檔來簡化共用。你可以有多個版本的 config.json,每一個代表測試、 臨時和生產部署模型。

快速、 高效地,您也可以重新創建部署過程。即將到來的蔚藍資源管理器微軟將在 2015 年發行將超越了什麼所示,但這種做法是與 Azure 資源管理器將做什麼幾乎完全相同 — — 它們是以聲明方式指定資源在 Azure 資料中心中的設置如何。


Steven Edouard 是在微軟開發者福音傳教士。在此之前,他擔任在.NET 運行時團隊提供產品,如 Microsoft.NET Framework 4.5 和.NET 本地編譯的軟體測試工程師。現在他的激情所在令人興奮的人物,對雲計算服務,通過開展技術演示、 線上內容和演示文稿的無限潛力。

感謝以下的微軟技術專家對本文的審閱: Bruno Terkaly