[PYTHON] Ich habe versucht, die Erstellung einer praktischen Umgebung mithilfe der SoftLayer-API der IBM Cloud zu automatisieren

SoftLayer API

Bluemix, die Cloud-Lösung von IBM. Im Oktober 2016 wurden die IaaS-Schicht und die PaaS-Schicht integriert, und eine Lösung namens Bluemix kann alle Servicebereiche unterstützen.

Bluemix Infrastructure stellt den Infrastrukturteil bereit, dh den Server-, Netzwerk- und Speicherteil. Eine seiner Funktionen ist die Automatisierung der Verwaltung durch API (SoftLayer API).

Mit Bluemix Infrastructure können alle Vorgänge über die API ausgeführt werden, von der Bereitstellung physischer Server und der Erstellung von Benutzern über die Registrierung im DNS bis hin zum Abrufen von Standortinformationen für jedes Rechenzentrum und der Ausstellung von Support-Tickets. ..

Dies sollte der Fall sein, und tatsächlich wird das für Bluemix Infrastructure-Benutzer bereitgestellte Kundenportal auch mithilfe der API erstellt, sodass alle Vorgänge, die auf dem Portal ausgeführt werden können, mit der API bereitgestellt werden. ..

Es gibt mehrere Artikel über die SoftLayer-API im Web. Bitte lesen Sie auch diese. Es ist hier organisiert. Referenzseite zur SoftLayer-API-Programmierung

Vorwort

Im Februar 2016 hat IBM mit VMware zusammengearbeitet, um einen vollständigen Stapel von VMware-Komponenten auf Bluemix verfügbar zu machen. Aus diesem Grund gibt es viele Möglichkeiten, VMware in der IBM Cloud allein mit IBM oder mit Bluemix Infrastructure-Partnern wie Softbank Commerce & Service in die Hand zu nehmen.

vSphere "6.5" unter IBM Bluemix Infrastructure (SoftLayer) zum Anfassen Zum Beispiel führen wir die oben genannten praktischen Übungen regelmäßig durch. Bitte besuchen Sie uns.

Das Problem hierbei ist jedoch der Aufbau einer praktischen Umgebung. Hands-on bietet jedem Teilnehmer einen Bare-Metal-Server und einen funktionierenden virtuellen Server. Es wäre schön, wenn die Anzahl der Teilnehmer noch klein wäre, aber wenn die Anzahl der Teilnehmer groß wäre, wäre es schwierig, dies manuell zu tun.

Außerdem gibt es viele kleine Aufgaben wie das Einstellen des VLAN und das Ausstellen von Tickets. Wenn Sie dies manuell tun, treten Fehler auf. (Es tut uns leid···) Dieses Mal werde ich versuchen, den Aufbau der praktischen Umgebung zu automatisieren, Fehler so weit wie möglich zu reduzieren und meine Belastung zu verringern.

Erforderliche Arbeiten zum Aufbau einer praktischen Umgebung

Die praktische Umgebung wird einfach wie folgt konfiguriert. image.png

Teilnehmer melden sich remote über SSL VPN bei ihrem zugewiesenen funktionierenden virtuellen Server an und installieren ESXi oder vCenter von diesem virtuellen Server auf einem Bare-Metal-Server. Daher müssen sich der Bare-Metal-Server und der virtuelle Server im selben VLAN befinden. Da wir das Internet nicht nutzen, müssen wir keine Verbindung zum öffentlichen VLAN herstellen, sodass wir nur Private bestellen.

Die Arbeiten zum Aufbau der Umgebung sind unten aufgeführt.

  1. Bereiten Sie E-Mail-Adressen für die IBM ID für die Anzahl der Personen vor
  2. Erstellen Sie einen Benutzer für Teilnehmer als untergeordneten Benutzer des praktischen Kontos
  1. Bestellen Sie stündliche Abrechnungs-BMS (Bare-Metal-Server) für die Anzahl der Personen
  1. Stellen Sie ein Ticket aus, um die BMS-Einstellungen zu ändern
  1. Richten Sie stündlich VSI (Virtual Server) für die Anzahl der Personen aus der Image-Vorlage in demselben VLAN wie BMS ein
  1. Weisen Sie dem Benutzer das bestellte BMS und VSI für den Teilnehmer zu
  2. Bereiten Sie Private Portable IP für VM im selben VLAN wie BMS und VSI vor

Es erfordert viel Arbeit. Es braucht Zeit und ich kann die Nacht zuvor aufgrund von Tippfehlern oder Auswahlfehlern nicht schlafen. Also werde ich all diese Aufgaben automatisieren.

Dieses Mal werde ich ein Skript mit Python schreiben. Übrigens bin ich mit Python nicht vertraut, also sag mir bitte heimlich, ob du lieber so schreiben möchtest.

Ein Skript erstellen

Das fertige Skript lautet wie folgt.

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)


Legen Sie außerdem die CSV-Datei der Teilnehmerliste im selben Ordner ab.

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
・ ・ ・

Der einfache Skriptablauf besteht darin, eine Zeile in der CSV-Datei zu lesen, den dort aufgeführten Benutzer zu erstellen, Berechtigungen festzulegen und den Bare-Metal-Server und den virtuellen Server anzuweisen, diesem Benutzer zuzuweisen. Es ist so geformt, als würde man es bis zur letzten Zeile wiederholen.

Von hier aus werde ich erklären, wie die API Teil für Teil verwendet wird. Es wird auch davon ausgegangen, dass Sie das Grundkonzept der SoftLayer-API und einfache Begriffe (Dienste, Methoden, Datentypen, Objektmasken usw.) verstehen.

CSV-Datei lesen

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):

Hier lesen wir die Teilnehmerlistendatei und verarbeiten sie zeilenweise. Die erste Zeile enthält den Vorgang des Überspringens als Kopfzeile.

Benutzer erstellen

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()

Hier wird es mit der Methode createObject des Dienstes User_Customer erstellt. Die folgenden drei Parameter können im createObject dieses Dienstes eingegeben werden.

Parameter Überblick Datentyp
templateObject Vom Benutzer erstellte Vorlage. User_Customer
password Konto Passwort. string
vpnPassword Passwort bei Verwendung von SSL VPN. string

