[PYTHON] Abrufen der JSON-Vorlage einer bestimmten Ressource in der Ressourcengruppe (Azure CLI)

Hintergrund

Wenn Sie ein System mit Azure erstellen und eine JSON-Vorlage für später vorbereiten, können Sie schnell dasselbe System erstellen (Infrastrukturteil wie Server, Netzwerk). Abhängig von der Größe des Systems kann eine einzelne JSON-Vorlage für die gesamte Ressourcengruppe sehr groß sein.

Daher versuchen wir, für jede Ressource eine JSON-Vorlage auszugeben. Das ist ziemlich nervig.

Diesmal ist der Inhalt für Linux- und Azure-CLI-Benutzer bestimmt. Da es sofort erstellt wurde, liegt es an den Lesern, es zu optimieren. (Werfen) Ich werde es verbessern, wenn ich Zeit und Freizeit habe.

Ich habe in Python geschrieben und dachte, dass PowerShell einfacher zu sein scheint.

Azure CLI-Befehl zum Ausführen

Details werden später beschrieben, aber zuerst werde ich vorstellen, was im Befehl zu verwenden ist. Die Option "--json" ist erforderlich, da die Azure-CLI nicht jeden Wert wiederverwenden kann, ohne JSON auszugeben.

  1. Rufen Sie die Liste der Ressourcen in der Ressourcengruppe ab

    azure resource list --resource-group [RG Name] --tags [Key]=[Value] --json
    
  2. Erhalten Sie detaillierte Informationen zu Resource Provider

    azure provider show --namespace [Resource Provider] --json
    
  3. Holen Sie sich die Details der Ressource (Zweck dieser Zeit)

    azure resource show --resource-id [Resource ID] --api-version [API Version] --json
    

Gesamtbild

Python


import os
import commands
import json

def getresourcejson():
    #Bereiten Sie einen Befehl vor, um nur die Ressourcen eines bestimmten Tags abzurufen
    resourceListCmd = 'azure resource list --resource-group [RG Name] --tags [Key]=[Value] --json'
    #Führen Sie den Befehl aus und erhalten Sie die Ausgabe
    resourceList = commands.getoutput(resourceListCmd)
    #Objektisieren Sie die JSON-Ausgabe
    resourceListJson = json.loads(resourceList)
    #Analysieren Sie jede Ressource einzeln
    for resource in resourceListJson:
        #Rufen Sie jeden Ressourcentyp ab, um die API-Version abzurufen
        #In diesem Moment,'[Resourece Provider]/[Resource Type]'Teilen Sie dies mit einem Schrägstrich und machen Sie jede Variable
        resourceTypeStr = str(resource['type']).split('/')
        resourceProv = resourceTypeStr[0]
        resourceType = resourceTypeStr[1]
        #Bereiten Sie einen Befehl vor, um die neueste API-Version aus dem erhaltenen Ressourcentyp abzurufen
        resourceTypeListCmd = 'azure provider show --namespace ' + resourceProv + ' --json'
        #Führen Sie den Befehl aus und erhalten Sie die Ausgabe
        resourceTypeList = commands.getoutput(resourceTypeListCmd)
        #Objektisieren Sie die JSON-Ausgabe
        resourceTypeListJson = json.loads(resourceTypeList)
        #Ich möchte den Ressourcentyp unter dem Ressourcenanbieter, also nehme ich ihn heraus.
        rTypes = resourceTypeListJson['resourceTypes']
        #Bereiten Sie eine Box für die API-Version vor
        apiVer = ''
        #API-Version abrufen
        for rType in rTypes:
            #Ich interessiere mich nicht für andere Ressourcentypen als den, den ich möchte, also filtere ich
            if str(rType['resourceType']) == resourceType:
                #Erhalten Sie es, weil der Beginn von apiVersions der neueste ist (wie)
                #Einige Ressourcen haben das neueste Ende, daher wird empfohlen, dies im Voraus zu überprüfen.
                apiVer = str(rType['apiVersions'][0])
        #Definieren Sie den Namen der Ausgabedatei
        outFileName = str(resource['name']) + '.json'
        #Bereiten Sie einen Befehl vor, um den JSON jeder Ressource abzurufen
        resCmd = 'azure resource show --resource-id ' + str(resource['id']) + ' --api-version ' + apiVer + ' --json'
        #Führen Sie einen Befehl aus
        res = commands.getoutput(resCmd)
        #Da die Registerkartengröße für die Standardausgabe 2 beträgt, setzen Sie sie auf 4.
        #Objektisieren Sie die JSON-Ausgabe
        resJson = json.loads(res)
        #Schreiben Sie eine Datei mit einer Tabulatorgröße von 4
        with open(outFileName, 'w') as f:
            # sort_Wenn die Schlüssel auf "Wahr" gesetzt sind, ist es schwierig, sie als Azure JSON-Vorlage anzuzeigen. Setzen Sie sie daher auf "Falsch".
            json.dump(resJson, f, sort_keys = False, indent = 4)
        #Ausgabe abgeschlossen anzeigen
        print str('Complete output. File: ') + outFileName

