您的位置:首页 > 编程语言 > Python开发

openstack私有云布署实践【19 通过python客户端 创建实例VM指定IP地址】

2017-01-16 12:02 381 查看
还有一种创建方式 是使用py开发工具,调用openstackclient的方法进行创建实例 ,好处就是可随意指定我们要的虚拟机IP地址,需求的场景就是,某天我们需要主动分配一个比较熟知的IP用作某个服务组件

或者某天,你需要打包一个实例的快照,终止实例后,你想通过快照的方式将它恢复为原来的IP,可以使用以下方法。

以win7客户端为例。
先下载安装eclipse 安装
安装 eclipse 的python插件,插件安装方法可自行百度

本机,安装python2.7环境

安装完后,添加python到系统环境变量。因为我们后面要用它的cmd命令行进行下载安装openstackclient,环境变量方法可自行百度

下载python-pip工具插件,

解压到python安装目录下。

随后进入该pip目录,在空白处,按住Shift+鼠标右键,选“在此处打开命令窗口”

pip安装openstackclient
pip install openstackclient
安装完后基础的openstackclient端就完成了,直接可关闭窗口了,后续我们在eclipse上调试调用即可。

运行eclipse,新建一个python工程,创建一个pyDev项目

可以写调用api的工程模板了。
比如我在我的工作空间目录openstackdashboad下,创建了一个test.py模块。

手工创建双网卡IP实例脚本如下,也是参考官网提供,稍做了修改,如下我有些浅蓝注释,复制时记得把 <粉色注释> 可删除。

[align=left]# coding:utf-8[/align]
[align=left]import time[/align]
[align=left]import sys[/align]
[align=left]from novaclient.client import Client[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]reload(sys)[/align]
[align=left]sys.setdefaultencoding (" utf-8")[/align]
[align=left] [/align]
[align=left]def print_values_ip(ip_list):[/align]
[align=left] ip_dict_lisl = [][/align]
[align=left] for ip in ip_list:[/align]
[align=left] print( "-"*35 )[/align]
[align=left] print( "fixed_ip : %s" % ip.fixed_ip)[/align]
[align=left] print( "id : %s" % ip.id)[/align]
[align=left] print( "instance_id : %s" % ip.instance_id)[/align]
[align=left] print( "ip : %s" % ip.ip)[/align]
[align=left] print( "pool : %s" % ip.pool)[/align]
[align=left] [/align]
[align=left]def get_nova_credentials_v2():[/align]
[align=left] d = {}[/align]

[align=left] d['version'] = '2'[/align]
[align=left] d['username'] = "demo" [/align]
[align=left]#像我们登录dashboard一样,要用户名[/align]
[align=left] d['api_key'] = "你的租户密码" [/align]
[align=left]#像我们登录dashboard一样,要密码认证[/align]
[align=left] d['auth_url'] = "http://controller:5000/v2.0" [/align]
[align=left]#像我们平时登录dashboard一样,填写登录地址[/align]
[align=left] d['project_id'] = "demo" [/align]
[align=left]#项目名称[/align]
[align=left] d['region_name'] = "RegionOne" [/align]
[align=left]#区域名称[/align]

[align=left] return d[/align]
[align=left] [/align]
[align=left]def print_hosts(host_list):[/align]
[align=left] for host in host_list:[/align]
[align=left] print( "-"*35 )[/align]
[align=left] print( "host_name : %s" % host.host_name)[/align]
[align=left] print( "service : %s" % host.service)[/align]
[align=left] print( "zone : %s" % host.zone)[/align]
[align=left] print( "-"*35 )[/align]
[align=left] [/align]
[align=left]if __name__ == '__main__':[/align]
[align=left] credentials = get_nova_credentials_v2()[/align]
[align=left] nova_client = Client(**credentials)[/align]
[align=left] serviers = nova_client.servers.list()[/align]

[align=left]# print(serviers)[/align]
[align=left] image = nova_client.images.find(name= "20G_CentOS7_noLvm") [/align]
[align=left]#这个是我们做好上传的centos7镜像名称,比如官网上的cirros,可以是镜像名称,也可以是快照名称[/align]
[align=left] flavor = nova_client.flavors.find(name= "C2-M4G-D20G") [/align]
[align=left]#这个是我们要的创建的主机类型和大小名称,比如官网上的tiny\small\large等等[/align]
[align=left] net = nova_client.networks.find(label= "1040100") [/align]
[align=left]#这个是我们定义好的,公网网段名称,比如官方的public,这主声明方法是为了解析到public得到它的net-id,并附给net[/align]
[align=left] net2 = nova_client.networks.find(label= "17216100") [/align]
[align=left]#这个是我们定义好的,私有网段名称,比如官方的private,这主声明方法是为了解析到private 得到它的net-id,并附给net2[/align]
[align=left] nics = [{'net-id': net.id, 'v4-fixed-ip': '10.40.100.27'},{'net-id' : net2.id,'v4-fixed-ip': '172.16.100.27'}] [/align]
[align=left]#这个是我们要为net和net2手工指定的双网卡IP地址[/align]
[align=left] instance = nova_client.servers.create(name= "vm27", image=image,flavor=flavor, availability_zone="stg_zone" , nics=nics) [/align]
[align=left]#vm27这个是为虚拟机指定一个主机名称,"stg_zone"是我们分配主机到指定的zone区域中去。[/align]

[align=left] print("Sleeping for 5s after create command")[/align]
[align=left] time.sleep(5)[/align]
[align=left] print("List of VMs")[/align]

[align=left] print(nova_client.servers.list())[/align]

配置完,保存,运行,注意你的这个IP是之前没有分配出云的,查看可通过dashboard界面查看虚拟状态。

手工创建单网卡IP实例脚本如下

# coding:utf-8
import time
import sys
from novaclient.client import Client

reload(sys)
sys.setdefaultencoding("utf-8")

def print_values_ip(ip_list):
ip_dict_lisl = []
for ip in ip_list:
print("-"*35)
print("fixed_ip : %s" % ip.fixed_ip)
print("id : %s" % ip.id)
print("instance_id : %s" % ip.instance_id)
print("ip : %s" % ip.ip)
print("pool : %s" % ip.pool)

def get_nova_credentials_v2():
d = {}
d['version'] = '2'
d['username'] = "demo"
d['api_key'] = "你的租户密码"
d['auth_url'] = "http://controller:5000/v2.0"
d['project_id'] = "demo"
d['region_name'] = "RegionOne"
return d

def print_hosts(host_list):
for host in host_list:
print("-"*35)
print("host_name : %s" % host.host_name)
print("service : %s" % host.service)
print("zone : %s" % host.zone)
print("-"*35)

if __name__ == '__main__':
credentials = get_nova_credentials_v2()
nova_client = Client(**credentials)
serviers = nova_client.servers.list()
# print(serviers)
image = nova_client.images.find(name="20G_CentOS7.1_noLVM")
flavor = nova_client.flavors.find(name="C2-M4G-D20G")
net = nova_client.networks.find(label="10120100")
nics = [{'net-id': net.id,'v4-fixed-ip':'10.40.150.150'}]
instance = nova_client.servers.create(name="zabbixserver", image=image,flavor=flavor, availability_zone="stg_zone", nics=nics)
print("Sleeping for 5s after create command")
time.sleep(5)
print("List of VMs")
print(nova_client.servers.list())
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: