Python調用 Openstack 主要服務(keystone,nova,glance,neutron,heat)

因爲Openstack更新很快,如今準備搭建基於Queen版本的Openstack,Queen版本要求keystone版本爲V3,因此以前大多數接口都不能用了,百度了一下都沒有比較新的實例,官方文檔又過於簡單。因此簡單總結下各客戶端的調用方式,很是簡單的案例,僅供參考。python

1 前期準備

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

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中方便調用url

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代替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

3glance

建立上傳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()

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編排模板,而後經過接口上傳而且自動執行編排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)

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)
相關文章
相關標籤/搜索