if __name__ == '__main__':
    getresourcejson()

Kommentar

1. Geben Sie "tag" an

Ein Punkt ist, dass das Tag am Anfang im Azure CLI-Befehl angegeben wird.

Python


#Bereiten Sie einen Befehl vor, um nur die Ressourcen eines bestimmten Tags abzurufen
resourceListCmd = 'azure resource list --resource-group [RG Name] --tags [Key]=[Value] --json'

Die meisten Ressourcen, die nützlich wären, um später eine JSON-Vorlage zu haben, können mit Tags versehen werden. Wenn Sie es nicht markieren, müssen Sie herausfiltern, was Sie in Ihrer JSON-Vorlage nicht benötigen.

Es gibt andere nützliche Dinge, die mit Tags zu tun haben, daher kann ich es nur empfehlen.

Da Sie beispielsweise mehrere angeben können, können Sie nur die in der DMZ platzierten VMs verarbeiten. Unten finden Sie ein Beispiel für das Markieren.

azure vm set --resource-group [RG Name] --name [VM Name] --tags "ResourceType=VM;Segment=DMZ"

2. Ausgabe von "azure resource list --json"

Die von diesem Befehl ausgegebenen Informationen sind begrenzt. Aber es reicht aus, um dieses Ziel zu erreichen.

Alles was Sie brauchen sind die folgenden drei.

  1. Resource ID

Erforderlich, um die JSON-Vorlage für die Zielressource abzurufen.

  1. Name

Wird für den Dateinamen verwendet, um die JSON-Vorlage der Zielressource zu speichern.

  1. Resource Type

Erforderlich, um die API-Version abzurufen, die zum Abrufen der JSON-Vorlage für die Zielressource erforderlich ist.

Der Ausgabe-JSON wird als Array behandelt, da Informationen wie die ID jeder Ressource durch Kommas getrennt formatiert werden. Deshalb schalte ich Foreach ein.

3. Holen Sie sich die API-Version

Von hier aus mache ich viel Versuch und Irrtum, um die API-Version zu erhalten. Lassen Sie es mich einfacher machen, Microsoft. .. ..

3-1 Teilen Sie den Ressourcentyp in Anbieter und Typ

Um die API-Version zu erhalten, müssen Sie Informationen vom Ressourcenanbieter abrufen. Hier kommt der Befehl "Azure Provider Show" ins Spiel.

Darüber hinaus ist es eine Gewohnheit, dass die Liste der API-Versionen nicht ohne die Option "--json" abgerufen werden kann. Es ist in Ordnung, da es im Code nur wiederverwendet werden kann, wenn es in JSON konvertiert wurde, aber Sie möchten es zuerst überprüfen, oder? Sie müssen es in JSON konvertieren, um es zu überprüfen. Achtung.

Der erforderliche Parameter beim Ausführen des Befehls "Azure Provider Show" ist "--namespace". Beachten Sie, dass hier der Ressourcenanbieter übergeben wird, nicht der Ressourcentyp.

Ein Fehler tritt mit dem Ressourcentyp auf, der von der "Azure-Ressourcenliste" erfasst wurde. Der Ressourcenanbieter steht vor dem Schrägstrich dieses Ressourcentyps und der Ressourcentyp nach dem Schrägstrich.

Also lasst es uns teilen. Da der Ressourcentyp später verwendet wird, ist es einfacher zu erkennen, ob beide variabel sind.

3-2. Grenzen Sie den Zielressourcentyp in der Liste Ressourcentyp unter Ressourcenanbieter ein und rufen Sie die API-Version ab.

Die JSON-Ausgabe von "Azure Provider Show" ist ein Objekt. Da dies jedoch mehrere Ressourcentypen enthält, Foreach erneut.

Hier wird der zuvor aufgeteilte Ressourcentyp verwendet. Weil dieser Ressourcentyp der "Zielressourcentyp" ist.

Die API-Version ist im Zielressourcentyp enthalten. Extrahieren Sie sie daher hier. Beachten Sie jedoch, dass es mehrere gibt.

Soweit ich überprüft habe, ist die erste die neueste, daher greife ich zur ersten API-Version. Abhängig vom Ressourcentyp ist dies möglicherweise nicht der Anfang. Korrigieren Sie ihn daher gegebenenfalls.

4. Holen Sie sich die endgültige JSON-Vorlage

Sobald Sie die API-Version haben, können Sie die Ressourcen-ID angeben und "Azure Resource Show" ausführen.

