ConoHaでサーバーを自動作成するためのPythonスクリプト

この記事は約 9 分で読めます。

安価で、豊富な機能が充実してる VPS サービスプロバイダーとして定評のある「ConoHa」。

このブログでは、とてもとてもお世話になっています。

この ConoHa では、APIを使ってサーバーやネットワークの操作が自由自在にできます。

そこで、色んなことを手軽に試せるように、匠はポンポンとサーバーが作れる Python スクリプトを書いてみました。

同じ境遇の方、あるいは Python 初学者のサンプルソースとして、お役に立てれば幸いです。

スポンサーリンク

ConoHaでサーバーを自動作成するための Python スクリプト

前提

ConoHa でしか使えません。ConoHa の API 専用のスクリプトです。

ちなみに、自動作成といっているのは、スクリプトを走らせれば自動的に(繰り返し)同じ仕様のサーバーを作成できると意味です。

Windowsならタスクスケジューラ、Linxu なら Cron に登録すれば、さらに色々できますよね。

スクリプトソース

#!/bin/python

from requests.exceptions import *
import base64
import json
import requests
import sys

''' === Setting Parameters ============================= '''
APIUSER = '{APIユーザー名}'
APIPASS = '{APIパスワード}'
TENANT = '{テナントID}'
ROOTPASS = '{ROOTパスワード}'
SECGRP = '{セキュリティグループ}'
STAG = '{ネームタグ}'
IMAGENAME = '{VPSイメージ名}'
FLAVORNAME = "{VPSプラン名}"
SCRIPTPATH = '{スタートアップスクリプトのパス}'
''' ==================================================== '''


def get_conoha_token(tid, user, passwd):
    ''' Function of getting a text of conoha token'''
    _api = 'https://identity.tyo1.conoha.io/v2.0/tokens'
    _header = {'Accept': 'application/json'}
    _body = {
        "auth": {
            "passwordCredentials": {
                "username": user,
                "password": passwd
                },
            "tenantId": tid
        }}

    try:
        _res = requests.post(_api, data=json.dumps(_body), headers=_header)
        return (json.loads(_res.text))["access"]["token"]["id"]
    except (ValueError, NameError, ConnectionError, RequestException, HTTPError) as e:
        print('Error: Could not get ConoHa token text.', e)
        sys.exit()
        

def get_flavor_uuid(tid, token, flavorname):
    ''' Function of getting Conoha Server Plan ID from Server Plan Name '''
    _api = 'https://compute.tyo1.conoha.io/v2/' + tid + '/flavors/detail'
    _header = {'Accept': 'application/json', 'X-Auth-Token': token}
    try:
        _res = requests.get(_api, headers=_header)
        for server in json.loads(_res.content)['flavors']:
            if server['name'] == flavorname:
                return server['id']
    except (ValueError, NameError, ConnectionError, RequestException, HTTPError) as e:
        print('Error: Could not get ConoHa flavor uuid.', e)
        sys.exit()


def get_image_uuid(tid, token, imagename):
    ''' Function of getting Conoha Server Image ID from Server Image Name '''
    _api = 'https://compute.tyo1.conoha.io/v2/' + tid + '/images/detail'
    _header = {'Accept': 'application/json', 'X-Auth-Token': token}
    
    try:
        _res = requests.get(_api, headers=_header)
        for server in json.loads(_res.content)['images']:
            if server['name'] == imagename:
                return server['id']
    except (ValueError, NameError, ConnectionError, RequestException, HTTPError) as e:
        print('Error: Could not get ConoHa image uuid.¥n', e)
        sys.exit()


def get_startup_base64(src_path):
    ''' Function of transforming from shell script to base64 value '''
    with open(src_path, encoding='utf-8') as f:
        _script_text = f.read()

    try:
        return base64.b64encode(_script_text.encode('utf-8')).decode()
    except (ValueError, NameError, ConnectionError, RequestException, HTTPError) as e:
        print('Error: Could not get base64 value of startup script.¥n', e)
        sys.exit()
    

