既存のFujitsu K5またはOpenStackサーバーにインターフェースを追加する
2016-12-20
Machine-translated — the English original is authoritative.
本日、顧客から既存のK5またはOpenStackインスタンスに別のインターフェースを追加する方法についての質問を受けました。このブログにたどり着いた方にも参考になれば幸いです。ここでは、環境がPython 2.7Xで使用できるように設定されていることを前提としています。ただし、ネイティブAPIコールを使用しているため、RESTfulコールをサポートしている他のスクリプト言語への移植は非常に簡単であるはずです。
注: Windows OS環境からスクリプトを実行する場合、パラメータの周囲にあるシングルクォート(‘)をダブルクォート(“)に置き換える必要がある場合があります。
この手順には、2つのAPIコールのみが必要です。
上記のリンクからわかるように、KeystoneとNovaの開発者APIドキュメントからネイティブなOpenStack APIコールを使用しました。Fujitsu K5もこれらのAPIの一部を強化し、より豊富な機能を提供しています。詳細はFujitsu K5のサイト – http://www.fujitsu.com/uk/solutions/cloud/k5/guides/ に文書化されています。
Pythonスクリプトの簡単なコマンドライン使用を可能にするために、APIコールの基本的なラッパーが含まれています。スクリプトは3つの入力パラメータを取ります –
-p 'project id'– これはサーバーが存在するプロジェクトのIDです-n 'network id'– これは新しいインターフェースが接続されるネットワークのIDです-s 'server id'– 言うまでもなく、これは追加インターフェースを必要とするサーバーのIDです
また、K5契約の詳細(ユーザー名、パスワードなど)をスクリプトにハードコードするのではなく、k5contractsettingsV7.pyという別のファイルからインポートすることに注意してください。このファイルはスクリプトを実行する前に作成する必要があります。このファイルを以下のスクリプトと同じディレクトリに配置してください。
スクリプトの実行例 –
~/Dev/K5/CustomerAPIExamples$ ./ExampleServerAPIv1.py
既存のサーバーにインターフェースを追加する方法を示すスクリプト。
完了後、OS内でインターフェースを設定する必要があります(再起動が必要になる場合があります)。
使用方法: ./ExampleServerAPIv1.py -n 'network id' -s 'server id' -p 'project id'
~/Dev/K5/CustomerAPIExamples$ ./ExampleServerAPIv1.py -n 'b514ab88-0a32-4b84-a73f-d5eabfd9de72' -p '7015d1478a4c4bd7b970215d7b0260dd' -s '8a33075f-0894-4b9b-8b16-047457952f74'
8cee65fa81a44c4e9f5f111e6baea420
{u'interfaceAttachment': {u'port_state': u'DOWN', u'port_id': u'f645038a-2744-4c92-b0a6-2d350086a9ed', u'fixed_ips': [{u'subnet_id': u'1588ed79-3efe-44a7-be5b-075eb653f3bd', u'ip_address': u'192.168.1.6'}], u'net_id': u'b514ab88-0a32-4b84-a73f-d5eabfd9de72', u'mac_addr': u'fa:16:3e:5f:77:07'}}
既存のK5またはOpenStackインスタンスに新しいネットワークインターフェースを追加するためのPythonスクリプトの例。
このファイルには、以下に表示されるものとは異なる方法で解釈またはコンパイルされる可能性のある、隠されたまたは双方向のUnicode文字が含まれています。確認するには、隠されたUnicode文字を表示するエディタでファイルを開いてください。
双方向のUnicode文字について詳しく見る
#!/usr/bin/python |
|
"""概要: 以下のことを実行するためのPython 2.7X API例呼び出し |
|
1. プロジェクトスコープのK5トークンを取得する |
|
2. 既存のサーバーに新しいインターフェースを接続する |
|
|
|
前提条件: K5契約のログイン詳細を含む同じディレクトリ内のk5contractsettingsV7.pyファイル |
|
|
|
adminUser = 'username' |
|
adminPassword = 'password' |
|
contract = 'contract\_name' |
|
contractid = 'contract\_id' |
|
defaultid = 'default\_project\_id' |
|
region = 'uk-1' |
|
|
|
著者: Graham Land |
|
日付: 20/12/16 |
|
Twitter: @allthingsclowd |
|
Github: <https://github.com/allthingsclowd> |
|
ブログ: <https://allthingscloud.eu> |
|
|
|
|
|
""" |
|
|
|
import requests |
|
import getopt |
|
import sys |
|
from k5contractsettingsV7 import * |
|
|
|
|
|
def get_scoped_token(adminUser, adminPassword, contract, projectid, region): |
|
"""概要 – ユーザー名とパスワードを使用してリージョンプロジェクトスコープトークンを取得する |
|
|
|
戻り値: |
|
オブジェクト: リージョンスコープのプロジェクトトークンオブジェクト |
|
|
|
引数: |
|
adminUser (TYPE): ユーザー名 |
|
adminPassword (TYPE): パスワード |
|
contract (TYPE): 契約名 |
|
projectid (TYPE): プロジェクトID |
|
region (TYPE): リージョン |
|
""" |
|
identityURL = 'https://identity.' + region + \ |
|
.cloud.global.fujitsu.com/v3/auth/tokens' |
|
|
|
try: |
|
response = requests.post(identityURL, \ |
|
headers={'Content-Type': 'application/json', \ |
|
'Accept': 'application/json'}, \ |
|
json={"auth": \ |
|
{"identity": \ |
|
{"methods": ["password"], "password": \ |
|
{"user": \ |
|
{"domain": \ |
|
{"name": contract}, \ |
|
"name": adminUser, \ |
|
"password": adminPassword \ |
|
}}}, \ |
|
"scope": \ |
|
{"project": \ |
|
{"id": projectid \ |
|
}}}) |
|
|
|
return response |
|
except: |
|
return 'Regional Project Token Scoping Failure' |
|
|
|
|
|
def attach_interface_to_server(k5token, project_id, net_id, server_id, region): |
|
"""概要 |
|
|
|
引数: |
|
k5token (TYPE): プロジェクトスコープトークン |
|
project_id (TYPE): サーバーが存在するプロジェクトのID |
|
net_id (TYPE): サーバーに追加される新しいインターフェースのネットワークID |
|
server_id (TYPE): 新しいインターフェースを受け取るサーバーのID |
|
region (TYPE): K5リージョン |
|
|
|
戻り値: |
|
TYPE: 説明 |
|
""" |
|
|
|
serverURL = 'https://compute.' + region + '.cloud.global.fujitsu.com/v2/' + \ |
|
project_id + '/servers/' + server_id + '/os-interface' |
|
try: |
|
response = requests.post(serverURL, \ |
|
headers={ \ |
|
'X-Auth-Token': k5token, 'Content-Type': 'application/json', 'Accept': 'application/json'}, \ |
|
json={"interfaceAttachment": \ |
|
{"net_id": net_id \ |
|
}}) |
|
return response |
|
except: |
|
return "Unable to add interface to server" |
|
|
|
|
|
def main(): |
|
try: |
|
|
|
# 最小限のコマンドラインパラメータが提供されていることを確認する |
|
if (len(sys.argv)<6): |
|
print("既存のサーバーにインターフェースを追加する方法を示すスクリプト。") |
|
print("完了後、OS内でインターフェースを設定する必要があります(再起動が必要になる場合があります)") |
|
print("使用方法: %s -n 'network id' -s 'server id' -p 'project id'" % sys.argv[0]) |
|
sys.exit(2) |
|
|
|
|
|
# コマンドラインパラメータを読み込む |
|
myopts, args = getopt.getopt(sys.argv[1:],"n:p:s:",["net_id=","project_id=","server_id="]) |
|
except getopt.GetoptError: |
|
# パラメータが正しくない場合はエラーメッセージを表示する |
|
print("既存のサーバーにインターフェースを追加する方法を示すスクリプト。") |
|
print("完了後、OS内でインターフェースを設定する必要があります(再起動が必要になる場合があります)") |
|
print("使用方法: %s -n 'network id' -s 'server id' -p 'project id'" % sys.argv[0]) |
|
sys.exit(2) |
|
|
|
# コマンドラインパラメータから変数を設定する |
|
|
|
############################# |
|
# o == オプション |
|
# a == oに渡される引数 |
|
############################# |
|
for o, a in myopts: |
|
if o in ('-s', '--server_id'): |
|
server_id = a |
|
elif o in ('-n', '--net_id'): |
|
network_id = a |
|
elif o in ('-p', '--projects'): |
|
project_id = a |
|
else: |
|
# パラメータが正しくない場合はエラーメッセージを表示する |
|
print("既存のサーバーにインターフェースを追加する方法を示すスクリプト。") |
|
print("完了後、OS内でインターフェースを設定する必要があります(再起動が必要になる場合があります)") |
|
print("使用方法: %s -n 'network id' -s 'server id' -p 'project id'" % sys.argv[0]) |
|
|
|
k5token = get_scoped_token(adminUser, adminPassword, contract, project_id, region).headers['X-Subject-Token'] |
|
print k5token |
|
result = attach_interface_to_server(k5token, project_id, network_id, server_id, region) |
|
print result.json() |
|
|
|
if __name__ == "__main__": |
|
main() |
|
|
rawを表示
K5_Add_Interface_To_Existing_Server.py
GitHub によって ❤ でホストされています
また、これが完了しても、プロセスのインフラストラクチャ部分のみが満たされたことに注意してください。新しいインターフェースを関連するOS内で設定する必要があります。
Happy Stacking!
withk5youcan
Originally published on allthingscloud.eu (2016-12-20).