[PYTHON] Obtenir le modèle JSON d'une ressource spécifique dans le groupe de ressources (Azure CLI)

Contexte

Lorsque vous créez un système avec Azure, si vous préparez un modèle JSON pour plus tard, vous pouvez rapidement créer le même système (partie infrastructure telle que serveur, réseau). Selon la taille du système, un modèle JSON unique pour l'ensemble du groupe de ressources peut être assez volumineux.

Par conséquent, nous essayons de générer un modèle JSON pour chaque ressource. C'est assez ennuyeux.

Cette fois, le contenu est destiné aux utilisateurs Linux et Azure CLI. Puisqu'il a été fait instantanément, c'est aux lecteurs de l'optimiser. (Lancement) Je l'améliorerai si j'ai du temps et du temps libre.

J'écrivais en Python, pensant que PowerShell semble être plus facile.

Commande Azure CLI à exécuter

Les détails seront décrits plus tard, mais je vais d'abord présenter ce qu'il faut utiliser dans la commande. L'option --json est requise car l'interface de ligne de commande Azure ne peut pas réutiliser chaque valeur sans afficher JSON.

  1. Obtenez la liste des ressources dans le groupe de ressources

    azure resource list --resource-group [RG Name] --tags [Key]=[Value] --json
    
  2. Obtenez des informations détaillées sur le fournisseur de ressources

    azure provider show --namespace [Resource Provider] --json
    
  3. Obtenez les détails de la ressource (but de cette fois)

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

Vue d'ensemble

Python


import os
import commands
import json

def getresourcejson():
    #Préparez une commande pour obtenir uniquement les ressources d'une balise spécifique
    resourceListCmd = 'azure resource list --resource-group [RG Name] --tags [Key]=[Value] --json'
    #Exécutez la commande et obtenez la sortie
    resourceList = commands.getoutput(resourceListCmd)
    #Objectize JSON sortie
    resourceListJson = json.loads(resourceList)
    #Analysez chaque ressource une par une
    for resource in resourceListJson:
        #Obtenez chaque type de ressource pour obtenir la version de l'API
        #Cette fois,'[Resourece Provider]/[Resource Type]'Comme c'est le cas, séparez-le par une barre oblique et faites
        resourceTypeStr = str(resource['type']).split('/')
        resourceProv = resourceTypeStr[0]
        resourceType = resourceTypeStr[1]
        #Préparez une commande pour obtenir la dernière version de l'API à partir du type de ressource obtenu
        resourceTypeListCmd = 'azure provider show --namespace ' + resourceProv + ' --json'
        #Exécutez la commande et obtenez la sortie
        resourceTypeList = commands.getoutput(resourceTypeListCmd)
        #Objectize JSON sortie
        resourceTypeListJson = json.loads(resourceTypeList)
        #Je veux le type de ressource sous le fournisseur de ressources, donc je le supprime.
        rTypes = resourceTypeListJson['resourceTypes']
        #Préparer une boîte pour la version API
        apiVer = ''
        #Obtenir la version de l'API
        for rType in rTypes:
            #Je ne suis pas intéressé par les types de ressources autres que celui que je souhaite, donc je filtre
            if str(rType['resourceType']) == resourceType:
                #Obtenez-le car le début d'apiVersions est le dernier (comme)
                #Certaines ressources ont la dernière fin, il est donc recommandé de vérifier à l'avance.
                apiVer = str(rType['apiVersions'][0])
        #Définir le nom du fichier de sortie
        outFileName = str(resource['name']) + '.json'
        #Préparez une commande pour obtenir le JSON de chaque ressource
        resCmd = 'azure resource show --resource-id ' + str(resource['id']) + ' --api-version ' + apiVer + ' --json'
        #Exécuter une commande
        res = commands.getoutput(resCmd)
        #La taille de l'onglet étant de 2 pour la sortie standard, définissez-la sur 4.
        #Objectize JSON sortie
        resJson = json.loads(res)
        #Ecrire un fichier avec une taille de tabulation de 4
        with open(outFileName, 'w') as f:
            # sort_Si keys est défini sur True, il sera difficile de le voir comme un modèle Azure JSON, définissez-le donc sur False.
            json.dump(resJson, f, sort_keys = False, indent = 4)
        #Afficher l'achèvement de la sortie
        print str('Complete output. File: ') + outFileName

if __name__ == '__main__':
    getresourcejson()

Commentaire

1. Spécifiez "tag"

Un point est que la balise est spécifiée dans la commande Azure CLI au début.

Python


#Préparez une commande pour obtenir uniquement les ressources d'une balise spécifique
resourceListCmd = 'azure resource list --resource-group [RG Name] --tags [Key]=[Value] --json'

La plupart des ressources qui seraient utiles pour avoir un modèle JSON plus tard peuvent être balisées. Si vous ne le marquez pas, vous devrez filtrer ce dont vous n'avez pas besoin dans votre modèle JSON.

Il y a d'autres choses utiles à faire avec les balises, je le recommande donc vivement.