Sie können direkt aus der Standardausgabe der Option "--json" in die Datei schreiben. Wenn Sie jedoch neugierig auf die eingerückte Tabulatorgröße von 2 sind, ändern Sie die Tabulatorgröße mit "json.dump".

Für allgemeines JSON scheint das Sortieren nach Schlüssel der De-facto-Standard zu sein, aber für Azure JSON-Vorlagen ist die von der Azure-Seite angegebene Reihenfolge leichter zu erkennen, daher wird empfohlen, nicht zu sortieren.

JSON-Vorlage kochen

Wenn Sie dieses Python-Skript ausführen, wird für jede Ressource eine JSON-Vorlage als Datei ausgegeben. Lassen Sie uns daher die Ressourcengruppe gemäß der Konvention von Azure Resource Manager vorlegen.

Nachdem Sie eine Vorlage erstellt haben, können Sie sie fast automatisieren, indem Sie die Mitte mit Ansible usw. auf der VM installieren.

Die Azure PowerShell-Version wird zu einem späteren Zeitpunkt verfügbar sein

Wie eingangs erwähnt, diesmal die Methode für die Azure-CLI. Ich werde zu einem späteren Zeitpunkt eine Azure PowerShell-Version erstellen.

Nachtrag (28.12.2016 1. Mal) - Apologie

Ich habe bemerkt. Sie können JSON nicht mit Azure PowerShell ausgeben ...

Ich dachte, ich sollte mit einer Pipe zu Json konvertieren, aber als ich es tatsächlich versuchte, war der Inhalt ganz anders. Könnten Sie eine -Json-Option wie die Azure-CLI erstellen?

Aus diesem Grund habe ich ursprünglich versucht, die Azure PowerShell-Edition zu schreiben, aber ich werde keine falschen Informationen mehr veröffentlichen. Es tut mir leid für diejenigen, die es erwartet haben.

Postscript (28.12.2016 2. Mal) - Quellenoptimierung

Es war ein wenig bedauerlich, es als schmutzige Quelle zu veröffentlichen, also bereinigen Sie die Quelle.

Python


import sys
import commands
import json

def ExecuteCmdlet(cmdlet):
    result = commands.getoutput(cmdlet)
    return json.loads(result)

def GetResourceList(rgName, tags):
    cmdlet = 'azure resource list --resource-group ' + rgName + ' --tags ' + tags + ' --json'
    return ExecuteCmdlet(cmdlet)

def GetResourceTypeList(provider):
    cmdlet = 'azure provider show --namespace ' + provider + ' --json'
    result = ExecuteCmdlet(cmdlet)
    return result['resourceTypes']

def GetResource(resourceId, apiVersion):
    cmdlet = 'azure resource show --resource-id ' + resourceId + ' --api-version ' + apiVersion + ' --json'
    return ExecuteCmdlet(cmdlet)

def GetApiVersion(typeList, target):
    result = ''
    for t in typeList:
        if str(t['resourceType']) == target:
            result = str(t['apiVersions'][0])
    return result

def GetResourceJson(resourceGroupName, tagName, tagValue):
    tags = tagName + '=' + tagValue
    resourceList = GetResourceList(resourceGroupName, tags)
    for resource in resourceList:
        resourceName = str(resource['name'])
        resourceId = str(resource['id'])
        resourceProvider = str(resource['type']).split('/')[0]
        targetResourceType = str(resource['type']).split('/')[1]
        resourceTypeList = GetResourceTypeList(resourceProvider)
        apiVersion = GetApiVersion(resourceTypeList, targetResourceType)
        outFileName = resourceName + '.json'
        resources = GetResource(resourceId, apiVersion)
        with open(outFileName, 'w') as f:
            json.dump(resources, f, sort_keys = False, indent = 4)
        print str('Complete output. File: ') + outFileName

if __name__ == '__main__':
    argvs = sys.argv
    if len(argvs) != 4:
        print 'Usage: python GetResourceJson.py [Resource Group Name] [Tag Name] [Tag Value]'
        exit()
    rgName = argvs[1]
    tagName = argvs[2]
    tagValue = argvs[3]
    GetResourceJson(rgName, tagName, tagValue)
    exit()

Recommended Posts

Abrufen der JSON-Vorlage einer bestimmten Ressource in der Ressourcengruppe (Azure CLI)
Holen Sie sich die Anzahl der spezifischen Elemente in der Python-Liste
Ruft alle IP-Adressen von Instanzen in der Autoscaling-Gruppe ab
Umgang mit JSON-Dateien in Python
Holen Sie sich den Schlüssel für die Migration von JSON-Daten auf der zweiten Ebene mit Python
Entfernen Sie DICOM-Bilder in Python