Aggiungere un'interfaccia a un server esistente su Fujitsu K5 o OpenStack
2016-12-20
Machine-translated — the English original is authoritative.
Oggi ho ricevuto una richiesta da un cliente che cercava indicazioni su come aggiungere un'altra interfaccia a un'istanza K5 o OpenStack esistente. Si spera che, se hai trovato questo blog, anche tu possa trovarlo utile. C'è una grande assunzione qui: hai configurato il tuo ambiente per l'uso con python 2.7X. Tuttavia, poiché ho utilizzato le chiamate API native, dovrebbe essere molto facile adattare questo esempio ad altri linguaggi di scripting, purché supportino chiamate RESTFul.
Nota: Quando si esegue lo script da un ambiente OS Windows, potrebbe essere necessario sostituire le virgolette singole (‘) con virgolette doppie (“) attorno ai parametri.
Questa procedura richiede solo due chiamate API –
Come puoi vedere dai link sopra, ho utilizzato le chiamate API native di OpenStack sia dalla documentazione degli sviluppatori di Keystone che di Nova. Fujitsu K5 ha anche migliorato alcune di queste API per fornire funzionalità più ricche; questi dettagli sono documentati sul sito Fujitsu K5 – http://www.fujitsu.com/uk/solutions/cloud/k5/guides/
Incluso è un wrapper di base attorno alle chiamate API per facilitare l'uso da riga di comando dello script python. Lo script accetta 3 parametri di input –
-p 'project id'– questo è l'ID del progetto in cui risiede il server-n 'network id'– questo è l'ID della rete a cui deve essere collegata la nuova interfaccia-s 'server id'– abbastanza ovviamente, qui risiede l'ID del server che richiede l'interfaccia aggiuntiva
Tieni presente inoltre che, invece di codificare hardcoded i dettagli del contratto K5 (ad esempio nome utente, password, ecc.) nello script, li importo da un altro file chiamato k5contractsettingsV7.py che DEVI CREARE prima di eseguire lo script. Posiziona questo file nella stessa directory dello script sottostante.
Esempio di come eseguire lo script –
~/Dev/K5/CustomerAPIExamples$ ./ExampleServerAPIv1.py
Script to demonstrate how to add an interface to an existing server.
Once complete it will be necessary to configure the interface within the OS (a reboot may be required)
Usage: ./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'}}
Esempio di script python per aggiungere una nuova interfaccia di rete a un'istanza K5 o OpenStack esistente.
Questo file contiene caratteri Unicode nascosti o bidirezionali che potrebbero essere interpretati o compilati in modo diverso da quanto appare di seguito. Per rivederli, apri il file in un editor che riveli i caratteri Unicode nascosti.
Maggiori informazioni sui caratteri Unicode bidirezionali
#!/usr/bin/python |
|
"""Summary: Python 2.7X API example calls to do the following |
|
1. Get a project scoped K5 token |
|
2. Attach a new interface to an existing server |
|
|
|
Prerequisites: k5contractsettingsV7.py file in the same directory with K5 contract login details |
|
|
|
adminUser = 'username' |
|
adminPassword = 'password' |
|
contract = 'contract\_name' |
|
contractid = 'contract\_id' |
|
defaultid = 'default\_project\_id' |
|
region = 'uk-1' |
|
|
|
Author: Graham Land |
|
Date: 20/12/16 |
|
Twitter: @allthingsclowd |
|
Github: <https://github.com/allthingsclowd> |
|
Blog: <https://allthingscloud.eu> |
|
|
|
|
|
""" |
|
|
|
import requests |
|
import getopt |
|
import sys |
|
from k5contractsettingsV7 import * |
|
|
|
|
|
def get_scoped_token(adminUser, adminPassword, contract, projectid, region): |
|
"""Summary – Get a regional project scoped token using a username and password |
|
|
|
Returns: |
|
Object: Regionally Scoped Project Token Object |
|
|
|
Args: |
|
adminUser (TYPE): username |
|
adminPassword (TYPE): password |
|
contract (TYPE): contract name |
|
projectid (TYPE): project id |
|
region (TYPE): region |
|
""" |
|
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): |
|
"""Summary |
|
|
|
Args: |
|
k5token (TYPE): project scoped token |
|
project_id (TYPE): id of the project where the server resides |
|
net_id (TYPE): network id of the new interface to be added to the server |
|
server_id (TYPE): id of the server to receive the new interface |
|
region (TYPE): K5 region |
|
|
|
Returns: |
|
TYPE: Description |
|
""" |
|
|
|
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: |
|
|
|
# ensure minimium commandline paramaters have been supplied |
|
if (len(sys.argv)<6): |
|
print("Script to demonstrate how to add an interface to an existing server.") |
|
print("Once complete it will be necessary to configure the interface within the OS (a reboot may be required)") |
|
print("Usage: %s -n 'network id' -s 'server id' -p 'project id'" % sys.argv[0]) |
|
sys.exit(2) |
|
|
|
|
|
# load the command line parameters |
|
myopts, args = getopt.getopt(sys.argv[1:],"n:p:s:",["net_id=","project_id=","server_id="]) |
|
except getopt.GetoptError: |
|
# if the parameters are incorrect display error message |
|
print("Script to demonstrate how to add an interface to an existing server.") |
|
print("Once complete it will be necessary to configure the interface within the OS (a reboot may be required)") |
|
print("Usage: %s -n 'network id' -s 'server id' -p 'project id'" % sys.argv[0]) |
|
sys.exit(2) |
|
|
|
# set the variables from the command line parameters |
|
|
|
############################# |
|
# o == option |
|
# a == argument passed to the 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: |
|
# if the parameters are incorrect display error message |
|
print("Script to demonstrate how to add an interface to an existing server.") |
|
print("Once complete it will be necessary to configure the interface within the OS (a reboot may be required)") |
|
print("Usage: %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() |
|
|
view raw
K5_Add_Interface_To_Existing_Server.py
hosted with ❤ by GitHub
Tieni inoltre presente che, una volta completato questo passaggio, hai soddisfatto solo la parte infrastrutturale del processo. Rimarrà ancora necessario configurare la nuova interfaccia all'interno del sistema operativo rilevante.
Happy Stacking!
withk5youcan
Originally published on allthingscloud.eu (2016-12-20).