因爲Openstack更新很快,如今準備搭建基於Queen版本的Openstack,Queen版本要求keystone版本爲V3,因此以前大多數接口都不能用了,百度了一下都沒有比較新的實例,官方文檔又過於簡單。因此簡單總結下各客戶端的調用方式,很是簡單的案例,僅供參考。python
1確保已經安裝了pythonapi
2根據需求安裝openstack相關服務調用的python庫session
pip install python-openstackclient
確保版本大於3.0.0,全部服務調用都基於keystone,必定要安裝dom
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中也加一條映射ide
<ip> controller
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
from keystoneclient.v3 import client as keyclient def get_keystone_client(): sess = get_keystone_session() keystone = keyclient.Client(session=sess) return keystone
from novaclient import client def get_nova_client(): sess = get_keystone_session() nova = client.Client(2, session=sess) return nova
from glanceclient import Client def get_glance_client(): sess = get_keystone_session() glance = Client('2', session=sess) return glance
from neutronclient.v2_0 import client as ntclient def get_neutron_client(): sess = get_keystone_session() neutron = ntclient.Client(session=sess) return neutron
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
以前的獲取客戶端方式寫在openstackapi.py中方便調用url
import openstackapi as api keystone = api.get_keystone_client() list = keystone.projects.list() for p in list: print p
python-novaclient8以後network被移除,應該用neutron代替code
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
建立上傳qcow2鏡像,刪除鏡像orm
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()
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)
首先寫好一個heat編排模板,而後經過接口上傳而且自動執行編排server
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)
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)