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を使うというやり方をしてたけどその必要がないととてもラクですね。