def create_server(tid, sgroup, stag, token, admin_pass, fid, iid, Sval):
    ''' Function of creatting New Server '''
    _api = 'https://compute.tyo1.conoha.io/v2/' + tid + '/servers'
    _header = {'Accept': 'application/json', 'X-Auth-Token': token}
    _body = {"server": {
                "security_groups": [{"name": sgroup}],
                "metadata": {"instance_name_tag": stag},
                "adminPass": admin_pass,
                "flavorRef": fid,
                "imageRef": iid,
                "user_data": Sval
        }}

    try:
        _res = requests.post(_api, data=json.dumps(_body), headers=_header)
        if json.loads(_res.text)['server']:
            print('Success: WordPress new server started!')
    except (ValueError, NameError, ConnectionError, RequestException, HTTPError) as e:
        print('Error: Could not create server.', e)
        sys.exit()
    except KeyError:
        print('Error Code   : {code}¥nError Message: {res}'.format(
                code=_res.text['badRequest']['message'],
                res=_res.text['badRequest']['code']))
        sys.exit()

def main():
    # Get API token
    Token = get_conoha_token(TENANT, APIUSER, APIPASS)

    # Get Flavor UUID
    Fuuid = get_flavor_uuid(TENANT, Token, FLAVORNAME)

    # Get Flavor UUID
    Iuuid = get_image_uuid(TENANT, Token, IMAGENAME)

    # Get Base64 value of Startup script
    Svalue = get_startup_base64(SCRIPTPATH)

    # Create New Server
    create_server(TENANT, SECGRP, STAG, Token, ROOTPASS, Fuuid, Iuuid, Svalue)
        
if __name__ == '__main__':
    main()

仕様

動作条件

  • Python3 で動作します。動作確認は Python 3.6 環境。
  • Requestsモジュールを別途インストールしておいてください。

パラメータ

パラメータ説明
{APIユーザー名}
{APIパスワード}
{テナントID}
APIに関するパラメータを設定します。いずれも ConoHa 管理コンソールから取得して、置き換えてください。手順はこちらをご覧ください。
{ROOTパスワード}VPSの初期rootパスワードを設定します。9文字以上、70文字以下、アルファベット大文字、小文字、数字、記号をそれぞれ含めてください。(利用可能な記号: \^$+-*/|()[]{}.,?!_=&@~%#:;‘“ )
{セキュリティグループ}セキュリティグループ名を指定します。「gncs-ipv4-all」を設定すれば、IPv4 の通信ポート全てを許可します。もし他のセキュリティグループを指定したい場合には、こちらの API を使って調べる必要があります。
{ネームタグ}VPS に任意のネームタグを設定します。
{VPSイメージ名}UUIDではなく、「vmi-wordpress-kusanagi」のような名称を指定します。もし分からない場合はこちらのスクリプトで取得してください。
{VPSプラン名}UUIDではなく、「g-1gb」のような名称を指定します。もし分からない場合はこちらのスクリプトで取得してください。
{スタートアップスクリプトのパス}スタートアップスクリプトのパスを指定します。指定するスタートアップスクリプトの仕様に合ったテキストファイルを指定します。こちらの「user-data(スタートアップスクリプト設定) について」の項も一緒にご覧下さい。

なお、このスクリプトで指定できるスタートアップスクリプトは、こんなものを書いてみました。

一発でWordPressのダミーサイトを作成するスタートアップスクリプト for ConoHa - Qiita
WordPressの様々な検証したり、使い方を練習したりするためにダミーデータでWEBサイトをポンポン作りたくなったりしませんか?安価な (で作成してたりする身なわけで...

興味がある方は、ぜひ使ってみてください。

ちなみに、スタートアップスクリプトの内容によっては、定期的にサーバーを作成して、定期的に廃棄する、といった使い方もできます。

スポンサーリンク

ConoHaでサーバーを自動作成するためのPythonスクリプト まとめ

ConoHa VPS は、安価なVPSながら非常に多様なAPIが揃っていて便利ですね。

今回ご紹介したスクリプトを使えば、定期的に使い捨てサーバーを作ることも可能になります。

パパッと作って、試して、サクッと捨てる。

いいですね、昨今のサーバー事情にあって素晴らしいですね!しかも安い!

なお、匠は下記の書籍をかじった程度のプログラミング能力しかありません。プログラムソースに違和感があれば是非ともご指摘くださいませ。


ITセキュリティを生業とするエンジニアという名の社畜です。妻と子供一人と共に、毎日を楽しく生きてます。このブログを通じて、ただひたすらに共有欲を発散しています。詳しいプロフィールはこちら