[PYTHON] J'ai essayé d'automatiser la construction d'un environnement pratique à l'aide de l'API SoftLayer d'IBM Cloud

SoftLayer API

Bluemix, la solution cloud d'IBM. En octobre 2016, la couche IaaS et la couche PaaS ont été intégrées, et une solution appelée Bluemix peut prendre en charge toutes les gammes de services.

Bluemix Infrastructure fournit la partie infrastructure, c'est-à-dire les parties serveur, réseau et stockage. Une de ses fonctionnalités est l'automatisation de la gestion par API (SoftLayer API).

Avec Bluemix Infrastructure, il est possible d'effectuer toutes les opérations via l'API, du déploiement de serveurs physiques et de la création d'utilisateurs, à l'enregistrement dans DNS, à l'acquisition des informations de localisation de chaque centre de données et à l'émission de tickets de support. ..

Cela devrait être le cas, et en fait, le portail client fourni pour les utilisateurs de Bluemix Infrastructure est également créé à l'aide de l'API, de sorte que toutes les opérations pouvant être effectuées sur le portail sont fournies avec l'API. ..

Il existe plusieurs articles sur l'API SoftLayer sur le Web, veuillez donc vous y référer également. C'est organisé ici. Site de référence de programmation de l'API SoftLayer

Préface

En février 2016, IBM a collaboré avec VMware pour rendre la pile complète de composants VMware disponible sur Bluemix. Pour cette raison, il existe de nombreuses opportunités de mettre en place VMware sur IBM Cloud avec IBM seul ou avec des partenaires Bluemix Infrastructure tels que Softbank Commerce & Service.

vSphere "6.5" sur IBM Bluemix Infrastructure (SoftLayer) Hands-on Par exemple, nous effectuons régulièrement les travaux pratiques ci-dessus, alors venez nous rendre visite.

Cependant, le problème ici est de créer un environnement pratique. Hands-on fournira un serveur bare metal et un serveur virtuel fonctionnel pour chaque participant. Ce serait bien si le nombre de participants était encore petit, mais lorsque le nombre de participants était grand, il serait difficile de le faire manuellement.

En plus de cela, il existe de nombreuses petites tâches telles que la configuration du VLAN et l'émission de tickets, et si vous le faites manuellement, des erreurs se produiront. (Pardon···) Donc, cette fois, j'essaierai d'automatiser la construction de l'environnement pratique, de réduire le plus possible les erreurs et de réduire mon fardeau.

Travail requis pour créer un environnement pratique

L'environnement pratique est simplement configuré comme suit. image.png

Les participants se connectent à distance à leur serveur virtuel de travail attribué via SSL VPN et installent ESXi ou vCenter sur un serveur nu à partir de ce serveur virtuel. Par conséquent, le serveur bare metal et le serveur virtuel doivent être sur le même VLAN. De plus, comme nous n'utilisons pas Internet, nous n'avons pas besoin de nous connecter au VLAN public, nous allons donc commander Private Only.

Les travaux de construction de l'environnement sont énumérés ci-dessous.

  1. Préparez les adresses e-mail pour l'ID IBM en fonction du nombre de personnes
  2. Créez un utilisateur pour les participants en tant qu'utilisateur enfant du compte pratique
  1. Commande de facturation horaire BMS (serveur bare metal) pour le nombre de personnes
  1. Émettez un ticket pour modifier les paramètres BMS
  1. Configurez le VSI (serveur virtuel) horaire pour le nombre de personnes du modèle d'image sur le même VLAN que BMS
  1. Attribuez respectivement le BMS et le VSI commandés à l'utilisateur du participant
  2. Préparez une adresse IP portable privée pour VM sur le même VLAN que BMS et VSI

Cela demande beaucoup de travail. Cela prend du temps et je ne peux pas dormir la nuit précédente à cause de fautes de frappe ou d'erreurs de sélection. Je vais donc automatiser toutes ces tâches.

Cette fois, j'écrirai un script en Python. Au fait, je ne suis pas familier avec Python, alors dites-moi en secret si vous préférez écrire de cette façon.

Créer un script

Le script terminé est le suivant.

handson.py


# coding:utf-8
#Prepare for hands-on environment

import SoftLayer 
import json
import SoftLayer.API
import sys
import csv
from time import sleep

#API key of master account
username = "username"
apiKey = "apikey"

