使用python客户端从openstach中的卷创建实例

使用python客户端从openstach中的卷创建实例,python,openstack,novaclient,openstack-cinder,Python,Openstack,Novaclient,Openstack Cinder,我正在尝试使用python客户端从openstack中的可引导卷创建一个实例 我采取的步骤如下: 步骤1:创建一个具有100GB映像“Centos”的卷。 步骤2:使用我在步骤1中创建的卷创建一个实例 但是,我一定是做错了什么,或者遗漏了一些信息,所以无法完成任务 以下是我在python shell中的命令 import time, getpass from cinderclient import client from novaclient.client import Client pro

我正在尝试使用python客户端从openstack中的可引导卷创建一个实例

我采取的步骤如下:

步骤1:创建一个具有100GB映像“Centos”的卷。 步骤2:使用我在步骤1中创建的卷创建一个实例

但是,我一定是做错了什么,或者遗漏了一些信息,所以无法完成任务

以下是我在python shell中的命令

import time, getpass
from cinderclient import client
from novaclient.client import Client


project_name = 'project'
region_name = 'region'
keystone_link = 'https://keystone.net:5000/v2.0'
network_zone = "Public"
key_name = 'key_pair'

user = 'user'
pswd = getpass.getpass('Password: ')



# create a connection
cinder = client.Client('1', user, pswd, project_name, keystone_link, region_name = region_name)

# get the volume id that we will attach
print(cinder.volumes.list())
[<Volume: 1d36203e-b90d-458f-99db-8690148b9600>, <Volume: d734f5fc-87f2-41dd-887e-c586bf76d116>]

vol1 = cinder.volumes.list()[1]
vol1.id

block_device_mapping = {'device_name': vol1.id, 'mapping': '/dev/vda'}



### +++++++++++++++++++++++++++++++++++++++++++++++++++++ ###
# now create a connection with nova and create then instance object
nova = Client(2, user, pswd, project_name, keystone_link, region_name = region_name)

# find the image 
image = nova.images.find(name="NETO CentOS 6.4 x86_64 v2.2")

# get the flavor
flavor = nova.flavors.find(name="m1.large")

#get the network and attach
network = nova.networks.find(label=network_zone)
nics = [{'net-id': network.id}]

# get the keyname and attach
key_pair = nova.keypairs.get(key_name)

s1 = 'nova-vol-test'

server = nova.servers.create(name = s1, image = image.id, block_device_mapping = block_device_mapping, flavor = flavor.id, nics = nics, key_name = key_pair.name)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/site-packages/novaclient/v1_1/servers.py", line 902, in create
    **boot_kwargs)
  File "/usr/lib/python2.6/site-packages/novaclient/v1_1/servers.py", line 554, in _boot
    return_raw=return_raw, **kwargs)
  File "/usr/lib/python2.6/site-packages/novaclient/base.py", line 100, in _create
    _resp, body = self.api.client.post(url, body=body)
  File "/usr/lib/python2.6/site-packages/novaclient/client.py", line 490, in post
    return self._cs_request(url, 'POST', **kwargs)
  File "/usr/lib/python2.6/site-packages/novaclient/client.py", line 465, in _cs_request
    resp, body = self._time_request(url, method, **kwargs)
  File "/usr/lib/python2.6/site-packages/novaclient/client.py", line 439, in _time_request
    resp, body = self.request(url, method, **kwargs)
  File "/usr/lib/python2.6/site-packages/novaclient/client.py", line 433, in request
    raise exceptions.from_response(resp, body, url, method)
novaclient.exceptions.BadRequest: Block Device Mapping is Invalid: failed to get volume /dev/vda. (HTTP 400) (Request-ID: req-2b9db4e1-f24f-48c6-8660-822741ca52ad)
>>>
导入时间,getpass 从cinderclient导入客户端 从novaclient.client导入客户端 项目名称='project' 地区名称='地区' keystone_linkhttps://keystone.net:5000/v2.0' 网络区域=“公共” 密钥名称='密钥对' 用户='user' pswd=getpass.getpass('密码:') #创建连接 cinder=client.client('1',用户,pswd,项目名称,keystone链接,区域名称=区域名称) #获取要附加的卷id 打印(cinder.volumes.list()) [, ] vol1=cinder.volumes.list()[1] 卷1.id block_device_mapping={'device_name':vol1.id,'mapping':'/dev/vda'} ### +++++++++++++++++++++++++++++++++++++++++++++++++++++ ### #现在创建与nova的连接,然后创建实例对象 nova=客户端(2,用户,pswd,项目名称,keystone链接,区域名称=区域名称) #找到图像 image=nova.images.find(name=“NETO CentOS 6.4 x86_64 v2.2”) #尝到味道 flavor=nova.flavors.find(name=“m1.large”) #获取网络并连接 network=nova.networks.find(label=network\u zone) NIC=[{'net-id':network.id}] #获取密钥名并附加 key\u pair=nova.keypairs.get(key\u name) s1=‘新星体积测试’ server=nova.servers.create(name=s1,image=image.id,block\u device\u mapping=block\u device\u mapping,flavor=flavor.id,nics=nics,key\u name=key\u pair.name) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“/usr/lib/python2.6/site packages/novaclient/v1_1/servers.py”,第902行,在create中 **靴子(kwargs) 文件“/usr/lib/python2.6/site packages/novaclient/v1_1/servers.py”,第554行,在_boot中 return_raw=return_raw,**kwargs) 文件“/usr/lib/python2.6/site packages/novaclient/base.py”,第100行,在创建 _resp,body=self.api.client.post(url,body=body) 文件“/usr/lib/python2.6/site packages/novaclient/client.py”,第490行,在post中 返回自我请求(url,'POST',**kwargs) 文件“/usr/lib/python2.6/site packages/novaclient/client.py”,第465行,在请求中 resp,body=self.\u time\u请求(url,方法,**kwargs) 文件“/usr/lib/python2.6/site packages/novaclient/client.py”,第439行,在时间请求中 resp,body=self.request(url,方法,**kwargs) 文件“/usr/lib/python2.6/site packages/novaclient/client.py”,第433行,在请求中 从_响应(resp、body、url、method)引发异常 novaclient.exceptions.BadRequest:块设备映射无效:无法获取卷/dev/vda。(HTTP 400)(请求ID:req-2b9db4e1-f24f-48c6-8660-822741ca52ad) >>> 我试图找到任何文档,这样我就可以自己解决这个问题,但是,我无法做到

如果有人曾经尝试过这个,我会很感激有人在这方面的帮助

谢谢,
Murtaza

我使用这本字典就可以让它正常工作:

block_dev_mapping = {'vda':'uuid of the volume you want to use'}
然后我在create方法中调用它,如下所示:

instance = nova.servers.create(name="python-test3", image='', block_device_mapping=block_dev_mapping,
                                    flavor=flavor, key_name="my-keypair", nics=nics)

我确实尝试过这个block_dev_mapping={'vda':'uuid of the volume you want use'}和其他变体,但是,它们似乎都不起作用。令人惊讶的是,它现在起作用了。谢谢你的回复。@MurtazaPitalwala那么,我们知道为什么它现在能令人惊讶地工作吗?