Añadir una interfaz a un servidor existente en Fujitsu K5 o OpenStack
2016-12-20
Machine-translated — the English original is authoritative.
Hoy he recibido una consulta de un cliente que buscaba orientación sobre cómo añadir otra interfaz a una instancia K5 o OpenStack existente. Espero que, si has llegado a este blog, también lo encuentres útil. Aquí se da por sentado que has configurado tu entorno para usarlo con python 2.7X. Sin embargo, dado que he utilizado las llamadas API nativas, debería ser muy fácil adaptar este ejemplo a otros lenguajes de scripting, siempre que estos soporten llamadas RESTFul.
Nota: Al ejecutar el script desde un entorno de sistema operativo Windows, puede ser necesario reemplazar las comillas simples (‘) por comillas dobles (“) alrededor de los parámetros.
Este procedimiento requiere únicamente dos llamadas API –
Como puedes ver en los enlaces anteriores, he utilizado las llamadas API nativas de OpenStack tanto de la documentación de la API de desarrolladores de Keystone como de Nova. Fujitsu K5 también ha mejorado algunas de estas APIs para proporcionar una funcionalidad más rica; esos detalles están documentados en el sitio web de Fujitsu K5 – http://www.fujitsu.com/uk/solutions/cloud/k5/guides/
Incluyo un envoltorio básico alrededor de las llamadas API para facilitar el uso simple de la línea de comandos del script Python. El script toma 3 parámetros de entrada –
-p 'project id'– este es el id del proyecto donde reside el servidor-n 'network id'– este es el id de la red a la que se adjuntará la nueva interfaz-s 'server id'– como es de esperar, este es el id del servidor que requiere la interfaz adicional
También ten en cuenta que, en lugar de codificar los detalles del contrato K5 (por ejemplo, nombre de usuario, contraseña, etc.) directamente en el script, los importo desde otro archivo llamado k5contractsettingsV7.py que DEBES CREAR antes de ejecutar el script. Coloca este archivo en el mismo directorio que el script de abajo.
Ejemplo de cómo ejecutar el 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'}}
Script Python de ejemplo para añadir una nueva interfaz de red a una instancia K5 o OpenStack existente.
Este archivo contiene texto Unicode oculto o bidireccional que puede interpretarse o compilarse de manera diferente a lo que aparece a continuación. Para revisarlo, abre el archivo en un editor que revele caracteres Unicode ocultos.
Más información sobre caracteres Unicode bidireccionales
#!/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() |
|
|
ver código original
K5_Add_Interface_To_Existing_Server.py
alojado con ❤ por GitHub
Ten en cuenta también que, una vez completado esto, solo has satisfecho la parte de infraestructura del proceso. Aún será necesario configurar la nueva interfaz dentro del sistema operativo correspondiente.
¡Feliz apilamiento!
withk5youcan
Originally published on allthingscloud.eu (2016-12-20).