# 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**)。
![](https://box.kancloud.cn/2016-01-07_568e4d67df89b.png)
**图 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 时,会发生什么。
![](https://box.kancloud.cn/2016-01-07_568e4d6802344.png)
**图 2 Azure xplat cli**
还有大量的可能的命令,你可以从基地蔚蓝命令。说,你注意到 vm 命令中的帮助输出**图 2**。您可以深入到要更好地理解如何使用它,只需输入蔚蓝 vm 命令的命令 (请参见**图 3**):
![](https://box.kancloud.cn/2016-01-07_568e4d682bd28.png)
**图 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**确认脚本的输出,并列出了已创建的所有虚拟机。
![](https://box.kancloud.cn/2016-01-07_568e4d684d1ac.png)
**图 9 的虚拟机的最后名单**
每个你的虚拟机已成功创建。你可以连检查回到您的门户网站,以确认已创建机器,指定虚拟网络的一部分。使用在 GitHub 资料库 [bit.ly/azure-xplat-cli](http://bit.ly/azure-xplat-cli) 开始脚本使用 Node.js 你蔚蓝的安装程序。
## 总结
蔚蓝的 xplat cli 允许您完全实现自动化配置和部署 Azure 资源可以在几乎任何操作系统使用的便携式脚本中的过程。它还允许您使用源控制和配置文件来简化共享。你可以有多个版本的 config.json,每一个代表测试、 临时和生产部署模型。
快速、 高效地,您也可以重新创建部署过程。即将到来的蔚蓝资源管理器微软将在 2015 年发行将超越了什么所示,但这种做法是与 Azure 资源管理器将做什么几乎完全相同 — — 它们是以声明方式指定资源在 Azure 数据中心中的设置如何。