thirose’s blog

openstackやpythonなどなど

openstackのnovaclient使ってvm instanceを立ち上げる

最近まで知らないことだらけだったので、vm instanceを作るときはnovaclient以外にも
neutronclientとかglanceclientとかを使いnetworkやIamageやflavorの情報をとってinstanceを作成してました。
今回は、novaclientでできることはnovaclientでやることにしたので、novaclient以外は使ってません。
なぜnovaclientにまとめたかというと、multi-regionでopenstackの運用を行うとclientを宣言する時にregionの指定が必要になります。
その時に、修正漏れが発生する可能性がありそうだなと思いなるべく必要なさそうなclientは使わないようにしてみました。

# -*- coding: utf-8 -*-

from novaclient import client as nova_client
from keystoneauth1 import session
from keystoneauth1.identity import v3


def get_keystone_session():
    params = {
        'auth_url': KEYSTONE_ENDPOINT,
        'username': USERNAME,
        'password': PASSWORD,
        'user_domain_name': 'Default',
        'project_id': PROJECT_ID,
    }
    auth = v3.Password(**params)
    sess = session.Session(auth=auth)
    return session


def create_instance(my_session):
    nova = nova_client.Client(YOUR_NOVA_VERSION, session=my_session)
    # When your environment uses the multi-region, you need the region_name. 
    # nova = nova_client.Client(YOUR_NOVA_VERSION, session=my_session, region_name='RegionOne')
    net = nova.neutron.find_network(NETWORK_TYPE)
    flavor = nova.flavors.find(name=FLAVOR_NAME)
    image = nova.glance.find_image(OS_NAME)
    instance = nova.servers.create(name=INSTANCE_NAME, flavor=flavor, image=image, nics=[{'net-id': net.id}])
    return instance


if __name__ == '__main__':
    my_session = get_keystone_session()
    result = create_instance(my_session)
    print(result)

コメントアウトしてありますが、もしregion情報必要な場合はregion_nameを指定すると問題なく作成できます。

ちなみに、今までは

neutron = neutron_client.Client(session=YOUR_SESSION)
net = neutron.list_networks(name=NETWORK_TYPE)

のように、必要なcomponentから必要な情報をとってくるために、各clientを使うというやり方をしてたけどその必要がないととてもラクですね。