Der User_Customer-Datentyp hat in Python die Form eines Wörterbuchobjekts. Die verfügbaren Schlüssel und Werte sind hier aufgelistet [http://sldn.softlayer.com/reference/datatypes/SOftLayer_User_Customer]. Ich bin.

Die aus der CSV-Datei gelesenen Daten werden beim Erstellen dieser Benutzervorlage eingebettet.

Außerdem wird der Kennwortparameter für "Nur-VPN-Benutzer" und "Mit IBM-ID erstellte Benutzer" ignoriert. Alle neu erstellten Benutzer sollen die IBMid-Authentifizierung verwenden, daher wird dies ignoriert. (In diesem Fall muss der Benutzer das Kennwort übrigens innerhalb von 24 Stunden initialisieren.)

Benutzerberechtigungseinstellungen

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()

Legen Sie als Nächstes die Portalberechtigungen für den erstellten Benutzer fest. Verwenden Sie die addBulkPortalPermission-Methode des User_Customer-Dienstes, um Berechtigungen festzulegen.

Weisen Sie dieser Methode die Liste der Berechtigungen zu, die Sie als Parameter festlegen möchten. Der Name, der als Wert von keyName in der Vorlage angegeben werden kann, lautet außerdem Listable in der Methode getAllObjects des Dienstes User_Customer_CustomerPermission_Permission.

Stündliche Abrechnung Bare-Metal-Server-Bestellung

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')
        
        

Der Bare-Metal-Server für die stündliche Abrechnung ist voreingestellt und mehrere Vorlagen sind vorkonfiguriert.

Hier verwenden wir die Hardware-Service-Methode createObject. Wenn Sie übrigens einen anpassbareren Bare-Metal-Server mit monatlicher Abrechnung bestellen möchten, verwenden Sie den Datentyp Container_Product_Order und legen Sie weitere Optionen fest. wird gebraucht.

Sie müssen die Vorlage als Parameter in die Methode createObject eingeben. Die Vorlage ist ein Wörterbuchobjekt, in dem das Rechenzentrum, das Betriebssystem usw. angegeben sind. Jeder Schlüssel und Wert finden Sie hier (http://sldn.softlayer.com/reference/services/softlayer_hardware/createobject). Ich werde unten kurz erklären.

Parameter Überblick Datentyp
datacenter.name Bezeichnung des Rechenzentrums string
hostname Server-Hostname string
domain Server Domain Name string
hourlyBillingFlag Wenn True, handelt es sich um einen stündlichen Abrechnungsserver. boolean
fixedConfigurationPreset.keyName Wählen Sie einen voreingestellten Typ. string
networkComponents.maxSpeed Gibt die Portgeschwindigkeit der Netzwerkkarte an. int
privateNetworkOnlyFlag Wenn True, wird es nur auf der privaten Netzwerkkarte bereitgestellt. boolean
operatingSystemReferenceCode Geben Sie das Betriebssystem an. string

Sie können die Liste der Werte überprüfen, die für jeden Parameter angegeben werden können, indem Sie die Methode getCreateObjectOptions des Hardwaredienstes verwenden. Übrigens können Sie das VLAN nicht nur für den Bare-Metal-Server mit stündlicher Abrechnung über den Parameter primaryNetworkComponent.networkVlan.id usw. angeben. Sie können die Bluemix-Seite nicht mit einem Ticket fragen.

Der letzte bms_allhosts enthält den FQDN des Bare-Metal-Servers. Es wird bei der Ausstellung eines Tickets verwendet.

Holen Sie sich Bare-Metal-Server-Informationen

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


Wenn Sie zuvor einen Bare-Metal-Server mit createObject bestellt haben, werden die Serverinformationen in order_bms als Rückgabewert der API gespeichert. Wenn die Bestellung jedoch bestätigt wird, werden die Server-ID und die VLAN-Informationen nicht bestätigt. Ein Beispiel für den Rückgabewert ist unten dargestellt.

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}

Die Werte für id und networkVlanId sind leer. Sie können diese Informationen zu diesem Zeitpunkt nicht abrufen, da die Bereitstellung noch nicht abgeschlossen ist.

Daher wird die ID mithilfe des globalIdentifier, der zum Zeitpunkt der Bestellung bestätigt wird, aus der getHardware-Methode des Kontodienstes entfernt. Ich versuche eine Weile zu warten, wenn die Bereitstellung nicht abgeschlossen ist.

Die VLAN-ID finden Sie auch in getNetworkVlans des Kontodienstes.

Übrigens wird die ID des Servers verwendet, um die Zugriffsberechtigung danach festzulegen, und die VLAN-ID wird verwendet, um das VLAN für den virtuellen Server anzugeben.

Stündliche Abrechnung der Bestellung des virtuellen Servers

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()
        

Bestellen Sie einen stündlichen virtuellen Server. Sie können ähnlich wie bei einem Bare-Metal-Server bestellen. Verwenden Sie die createObject-Methode des Virtual_Guest-Dienstes.

Der Unterschied zum Bare-Metal-Server besteht darin, dass der Parameter primaryBackendNetworkComponent.networkVlan zuerst das zu implementierende VLAN angibt. Da der virtuelle Server das VLAN auch dann auswählen kann, wenn es stündlich aufgeladen wird, wird es in demselben VLAN bereitgestellt wie der zuvor bestellte Bare-Metal-Server. Sie können auch aus einem Bild bestellen, indem Sie den globalIdentifier der Bildvorlage in blockDeviceTemplateGroup angeben. In diesem Fall können Sie das Betriebssystem oder die Festplatte nicht angeben.

Übrigens können Sie in der Bildvorlage öffentlich oder privat angeben, aber natürlich können Sie auch bei beiden bestellen. Sie können eine Liste von der Methode getPublicImages des Dienstes Virtual_Guest_Block_Device_Template_Group abrufen, wenn dieser öffentlich ist, oder von der Methode getBlockDeviceTemplateGroups des Dienstes Account, wenn er privat ist.

Informationen zum virtuellen Server abrufen

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
    

Rufen Sie die ID des virtuellen Servers ab, wie Sie es für einen Bare-Metal-Server getan haben.

Fügen Sie dem Server Zugriff hinzu

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()

Gewähren Sie dem erstellten Benutzer Serverzugriff. Verwenden Sie zunächst die Methode removeAllHardwareAccessForThisUser und die Methode removeAllVirtualAccessForThisUser des Dienstes User_Customer, um den Zugriff auf alle Server zu entfernen.

Gewähren Sie danach Zugriff auf den Server, der zuvor mit der Methode addBulkHardwareAccess und der Methode addBulkVirtualGuestAccess erstellt wurde.

Beachten Sie, dass "hardwareIds" und "virtualGuestIds" in Zuzuweisende Parameter für addBulkHardwareAccess und addBulkVirtualGuestAccess Arrays und keine int-Typen sind. Vergessen Sie nicht, es in das Listenformat zu bringen.

Ausgabe von Tickets

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)

Zum Schluss ein Ticket ausstellen und fertig. Verwenden Sie die Methode createStandardTicket des Ticketdienstes. Die in der Vorlage angegebene subjectId kann Get List mit der Methode getAllObjects des Ticket_Subject-Dienstes sein.

Da die Liste der Hosts in bms_allhosts gespeichert ist, sodass alle Server gleichzeitig geändert werden können, verwende ich sie.

Zusammenfassung

Dieses Mal wurde die zeitaufwändige Erstellung einer praktischen Umgebung mit der SoftLayer-API automatisiert. Neben der praktischen Umgebung finde ich es natürlich sehr attraktiv, 10 Server bestellen, Tickets mehrmals ausstellen und verschiedene Verwaltungsaufgaben automatisieren zu können.

