Ajouter une interface à un serveur existant sur Fujitsu K5 ou OpenStack
2016-12-20
Machine-translated — the English original is authoritative.
J’ai reçu une question aujourd’hui d’un client qui cherchait des indications sur la façon d’ajouter une autre interface à une instance K5 ou OpenStack existante. J’espère que si vous avez trouvé ce blog, vous le trouverez également utile. Il y a une grande hypothèse ici : vous avez configuré votre environnement pour utiliser Python 2.7X. Cependant, comme j’ai utilisé les appels API natifs, il devrait être très facile de porter cet exemple vers d’autres langages de script, à condition qu’ils prennent en charge les appels RESTful.
Remarque : Lors de l’exécution du script à partir d’un environnement système d’exploitation Windows, il peut être nécessaire de remplacer les guillemets simples (‘) par des guillemets doubles (“) autour des paramètres.
Cette procédure ne nécessite que deux appels API –
Comme vous pouvez le voir dans les liens ci-dessus, j’ai utilisé les appels API natifs d’OpenStack issus de la documentation des développeurs de Keystone et de Nova. Fujitsu K5 a également amélioré certains de ces API pour offrir des fonctionnalités plus riches ; ces détails sont documentés sur le site de Fujitsu K5 – http://www.fujitsu.com/uk/solutions/cloud/k5/guides/
Un wrapper basique autour des appels API est inclus pour faciliter l’utilisation simple du script Python en ligne de commande. Le script prend 3 paramètres d’entrée –
-p 'project id'– il s’agit de l’identifiant du projet où réside le serveur-n 'network id'– il s’agit de l’identifiant du réseau auquel la nouvelle interface doit être attachée-s 'server id'– comme son nom l’indique, c’est ici que se trouve l’identifiant du serveur qui nécessite l’interface supplémentaire
Notez également qu’au lieu de coder en dur les détails du contrat K5 (par exemple, nom d’utilisateur, mot de passe, etc.) dans le script, je les importe depuis un autre fichier appelé k5contractsettingsV7.py que VOUS DEVEZ CRÉER avant d’exécuter le script. Placez ce fichier dans le même répertoire que le script ci-dessous.
Exemple d’exécution du 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'}}
Exemple de script Python pour ajouter une nouvelle interface réseau à une instance K5 ou OpenStack existante.
Ce fichier contient des caractères Unicode cachés ou bidirectionnels qui peuvent être interprétés ou compilés différemment de ce qui est affiché ci-dessous. Pour les examiner, ouvrez le fichier dans un éditeur qui révèle les caractères Unicode cachés.
En savoir plus sur les caractères Unicode bidirectionnels
Afficher les caractères cachés
#!/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() |
|
|
voir le code brut
K5_Add_Interface_To_Existing_Server.py
hébergé avec ❤ par GitHub
Veuillez également noter qu’une fois cela terminé, vous n’avez satisfait que la partie infrastructure du processus. Il sera toujours nécessaire de configurer la nouvelle interface dans le système d’exploitation concerné.
Happy Stacking!
withk5youcan
Originally published on allthingscloud.eu (2016-12-20).