使用Python脚本来控制Windows Azure的简单教程


Posted in Python onApril 16, 2015

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 。

选择设置标签:

使用Python脚本来控制Windows Azure的简单教程

从菜单中选择管理证书:

使用Python脚本来控制Windows Azure的简单教程

下方的应用工具条包含一个上传按钮:

使用Python脚本来控制Windows Azure的简单教程

选择这个按钮,上传前面导出的 .cer 文件:

使用Python脚本来控制Windows Azure的简单教程

在“结果”面板中你应该会看到类似这样的证书入口。

使用Python脚本来控制Windows Azure的简单教程
为了有助于解释这篇文章,我已经写了一个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 = -1
blob_exists = True
while 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

乐之!

Python 相关文章推荐
Python实现的简单万年历例子分享
Apr 25 Python
python模块之StringIO使用示例
Apr 08 Python
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
Apr 09 Python
Python判断某个用户对某个文件的权限
Oct 13 Python
详解Python核心对象类型字符串
Feb 11 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
Apr 06 Python
Python3对称加密算法AES、DES3实例详解
Dec 06 Python
python中struct模块之字节型数据的处理方法
Aug 27 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
Jun 04 Python
python线程池 ThreadPoolExecutor 的用法示例
Oct 10 Python
python基础之匿名函数详解
Apr 21 Python
关于python pygame游戏进行声音添加的技巧
Oct 24 Python
在Python下利用OpenCV来旋转图像的教程
Apr 16 #Python
在Python中使用Neo4j数据库的教程
Apr 16 #Python
使用Python的Zato发送AMQP消息的教程
Apr 16 #Python
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
Apr 16 #Python
使用Python编写一个简单的tic-tac-toe游戏的教程
Apr 16 #Python
Python基于scrapy采集数据时使用代理服务器的方法
Apr 16 #Python
在Python的gevent框架下执行异步的Solr查询的教程
Apr 16 #Python
You might like
手冲咖啡应该是现代精品咖啡店的必备选项吗?
2021/03/03 冲泡冲煮
PHP生成验证码时“图像因其本身有错无法显示”的解决方法
2013/08/07 PHP
Java和PHP在Web开发方面对比分析
2015/03/01 PHP
ThinkPHP实现更新数据实例详解(demo)
2016/06/29 PHP
锋利的jQuery 要点归纳(一) jQuery选择器
2010/03/21 Javascript
Javascript中的isNaN函数使用说明
2011/11/10 Javascript
JQuery验证jsp页面属性是否为空(实例代码)
2013/11/08 Javascript
详解jquery uploadify 上传文件
2013/11/09 Javascript
如何在JavaScript中实现私有属性的写类方式(二)
2013/12/04 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
2015/09/15 Javascript
JavaScrip调试技巧之断点调试
2015/10/22 Javascript
基于javascript实现全国省市二级联动下拉选择菜单
2016/01/28 Javascript
设置点击文本框或图片弹出日历控件的实现代码
2016/05/12 Javascript
Node.js的环境安装配置(使用nvm方式)
2016/10/11 Javascript
jQuery时间日期三级联动(推荐)
2016/11/27 Javascript
Angular 2父子组件数据传递之@Input和@Output详解(下)
2017/07/05 Javascript
Vue2.0 实现移动端图片上传功能
2018/05/30 Javascript
小程序实现发表评论功能
2018/07/06 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
[00:50]2014DOTA2国际邀请赛 NEWBEE战队回顾
2014/08/01 DOTA
pandas数据框,统计某列数据对应的个数方法
2018/04/11 Python
python urllib爬虫模块使用解析
2019/09/05 Python
python实现两个字典合并,两个list合并
2019/12/02 Python
TFRecord文件查看包含的所有Features代码
2020/02/17 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
2020/12/05 Python
Tommy Hilfiger澳洲官网:美国高端休闲领导品牌
2020/12/16 全球购物
英文简历自荐信范文
2013/12/11 职场文书
秋季婚礼证婚词
2014/01/11 职场文书
幼儿园六一儿童节文艺汇演主持词
2014/03/21 职场文书
师范学院毕业生求职信
2014/06/24 职场文书
2014年财政局工作总结
2014/12/09 职场文书
关于运动会的宣传稿
2015/07/23 职场文书
纯html+css实现打字效果
2021/08/02 HTML / CSS
解析redis hash应用场景和常用命令
2021/08/04 Redis
ubuntu安装jupyter并设置远程访问的实现
2022/03/31 Python
vue中this.$http.post()跨域和请求参数丢失的解决
2022/04/08 Vue.js