由於Openstack更新很快,現在准備搭建基於Queen版本的Openstack,Queen版本要求keystone版本為V3,所以之前大多數接口都不能用了,百度了一下都沒有比較新的實例,官方文檔又過於簡單。所以簡單總結下各客戶端的調用方式,非常簡單的案例,僅供參考。
1 前期准備
1確保已經安裝了python
2根據需求安裝openstack相關服務調用的python庫
pip install python-openstackclient
確保版本大於3.0.0,所有服務調用都基於keystone,一定要安裝
pip install python-keystoneclient
pip install python-heatclient
pip install python-glanceclient
pip install python-novaclient
pip install python-neutronclient
3如果安裝的openstack的所有的入口ip都映射為controller,我們就需要在本機的/etc/hosts中也加一條映射
<ip> controller
2 獲取客戶端連接
1創建keystone session :最近版本的openstack所有服務都只能keystone v3版本才能調用,並且推薦session的方式。
from keystoneauth1.identity import v3
from keystoneauth1 import session
def get_keystone_session():
# auth_url為keystone的endpoint入口,新版本openstack中(Tenant租戶改名為project)
auth = v3.Password(auth_url="http://<ip>:5000/v3", username="",password="", project_name="",user_domain_id="", project_domain_id="")
sess = session.Session(auth=auth)
return sess
2獲取keystone客戶端
from keystoneclient.v3 import client as keyclient
def get_keystone_client():
sess = get_keystone_session()
keystone = keyclient.Client(session=sess)
return keystone
3獲取nova客戶端
from novaclient import client
def get_nova_client():
sess = get_keystone_session()
nova = client.Client(2, session=sess)
return nova
4獲取glance客戶端
from glanceclient import Client
def get_glance_client():
sess = get_keystone_session()
glance = Client('2', session=sess)
return glance
5獲取neutron客戶端
from neutronclient.v2_0 import client as ntclient
def get_neutron_client():
sess = get_keystone_session()
neutron = ntclient.Client(session=sess)
return neutron
6獲取heat客戶端
heat客戶端的獲取比較復雜,嘗試了多種方式發現只能通過keystone客戶端返回的token的認證
from heatclient import client as hclient
def get_heat_client():
creds = {}
creds['username'] = ''
creds['password'] = ''
creds['auth_url'] = 'http://<ip>:5000/v3'
creds['project_name'] = ''
ks_client = keyclient.Client(**creds)
heat_endpoint = ks_client.service_catalog.url_for(service_type='orchestration', endpoint_type='publicURL')
# 后來需求Heat服務單獨改為HTTPS,可以在以下參數中加入 insecure=True
heat = hclient.Client('1', heat_endpoint, token=ks_client.auth_token)
return heat
3簡單測試
之前的獲取客戶端方式寫在openstackapi.py中方便調用
1keystone
import openstackapi as api
keystone = api.get_keystone_client()
list = keystone.projects.list()
for p in list:
print p
2nova
python-novaclient8之后network被移除,應該用neutron代替
import openstackapi as api
def nova_create_flavor(nova, instance_name):
nova.servers.create(instance_name)
def show_server_info(nova):
instances = nova.servers.list()
for instance in instances:
print instance
def show_flavor_info(nova):
flavors = nova.flavors.list()
for flavor in flavors:
print flavor
def get_instance_id(nova, instance_name):
instances = nova.servers.list()
for instance in instances:
if instance.name == instance_name:
return instance.id
def get_instance(nova, instance_id):
return nova.servers.get(instance_id)
def get_flavor_id(nova, flavor_name):
flavors = nova.flavors.list()
for flavor in flavors:
if flavor.name == flavor_name:
return flavor.id
if __name__ == '__main__':
nova = api.get_nova_client()
show_server_info(nova)
show_flavor_info(nova)
id = get_instance_id(nova, <name>)
print id
instance = get_instance(nova,id)
print '################################'
print instance
3glance
創建上傳qcow2鏡像,刪除鏡像
import openstackapi as api
def list_image():
list = glance.images.list()
for image in list:
print image.name, image.id, image.status
def get_id_by_name(name):
list = glance.images.list()
id = ''
for image in list:
if image.name == name:
id = image.id
return id
if __name__ == "__main__":
glance = api.get_glance_client()
print '####### list #########'
list_image()
name = "test-py-api"
glance.images.create(name=name, disk_format="qcow2", container_format="bare", is_public="true")
print '####### list after create #########'
list = list_image()
id = get_id_by_name(name)
glance.images.upload(id , open('/目錄/***.qcow2', 'rb'))
print '####### list after upload qcow2 #########'
list_image()
glance.images.delete(id)
print '####### list after delete qcow2 #########'
list_image()
4neutron
import openstackapi as api
def show_network_info(neutron):
print ' #### network list ####'
networks = neutron.list_networks()
for network in networks:
print network
if __name__ == '__main__':
neutron = api.get_neutron_client()
show_network_info(neutron)
5heat
首先寫好一個heat編排模板,然后通過接口上傳並且自動執行編排
import openstackapi as api
from heatclient.common import template_utils
def get_heat_file():
path = "/目錄/***.yaml"
tpl_files, template = template_utils.get_template_contents(path)
create_fields = {
'stack_name': '',
'disable_rollback': 'false',
'parameters': '',
'template': template,
'files': dict(list(tpl_files.items()))
}
return create_fields
def list_stack(heat):
list = heat.stacks.list()
for stack in list:
print stack
if __name__ == "__main__":
heat = api.get_heat_client()
create_fields = get_heat_file()
heat.stacks.create(**create_fields)
list_stack(heat)
4接口匯總
from keystoneauth1.identity import v3
from keystoneauth1 import session
from keystoneauth1 import loading
from keystoneclient.v3 import client as keyclient
from glanceclient import Client
from novaclient import client
from neutronclient.v2_0 import client as ntclient
from heatclient import client as hclient
def get_keystone_session():
loader = loading.get_plugin_loader('password')
auth = v3.Password(auth_url="http://<Openstack Controller Ip>:5000/v3", username="admin",password="<pwd>", project_name="admin",user_domain_id="default", project_domain_id="default")
sess = session.Session(auth=auth)
return sess
def get_nova_client():
sess = get_keystone_session()
nova = client.Client(2, session=sess)
return nova
def get_glance_client():
sess = get_keystone_session()
glance = Client('2', session=sess)
return glance
def get_keystone_client():
sess = get_keystone_session()
keystone = keyclient.Client(session=sess)
return keystone
def get_neutron_client():
sess = get_keystone_session()
neutron = ntclient.Client(session=sess)
return neutron
def get_heat_client():
creds = {}
creds['username'] = 'admin'
creds['password'] = 'admin1234'
creds['auth_url'] = 'http://<Openstack Controller Ip>:5000/v3'
creds['project_name'] = 'admin'
ks_client = keyclient.Client(**creds)
heat_endpoint = ks_client.service_catalog.url_for(service_type='orchestration', endpoint_type='publicURL')
heat = hclient.Client('1', heat_endpoint, token=ks_client.auth_token)
return heat
def list_images():
glance = get_glance_client()
list = glance.images.list()
return list
def show_images():
list = list_images()
for image in list:
print image.name, image.id, image.status
def get_image_id_by_name(image_name):
list = list_images()
id = ''
for image in list:
if image.name == image_name:
id = image.id
return id
return id
def upload_image(image_name, image_path):
glance = get_glance_client()
glance.images.create(name=image_name, disk_format="qcow2", container_format="bare", is_public="true")
id = get_image_id_by_name(image_name)
glance.images.upload(id , open(image_path, 'rb'))
def delete_image(image_name):
glance = get_glance_client()
id = get_image_id_by_name(image_name)
if id != '':
glance.images.delete(id)