Bitte benutzen Sie es auf jeden Fall! !!

Darüber hinaus wird VMware in der IBM Cloud jeden Monat zum Anfassen angeboten. Wenn Sie also Bluemix berühren oder VMware lieben möchten, verwenden Sie es bitte. Es ist kostenlos. vSphere "6.5" unter IBM Bluemix Infrastructure (SoftLayer) zum Anfassen

Recommended Posts

Ich habe versucht, die Erstellung einer praktischen Umgebung mithilfe der SoftLayer-API der IBM Cloud zu automatisieren
Ich habe versucht, das Update von "Werde ein Romanautor" mit "IFTTT" und "Werde ein Romanautor API" zu benachrichtigen.
Ich habe versucht, die API von Sakenowa Data Project zu verwenden
Ich habe versucht, [eine bestimmte Aufgabe] mit einem Raspeltorte zu automatisieren
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln
Ich habe versucht, die checkio-API zu verwenden
Ich habe versucht, mit Pandas eine Pferderenn-Datenbank zu erstellen
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
Ich habe versucht, mit Python einen regulären Ausdruck von "Zeit" zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Datum" zu erstellen
Ich habe versucht, mit Boto3 eine Liste der AMI-Namen zu erhalten
Ich habe versucht, die COTOHA-API zu berühren
Ich habe eine Web-API erstellt
Ich habe versucht, die BigQuery-Speicher-API zu verwenden
Ich habe versucht, das Gesichtsbild mit sparse_image_warp von TensorFlow Addons zu transformieren
Ich habe versucht, die Trefferergebnisse von Hachinai mithilfe der Bildverarbeitung zu erhalten
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, verschiedene Sätze mit der automatischen Zusammenfassungs-API "summpy" zusammenzufassen.
Ich habe versucht, die Phase der Geschichte mit COTOHA zu extrahieren und zu veranschaulichen
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Ich habe versucht, eine Clusteranalyse von Kunden anhand von Kaufdaten durchzuführen
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Ich habe die übliche Geschichte ausprobiert, Deep Learning zu verwenden, um den Nikkei-Durchschnitt vorherzusagen
Ich habe versucht, das Ergebnis des A / B-Tests mit dem Chi-Quadrat-Test zu überprüfen
Django super Einführung von Python-Anfängern! Teil 2 Ich habe versucht, die praktischen Funktionen der Vorlage zu nutzen
Ich habe versucht, E-Mails von Node.js und Python mithilfe des E-Mail-Zustelldienstes (SendGrid) von IBM Cloud zuzustellen!
Ich habe versucht, die Google Cloud Vision-API zu verwenden
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Mit PyAutoGui habe ich versucht, den UI-Test des VB6-Programms zu automatisieren, das unter Windows Server 2003 R2 ausgeführt wird (Eingabebefehls-Spickzettel).
Ich habe versucht, die Verschlechterung des Lithium-Ionen-Akkus mithilfe des Qore SDK vorherzusagen
Ich habe versucht, das Update von "Hameln" mit "Beautiful Soup" und "IFTTT" zu benachrichtigen.
[Python] Ich habe versucht, das Mitgliederbild der Idolgruppe mithilfe von Keras zu beurteilen
Ich habe versucht, die 100-Yen-Lagerstätte von Rakuten-Pferderennen (Python / Selen) zu automatisieren.
Konvertieren der cURL-API in ein Python-Skript (mithilfe des IBM Cloud-Objektspeichers)
Ich habe ein Skript erstellt, das das aktive Fenster mit win32gui von Python aufzeichnet
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
Ich habe versucht, die Lernfunktion im neuronalen Netzwerk sorgfältig zu verstehen, ohne die Bibliothek für maschinelles Lernen zu verwenden (erste Hälfte).
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren
[Go + Gin] Ich habe versucht, eine Docker-Umgebung zu erstellen
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich möchte ssh mit dem Befehl expected automatisieren!
Ich habe versucht, Python (3) anstelle eines Funktionsrechners zu verwenden
Ich habe versucht, die Sprache mit CNN + Melspectogram zu identifizieren
Ich habe versucht, das Wissensdiagramm mit OpenKE zu ergänzen
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, ein Konfigurationsdiagramm mit Diagrammen zu zeichnen
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, mit dem Seq2Seq-Modell von TensorFlow so etwas wie einen Chatbot zu erstellen
Ich habe versucht, den Sieg oder die Niederlage der Premier League mit dem Qore SDK vorherzusagen
Python-Übung 100 Schläge Ich habe versucht, den Entscheidungsbaum von Kapitel 5 mit graphviz zu visualisieren