client = SoftLayer.Client(username= username, api_key = apiKey)
bms_allhosts = ''
counter  = 0

#Import csv file
csvfile = "list.csv"
f = open(csvfile, "rU")
reader = csv.reader(f)
header = next(reader)
 
for (num,row) in enumerate(reader):
    
    #Count numbers
    counter += 1
    
    
    ##############################################################################################
    #Create new user
    ##############################################################################################
    
    
    #Input user information
    user_template = {
        'username': row[0],
        'firstName': row[1],
        'lastName': row[2],
        'email': row[3],
        'companyName': 'company name',
        'address1': 'address',
        'city': 'city',
        'country': 'JP',
        'state': 'OT',
        'postalCode': 'xxx-xxxx',
        'officePhone': row[5],
        'userStatusId': 1001,
        'timezoneId': 158,
        'localeId': 22,
        'sslVpnAllowedFlag': True
    }
    
    
    #Create new user
    try:
        new_user = client['User_Customer'].createObject(user_template, row[4], row[4])
        print("complete user creation!")
    except SoftLayer.SoftLayerAPIError as e: 
        print("Error: %s, %s" % (e.faultCode, e.faultString)) 
        exit()

        
        
        
        
    ##############################################################################################
    #Set permissions
    ##############################################################################################

    
    #Define permission template    
    permission_template = [
        {'keyName':'ACCOUNT_SUMMARY_VIEW'},
        {'keyName':'ANTI_MALWARE_MANAGE'},
        {'keyName':'BANDWIDTH_MANAGE'},
        {'keyName':'CDN_BANDWIDTH_VIEW'},
        {'keyName':'DEDICATED_HOST_VIEW'},
        {'keyName':'DNS_MANAGE'},
        {'keyName':'FIREWALL_MANAGE'},
        {'keyName':'FIREWALL_RULE_MANAGE'},
        {'keyName':'HARDWARE_VIEW'},
        {'keyName':'HOST_ID_MANAGE'},
        {'keyName':'IP_ADD'},
        {'keyName':'LICENSE_VIEW'},
        {'keyName':'LOADBALANCER_MANAGE'},
        {'keyName':'MONITORING_MANAGE'},
        {'keyName':'NETWORK_MESSAGE_DELIVERY_MANAGE'},
        {'keyName':'NTF_SUBSCRIBER_MANAGE'},
        {'keyName':'PORT_CONTROL'},
        {'keyName':'REMOTE_MANAGEMENT'},
        {'keyName':'SERVER_ADD'},
        {'keyName':'SOFTWARE_FIREWALL_MANAGE'},
        {'keyName':'TICKET_EDIT'},
        {'keyName':'TICKET_SEARCH'},
        {'keyName':'TICKET_VIEW'},
        {'keyName':'TICKET_VIEW_BY_HARDWARE'},
        {'keyName':'TICKET_VIEW_BY_VIRTUAL_GUEST'},
        {'keyName':'VIRTUAL_GUEST_VIEW'},
        {'keyName':'VPN_MANAGE'},
        {'keyName':'VULN_SCAN_MANAGE'}
    ]
    
    
    #Set permissions
    try:
        client['User_Customer'].addBulkPortalPermission(permission_template, id=new_user['id'])
        print("complete setting user permission!") 
    except SoftLayer.SoftLayerAPIError as e: 
        print("Error: %s, %s" % (e.faultCode, e.faultString)) 
        exit()
    
    
    
    
    
    ##############################################################################################
    #Order hourly BMS
    ##############################################################################################
    
    
    #Set BMS order template
    bare_metal_server = {
        'datacenter': {'name': 'hkg02'},
        'hostname': 'handson.bms' + str(num+1),
        'domain': 'softlayer.com',
        'hourlyBillingFlag': True,
        'fixedConfigurationPreset': {'keyName': 'S1270_32GB_1X1TBSATA_NORAID'},
        'networkComponents': [{
            'maxSpeed': 1000,
        }],
        'privateNetworkOnlyFlag': True,
        'operatingSystemReferenceCode': 'CUSTOS_1_64'
    }
    
    #Order BMS
    try:
        order_bms = client['Hardware'].createObject(bare_metal_server)
        print("complete order BMS!")
    except SoftLayer.SoftLayerAPIError as e: 
        print("Error: %s, %s" % (e.faultCode, e.faultString)) 
        exit()
        
    #Add FQDN for ticket contents
    bms_allhosts = bms_allhosts + (order_bms['hostname'] + order_bms['domain'] + '\n')
        
        
        
        
    ##############################################################################################
    #Retrieve BMS information
    ##############################################################################################
    
    
    #Get BMS id from Global ID
    mask_1 = "mask[id;globalIdentifier]"
    new_bms_id = 0
    
    while True:
        bms_infor = client['Account'].getHardware(mask=mask_1)
        for bms_id in bms_infor:
            try:
                if bms_id['globalIdentifier'] == order_bms['globalIdentifier']:
                    new_bms_id = bms_id['id']
                    break
            except KeyError:
                print('please wait for a minutes... now provisioning BMS...')
                sleep(120)
        if new_bms_id > 0:
            break
    
    print(new_bms_id)
    
    #Get BMS private VLAN ID
    mask_2 = "mask[id]"
    bms_vlan_id = 0
    
    while True:
        bms_vlan = client['Hardware'].getNetworkVlans(id=new_bms_id,mask=mask_2)
        bms_vlan_id = bms_vlan[0]['id']
        if bms_vlan_id > 0:
            break
    

    
    ##############################################################################################
    #Order hourly VSI
    ##############################################################################################

    
    #Set VSI order template
    virtual_server = {
        'datacenter': {'name': 'hkg02'},
        'hostname': 'handson.vsi' + str(num+1),
        'domain': 'softlayer.com',
        'hourlyBillingFlag': True,
        'startCpus': 2,
        'maxMemory': 4096,
        'blockDeviceTemplateGroup':{
            'globalIdentifier': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
        },
        'localDiskFlag': False,
        'primaryBackendNetworkComponent':{
            'networkVlan':{
                'id': bms_vlan_id
            }
        },
        'networkComponents': [{
            'maxSpeed': 1000,
        }],
        'privateNetworkOnlyFlag': True,
    }
    
    #Order VSI
    try:
        order_vsi = client['Virtual_Guest'].createObject(virtual_server)
        print("complete order VSI!") 
    except SoftLayer.SoftLayerAPIError as e: 
        print("Error: %s, %s" % (e.faultCode, e.faultString)) 
        exit()
        
        
        
        
        
    ##############################################################################################
    #Retrieve VSI information
    ##############################################################################################
    
    
    #Get VSI id from Global ID
    mask_3 = "mask[id;globalIdentifier]"
    new_vsi_id = 0

    while True:
        vsi_infor = client['Account'].getVirtualGuests(mask=mask_3)
        for vsi_id in vsi_infor:
            try:
                if vsi_id['globalIdentifier'] == order_vsi['globalIdentifier']:
                    new_vsi_id = vsi_id['id']
                    break
            except KeyError:
                print('please wait for a minutes... now provisioning VSI...')
                sleep(60)
        if new_vsi_id > 0:
            break
    
    
    
    
    ##############################################################################################
    #Server access control 
    ##############################################################################################    
    
    
    
    #Remove all access
    client['User_Customer'].removeAllHardwareAccessForThisUser(id=new_user['id'])
    client['User_Customer'].removeAllVirtualAccessForThisUser(id=new_user['id'])
    
    #Create lists of new server id
    new_bms_idset = [new_bms_id]
    new_vsi_idset = [new_vsi_id]
    
    #Add specific server access
    client['User_Customer'].addBulkHardwareAccess(new_bms_idset,id=new_user['id'])    
    client['User_Customer'].addBulkVirtualGuestAccess(new_vsi_idset,id=new_user['id'])
    
    
