メニュー
このサイトの運営者
\ Amazonタイムセール祭!最大12%ポイント還元 /

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

アイキャッチ:ConoHaでサーバーを自動作成するためのPythonスクリプト

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

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

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

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

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

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

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

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

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

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

\ Amazonタイムセール祭!最大12%ポイント還元/
Amazonで探す ▶
\最大10% 楽天ポイント還元!/
楽天市場で探す ▶

この記事の著者はこちら