Comme vous pouvez en spécifier plusieurs, par exemple, vous ne pouvez gérer que les VM placées dans la DMZ. Vous trouverez ci-dessous un exemple de marquage.

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

2. Sortie de "azure resource list --json"

Les informations fournies par cette commande sont limitées. Mais c'est suffisant pour atteindre cet objectif.

Tout ce dont vous avez besoin, ce sont les trois suivants.

  1. Resource ID

Requis pour obtenir le modèle JSON de la ressource cible.

  1. Name

Utilisé pour le nom de fichier pour enregistrer le modèle JSON de la ressource cible.

  1. Resource Type

Requis pour obtenir la version d'API nécessaire pour obtenir le modèle JSON pour la ressource cible.

Le JSON de sortie est traité comme un tableau car les informations telles que l'ID de chaque ressource sont formatées séparées par des virgules. C'est pourquoi je l'allume Foreach.

3. Obtenir la version de l'API

À partir de là, je fais beaucoup d'essais et d'erreurs pour obtenir la version de l'API. Laissez-moi comprendre plus facilement, Microsoft. .. ..

3-1. Diviser le type de ressource en fournisseur et type

Pour obtenir la version de l'API, vous devez extraire des informations du fournisseur de ressources. C'est là qu'intervient la commande ʻazure provider show`.

De plus, c'est une habitude que la liste des versions de l'API ne peut pas être récupérée sans l'option --json. Ce n'est pas grave car il ne peut pas être réutilisé dans le code à moins qu'il ne soit converti en JSON, mais vous voulez d'abord le vérifier, non? Vous devez le convertir en JSON pour le vérifier. Faites attention.

ʻLe paramètre requis lors de l'exécution de la commande show du fournisseur azure est --namespace`. Notez que c'est le fournisseur de ressources qui est passé ici, pas le type de ressource.

Une erreur se produira avec le type de ressource sélectionné dans «liste de ressources azure». Le fournisseur de ressources se trouve avant la barre oblique de ce type de ressource et le type de ressource est après la barre oblique.

Alors divisons-le. Étant donné que le type de ressource sera utilisé plus tard, il est plus facile d'identifier si les deux sont variables.

3-2. Affinez le type de ressource cible dans la liste Type de ressource sous le fournisseur de ressources et obtenez la version de l'API.

La sortie JSON de ʻazure provider show` est un objet, mais comme il y a plusieurs types de ressources dans celui-ci, Foreach à nouveau.

Le type de ressource fractionné précédemment est utilisé ici. Parce que ce type de ressource est le «type de ressource cible».

La version de l'API est incluse dans le type de ressource cible, alors extrayez-la d'ici. Cependant, notez qu'il y en a plusieurs.

D'après ce que j'ai vérifié, le premier est le dernier, donc je prends la première version de l'API. Selon le type de ressource, ce n'est peut-être pas le début, veuillez donc le corriger si nécessaire.

4. Obtenez le modèle JSON final

Une fois que vous avez la version de l'API, vous pouvez spécifier l'ID de ressource et exécuter ʻazure resource show`.

Vous pouvez écrire dans le fichier directement à partir de la sortie standard de l'option --json, mais si vous êtes curieux de connaître la taille de l'onglet en retrait de 2, changez la taille de l'onglet avec json.dump.

Pour le JSON général, le tri par clé semble être la norme de facto, mais pour les modèles Azure JSON, l'ordre spécifié par le côté Azure est plus facile à voir, il est donc recommandé de ne pas trier.

Modèle JSON de cuisine

Si vous exécutez ce script Python, un modèle JSON sera généré sous forme de fichier pour chaque ressource, donc modélisons le groupe de ressources selon la convention d'Azure Resource Manager.

Après avoir créé un modèle, vous pouvez presque l'automatiser en installant le milieu sur la VM avec Ansible, etc.

La version d'Azure PowerShell sera disponible à une date ultérieure

Comme mentionné au début, cette fois, la méthode pour Azure CLI. Je créerai une version d'Azure PowerShell à une date ultérieure.

Postscript (2016/12/28 1ère fois) - Apologie

J'ai remarqué. Vous ne pouvez pas générer de JSON avec Azure PowerShell ...

J'ai pensé que je devrais convertir en Json avec un tuyau, mais quand je l'ai essayé, le contenu était assez différent. Pourriez-vous créer une option -Json comme Azure CLI?

C'est pourquoi j'essayais initialement d'écrire l'édition Azure PowerShell, mais je vais arrêter de publier des informations incorrectes. Je suis désolé pour ceux qui s'y attendaient.

Postscript (28/12/2016 2ème fois) - Optimisation des sources

C'était un peu regrettable de le publier comme une source sale, alors nettoyez la source.

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

Obtenir le modèle JSON d'une ressource spécifique dans le groupe de ressources (Azure CLI)
Obtenez le nombre d'éléments spécifiques dans la liste python
Obtenir toutes les adresses IP des instances du groupe d'autoscaling
Gestion des fichiers JSON en Python
Obtenez la clé pour la migration de la deuxième couche de données JSON avec python
Débarrassez-vous des images DICOM en Python