f.close()


##############################################################################################
#Issue ticket 
##############################################################################################

#Create ticket template
ticket_template = {
    'subjectId': 1021, # Hardware Issue
    'assignedUserId': userid,
    'title': 'IPMI privilege and UEFI mode'
}
ticket_contents = 'I have three requests. I would like to boot server from ISO and install vSphere(BYOL).\nI want to change the setting of following ' + counter + ' servers.\n\n' + bms_allhosts + '1. Could you change the privilege of IPMI control from Operator to Administrator?\n2. Please raise a start priority of ISO.\n3. Please change the IPMI\'s UEFI mode into legacy only mode.\n\nI agree to enforcement if you need to reboot the servers'

#Issue ticket
created_ticket = client['Ticket'].createStandardTicket(ticket_template, ticket_contents)


Placez également le fichier .csv de la liste des participants dans le même dossier.

list.csv


Username,First Name,Last Name,IBMid,password,office phone
test1,Toro,Yamada,[email protected],password1,xx-xxxx-xxxx
test2,Jiro,Takahashi,[email protected],password1,xxx-xxxx-xxxx
・ ・ ・

Le flux de script simple consiste à lire une ligne dans le fichier csv, à créer l'utilisateur qui y est répertorié, à définir des autorisations et à ordonner aux serveurs bare metal et virtuels d'attribuer à cet utilisateur. Il a la forme de le répéter jusqu'à la dernière ligne.

