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.
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.
Obtenez la liste des ressources dans le groupe de ressources
azure resource list --resource-group [RG Name] --tags [Key]=[Value] --json
Obtenez des informations détaillées sur le fournisseur de ressources
azure provider show --namespace [Resource Provider] --json
Obtenez les détails de la ressource (but de cette fois)
azure resource show --resource-id [Resource ID] --api-version [API Version] --json
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()
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"
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.
Requis pour obtenir le modèle JSON de la ressource cible.
Utilisé pour le nom de fichier pour enregistrer le modèle JSON de la ressource cible.
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.
À partir de là, je fais beaucoup d'essais et d'erreurs pour obtenir la version de l'API. Laissez-moi comprendre plus facilement, Microsoft. .. ..
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.
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.
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.
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.
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.
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.
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