De là, j'expliquerai comment utiliser l'API partie par partie. On suppose également que vous comprenez l'idée de base de l'API SoftLayer et des termes simples (services, méthodes, types de données, masques d'objets, etc.).

Lire le fichier csv

handson.py


#Import csv file
csvfile = "list.csv"
f = open(csvfile, "rU")
reader = csv.reader(f)
header = next(reader)
 
for (num,row) in enumerate(reader):

Ici, nous lirons le fichier de la liste des participants et le traiterons ligne par ligne. La première ligne contient le processus de saut en tant qu'en-tête.

Créer un utilisateur

handson.py


    ##############################################################################################
    #Create new user
    ##############################################################################################
    
    
    #Input user information
    user_template = {
        'username': row[0],
        'firstName': row[1],
        'lastName': row[2],
        'email': row[3],
        'companyName': 'company name',
        'address1': 'address',
        'city': 'city',
        'country': 'JP',
        'state': 'OT',
        'postalCode': 'xxx-xxxx',
        'officePhone': row[5],
        'userStatusId': 1001,
        'timezoneId': 158,
        'localeId': 22,
        'sslVpnAllowedFlag': True
    }
    
    
    #Create new user
    try:
        new_user = client['User_Customer'].createObject(user_template, row[4], row[4])
        print("complete user creation!")
    except SoftLayer.SoftLayerAPIError as e: 
        print("Error: %s, %s" % (e.faultCode, e.faultString)) 
        exit()

Ici, il est créé à l'aide de la méthode createObject du service User_Customer. Les trois paramètres suivants peuvent être saisis dans le createObject de ce service.

Paramètres Aperçu Type de données
templateObject Modèle créé par l'utilisateur. User_Customer
password Mot de passe du compte. string
vpnPassword Mot de passe lors de l'utilisation du VPN SSL. string

Le type de données User_Customer a la forme d'un objet dictionnaire en Python, et les clés et valeurs disponibles sont répertoriées ici [http://sldn.softlayer.com/reference/datatypes/SOftLayer_User_Customer). Je suis.

Les données lues dans le fichier csv sont intégrées lors de la création de ce modèle utilisateur.

De plus, le paramètre de mot de passe est ignoré pour les «utilisateurs VPN uniquement» et les «utilisateurs créés avec l'ID IBM». Tous les utilisateurs nouvellement créés sont censés utiliser l'authentification IBMid, ceci est donc ignoré. (À propos, dans ce cas, l'utilisateur doit initialiser le mot de passe dans les 24 heures.)

Paramètres d'autorisation utilisateur

handson.py


    ##############################################################################################
    #Set permissions
    ##############################################################################################

    
    #Define permission template    
    permission_template = [
        {'keyName':'ACCOUNT_SUMMARY_VIEW'},
        {'keyName':'ANTI_MALWARE_MANAGE'},
        {'keyName':'BANDWIDTH_MANAGE'},
        {'keyName':'CDN_BANDWIDTH_VIEW'},
        {'keyName':'DEDICATED_HOST_VIEW'},
        {'keyName':'DNS_MANAGE'},
        {'keyName':'FIREWALL_MANAGE'},
        {'keyName':'FIREWALL_RULE_MANAGE'},
        {'keyName':'HARDWARE_VIEW'},
        {'keyName':'HOST_ID_MANAGE'},
        {'keyName':'IP_ADD'},
        {'keyName':'LICENSE_VIEW'},
        {'keyName':'LOADBALANCER_MANAGE'},
        {'keyName':'MONITORING_MANAGE'},
        {'keyName':'NETWORK_MESSAGE_DELIVERY_MANAGE'},
        {'keyName':'NTF_SUBSCRIBER_MANAGE'},
        {'keyName':'PORT_CONTROL'},
        {'keyName':'REMOTE_MANAGEMENT'},
        {'keyName':'SERVER_ADD'},
        {'keyName':'SOFTWARE_FIREWALL_MANAGE'},
        {'keyName':'TICKET_EDIT'},
        {'keyName':'TICKET_SEARCH'},
        {'keyName':'TICKET_VIEW'},
        {'keyName':'TICKET_VIEW_BY_HARDWARE'},
        {'keyName':'TICKET_VIEW_BY_VIRTUAL_GUEST'},
        {'keyName':'VIRTUAL_GUEST_VIEW'},
        {'keyName':'VPN_MANAGE'},
        {'keyName':'VULN_SCAN_MANAGE'}
    ]
    
    
    #Set permissions
    try:
        client['User_Customer'].addBulkPortalPermission(permission_template, id=new_user['id'])
        print("complete setting user permission!") 
    except SoftLayer.SoftLayerAPIError as e: 
        print("Error: %s, %s" % (e.faultCode, e.faultString)) 
        exit()

Ensuite, définissez les autorisations du portail pour l'utilisateur créé. Utilisez la méthode addBulkPortalPermission du service User_Customer pour définir les autorisations.

Attribuez la liste des autorisations que vous souhaitez définir comme paramètre à cette méthode. En outre, le nom qui peut être spécifié comme valeur de keyName dans le modèle est Listable dans la méthode getAllObjects du service User_Customer_CustomerPermission_Permission.

Commande de serveur bare metal à facturation horaire

handson.py


    ##############################################################################################
    #Order hourly BMS
    ##############################################################################################
    
    
    #Set BMS order template
    bare_metal_server = {
        'datacenter': {'name': 'hkg02'},
        'hostname': 'handson.bms' + str(num+1),
        'domain': 'softlayer.com',
        'hourlyBillingFlag': True,
        'fixedConfigurationPreset': {'keyName': 'S1270_32GB_1X1TBSATA_NORAID'},
        'networkComponents': [{
            'maxSpeed': 1000,
        }],
        'privateNetworkOnlyFlag': True,
        'operatingSystemReferenceCode': 'CUSTOS_1_64'
    }
    
    #Order BMS
    try:
        order_bms = client['Hardware'].createObject(bare_metal_server)
        print("complete order BMS!")
    except SoftLayer.SoftLayerAPIError as e: 
        print("Error: %s, %s" % (e.faultCode, e.faultString)) 
        exit()
        
    #Add FQDN for ticket contents
    bms_allhosts = bms_allhosts + (order_bms['hostname'] + order_bms['domain'] + '\n')
        
        

Le serveur bare metal de facturation horaire est prédéfini et certains modèles sont préconfigurés.

Ici, nous utilisons la méthode createObject du service matériel. À propos, si vous souhaitez commander un serveur bare metal plus personnalisable avec une facturation mensuelle, utilisez le type de données Container_Product_Order et définissez plus d'options. est nécessaire.

Vous devez entrer le modèle en tant que paramètre dans la méthode createObject. Le modèle est un objet dictionnaire, dans lequel le centre de données, le système d'exploitation, etc. sont spécifiés. Chaque clé et valeur peuvent être trouvées ici (http://sldn.softlayer.com/reference/services/softlayer_hardware/createobject). Je vais vous expliquer brièvement ci-dessous.

Paramètres Aperçu Type de données
datacenter.name Désignation du centre de données string
hostname Nom d'hôte du serveur string
domain Nom de domaine du serveur string
hourlyBillingFlag Si True, il s'agira d'un serveur de facturation horaire. boolean
fixedConfigurationPreset.keyName Sélectionnez un type de préréglage. string
networkComponents.maxSpeed Spécifie la vitesse du port de la carte réseau. int
privateNetworkOnlyFlag Si True, il sera déployé uniquement sur la carte réseau privée. boolean
operatingSystemReferenceCode Spécifiez le système d'exploitation. string

Vous pouvez vérifier la liste des valeurs pouvant être spécifiées pour chaque paramètre à l'aide de la méthode getCreateObjectOptions du service matériel. En passant, vous ne pouvez pas spécifier le VLAN par le paramètre primaryNetworkComponent.networkVlan.id etc. uniquement pour le serveur bare metal à facturation horaire. Vous ne pouvez pas demander au côté Bluemix avec un ticket.

Le dernier bms_allhosts contient le nom de domaine complet du serveur bare metal. Il est utilisé lors de l'émission d'un ticket.

Obtenir des informations sur le serveur Bare Metal

handson.py


    ##############################################################################################
    #Retrieve BMS information
    ##############################################################################################
    
    
    #Get BMS id from Global ID
    mask_1 = "mask[id;globalIdentifier]"
    new_bms_id = 0
    
    while True:
        bms_infor = client['Account'].getHardware(mask=mask_1)
        for bms_id in bms_infor:
            try:
                if bms_id['globalIdentifier'] == order_bms['globalIdentifier']:
                    new_bms_id = bms_id['id']
                    break
            except KeyError:
                print('please wait for a minutes... now provisioning BMS...')
                sleep(120)
        if new_bms_id > 0:
            break
    
    print(new_bms_id)
    
    #Get BMS private VLAN ID
    mask_2 = "mask[id]"
    bms_vlan_id = 0
    
    while True:
        bms_vlan = client['Hardware'].getNetworkVlans(id=new_bms_id,mask=mask_2)
        bms_vlan_id = bms_vlan[0]['id']
        if bms_vlan_id > 0:
            break


Lorsque vous avez commandé un serveur bare metal avec createObject plus tôt, les informations du serveur sont stockées dans order_bms en tant que valeur de retour de l'API. Cependant, lorsque la commande est confirmée, l'id du serveur et les informations VLAN ne sont pas confirmés. Un exemple de la valeur de retour est illustré ci-dessous.

handson.py


{'datacenter': {'statusId': '', 'id': '', 'name': 'hkg02'}, 'domain': 'softlayer.com', 'hostname': 'handson.bms1', 'provisionDate': '', 'fixedConfigurationPreset': {'keyName': 'S1270_32GB_1X1TBSATA_NORAID', 'id': '', 'packageId': ''}, 'bareMetalInstanceFlag': '', 'privateNetworkOnlyFlag': True, 'hardwareStatusId': '', 'globalIdentifier': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', 'operatingSystemReferenceCode': 'CUSTOS_1_64', 'hourlyBillingFlag': True, 'serviceProviderResourceId': '', 'networkComponents': [{'maxSpeed': 1000, 'modifyDate': '', 'networkVlanId': '', 'hardwareId': '', 'id': '', 'speed': '', 'port': ''}], 'serviceProviderId': '', 'id': '', 'accountId': xxxxxxxx}

Les valeurs id et networkVlanId sont vides. Vous ne pourrez pas obtenir ces informations à ce stade car le provisionnement n'est pas encore terminé.

Par conséquent, l'identifiant est extrait de la méthode getHardware du service Account à l'aide de globalIdentifier qui est confirmé au moment de la commande. J'essaie d'attendre un moment si l'approvisionnement n'est pas terminé.

L'ID VLAN peut également être trouvé à partir de getNetworkVlans du service de compte.

À propos, l'id du serveur sera utilisé pour définir l'autorité d'accès après cela, et l'ID de VLAN sera utilisé pour spécifier le VLAN pour le serveur virtuel.

Commande de serveur virtuel avec facturation horaire

handson.py


    ##############################################################################################
    #Order hourly VSI
    ##############################################################################################

    
    #Set VSI order template
    virtual_server = {
        'datacenter': {'name': 'hkg02'},
        'hostname': 'handson.vsi' + str(num+1),
        'domain': 'softlayer.com',
        'hourlyBillingFlag': True,
        'startCpus': 2,
        'maxMemory': 4096,
        'blockDeviceTemplateGroup':{
            'globalIdentifier': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
        },
        'localDiskFlag': False,
        'primaryBackendNetworkComponent':{
            'networkVlan':{
                'id': bms_vlan_id
            }
        },
        'networkComponents': [{
            'maxSpeed': 1000,
        }],
        'privateNetworkOnlyFlag': True,
    }
    
    #Order VSI
    try:
        order_vsi = client['Virtual_Guest'].createObject(virtual_server)
        print("complete order VSI!") 
    except SoftLayer.SoftLayerAPIError as e: 
        print("Error: %s, %s" % (e.faultCode, e.faultString)) 
        exit()
        

Commandez un serveur virtuel toutes les heures. Vous pouvez commander de la même manière qu'avec un serveur bare metal. Utilisez la méthode createObject du service Virtual_Guest.

La différence avec le serveur bare metal est que le paramètre primaryBackendNetworkComponent.networkVlan spécifie d'abord le VLAN à déployer. Étant donné que le serveur virtuel peut sélectionner le VLAN même s'il est facturé toutes les heures, il est déployé sur le même VLAN que le serveur bare metal commandé précédemment. Vous pouvez également commander à partir d'une image en spécifiant l'identifiant global du modèle d'image dans blockDeviceTemplateGroup. Dans ce cas, vous ne pouvez pas spécifier le système d'exploitation ou le disque.

À propos, vous pouvez spécifier public ou privé dans le modèle d'image, mais bien sûr, vous pouvez commander l'un ou l'autre. Vous pouvez obtenir une liste à partir de la méthode getPublicImages du service Virtual_Guest_Block_Device_Template_Group s'il est public, ou à partir de la méthode getBlockDeviceTemplateGroups du service Account s'il est privé.

Obtenir des informations sur le serveur virtuel

handson.py


    ##############################################################################################
    #Retrieve VSI information
    ##############################################################################################
    
    
    #Get VSI id from Global ID
    mask_3 = "mask[id;globalIdentifier]"
    new_vsi_id = 0

    while True:
        vsi_infor = client['Account'].getVirtualGuests(mask=mask_3)
        for vsi_id in vsi_infor:
            try:
                if vsi_id['globalIdentifier'] == order_vsi['globalIdentifier']:
                    new_vsi_id = vsi_id['id']
                    break
            except KeyError:
                print('please wait for a minutes... now provisioning VSI...')
                sleep(60)
        if new_vsi_id > 0:
            break
    

Obtenez l'ID du serveur virtuel comme vous l'avez fait pour un serveur bare metal.

Ajouter l'accès au serveur

handson.py


    ##############################################################################################
    #Server access control 
    ##############################################################################################    
    
    
    
    #Remove all access
    client['User_Customer'].removeAllHardwareAccessForThisUser(id=new_user['id'])
    client['User_Customer'].removeAllVirtualAccessForThisUser(id=new_user['id'])
    
    #Create lists of new server id
    new_bms_idset = [new_bms_id]
    new_vsi_idset = [new_vsi_id]
    
    #Add specific server access
    client['User_Customer'].addBulkHardwareAccess(new_bms_idset,id=new_user['id'])    
    client['User_Customer'].addBulkVirtualGuestAccess(new_vsi_idset,id=new_user['id'])
    
    
f.close()

Accordez l'accès au serveur à l'utilisateur créé. Tout d'abord, utilisez la méthode removeAllHardwareAccessForThisUser et la méthode removeAllVirtualAccessForThisUser du service User_Customer pour supprimer l'accès à tous les serveurs.

Après cela, accordez l'accès au serveur créé précédemment à l'aide des méthodes addBulkHardwareAccess et addBulkVirtualGuestAccess.

Notez que «hardwareIds» et «virtualGuestIds» dans Paramètres à affecter à addBulkHardwareAccess et addBulkVirtualGuestAccess sont des tableaux, pas des types int. N'oubliez pas de le mettre sous forme de liste.

Émission de billets

handson.py


##############################################################################################
#Issue ticket 
##############################################################################################

#Create ticket template
ticket_template = {
    'subjectId': 1021, # Hardware Issue
    'assignedUserId': userid,
    'title': 'IPMI privilege and UEFI mode'
}
ticket_contents = 'I have three requests. I would like to boot server from ISO and install vSphere(BYOL).\nI want to change the setting of following ' + str(counter) + ' servers.\n\n' + bms_allhosts + '1. Could you change the privilege of IPMI control from Operator to Administrator?\n2. Please raise a start priority of ISO.\n3. Please change the IPMI\'s UEFI mode into legacy only mode.\n\nI agree to enforcement if you need to reboot the servers'

#Issue ticket
created_ticket = client['Ticket'].createStandardTicket(ticket_template, ticket_contents)

Enfin, émettez un ticket et terminez. Utilisez la méthode createStandardTicket du service Ticket. Le subjectId spécifié dans le modèle peut être Get List avec la méthode getAllObjects du service Ticket_Subject.

De plus, comme la liste des hôtes est stockée dans bms_allhosts afin que tous les serveurs puissent être modifiés en même temps, je l'utilise.

Résumé

Cette fois, la création d'environnement pratique, qui prend du temps, a été automatisée avec l'API SoftLayer. Bien sûr, en plus de l'environnement pratique, je pense qu'il est très intéressant de pouvoir commander 10 serveurs, émettre des tickets plusieurs fois et automatiser diverses gestion.

Veuillez l'utiliser par tous les moyens! !!

De plus, VMware sur IBM Cloud pratique a lieu tous les mois, donc si vous voulez toucher Bluemix ou aimer VMware, veuillez l'utiliser. C'est gratuit. vSphere "6.5" sur IBM Bluemix Infrastructure (SoftLayer) Hands-on

Recommended Posts

J'ai essayé d'automatiser la construction d'un environnement pratique à l'aide de l'API SoftLayer d'IBM Cloud
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
J'ai essayé d'utiliser l'API de Sakenowa Data Project
J'ai essayé d'automatiser [une certaine tâche] à l'aide d'une tarte à la râpe
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
J'ai essayé d'utiliser l'API checkio
J'ai essayé d'obtenir une base de données sur les courses de chevaux en utilisant Pandas
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
J'ai essayé de créer une expression régulière de "date" en utilisant Python
J'ai essayé d'obtenir une liste de noms AMI en utilisant Boto3
J'ai essayé de toucher l'API COTOHA
J'ai créé une API Web
J'ai essayé d'utiliser l'API BigQuery Storage
J'ai essayé de transformer l'image du visage en utilisant sparse_image_warp de TensorFlow Addons
J'ai essayé d'obtenir les résultats de Hachinai en utilisant le traitement d'image
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé de résumer diverses phrases à l'aide de l'API de synthèse automatique "summpy"
J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai essayé d'effectuer une analyse de cluster de clients à l'aide des données d'achat
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
J'ai essayé l'histoire courante de l'utilisation du Deep Learning pour prédire la moyenne Nikkei
J'ai essayé de vérifier le résultat du test A / B avec le test du chi carré
Django super introduction par les débutants Python! Partie 2 J'ai essayé d'utiliser les fonctions pratiques du modèle
J'ai essayé de livrer du courrier depuis Node.js et Python en utilisant le service de livraison de courrier (SendGrid) d'IBM Cloud!
J'ai essayé d'utiliser l'API Google Cloud Vision
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai créé un jeu ○ ✕ avec TensorFlow
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
En utilisant PyAutoGui, j'ai essayé d'automatiser le test d'interface utilisateur du programme VB6 fonctionnant sur Windows Server 2003 R2 (feuille de triche de commande d'entrée).
J'ai essayé de prédire la détérioration de la batterie lithium-ion en utilisant le SDK Qore
J'ai essayé de notifier la mise à jour de "Hameln" en utilisant "Beautiful Soup" et "IFTTT"
[Python] J'ai essayé de juger l'image du membre du groupe d'idols en utilisant Keras
J'ai essayé d'automatiser le dépôt de 100 yens des courses de chevaux Rakuten (python / sélénium)
Convertir l'API cURL en script Python (à l'aide du stockage d'objets IBM Cloud)
J'ai fait un script pour enregistrer la fenêtre active en utilisant win32gui de Python
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
J'ai essayé de comprendre attentivement la fonction d'apprentissage dans le réseau de neurones sans utiliser la bibliothèque d'apprentissage automatique (première moitié)
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé d'approcher la fonction sin en utilisant le chainer
[Go + Gin] J'ai essayé de créer un environnement Docker
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
Je veux automatiser ssh en utilisant la commande expect!
J'ai essayé d'utiliser Python (3) au lieu d'un calculateur de fonctions
J'ai essayé d'identifier la langue en utilisant CNN + Melspectogram
J'ai essayé de compléter le graphe de connaissances en utilisant OpenKE
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé de dessiner un diagramme de configuration à l'aide de diagrammes
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de faire quelque chose comme un chatbot avec le modèle Seq2Seq de TensorFlow
J'ai essayé de prédire la victoire ou la défaite de la Premier League en utilisant le SDK Qore
Python pratique 100 coups J'ai essayé de visualiser l'arbre de décision du chapitre 5 en utilisant graphviz