web-dev-qa-db-fra.com

Comment exécuter des commandes Azure CLI à l'aide de python?

Je souhaite utiliser Azure CLI pour obtenir la liste de toutes les machines virtuelles de mon groupe de ressources. Mais je veux implémenter la même chose en utilisant un script python.

Par exemple, j'utiliserai la commande suivante dans Azure CLI pour répertorier les machines virtuelles dans mon groupe de ressources:

"az vm list -g MyResourceGroup"

Mais, je veux que le script python fasse de même, où je dois simplement incorporer la commande CLI dans le programme python.

7
I am L

J'ai mis en œuvre cela au cours des derniers jours. La méthode fournie par @cbehrenberg est principalement celle que j'ai utilisée, mais j'ai trouvé que vous pouvez le faire sans utiliser de fichier temporaire. Attrapez plutôt la sortie directement à partir du client Azure. J'ai pensé que cela pourrait être utile.

from Azure.cli.core import get_default_cli

def az_cli (args_str):
    args = args_str.split()
    cli = get_default_cli()
    cli.invoke(args)
    if cli.result.result:
        return cli.result.result
    Elif cli.result.error:
        raise cli.result.error
    return True

Puis invoqué de la même manière:

from azhelper import az_cli

response = az_cli("vm list")
print("vm's: %s" % (response))
7
joek575

Comment exécuter des commandes Azure CLI à l'aide de python?

Selon cela fichier . nous pourrions invoquer Azure CLI de la manière suivante:

from Azure.cli.core import get_default_cli
get_default_cli().invoke(['vm', 'list', '-g', 'groupname'])

Remarque: Si vous obtenez No module named 'Azure.cli.command_modules' erreur, veuillez installer Azure-cli

enter image description here

5
Tom Sun - MSFT

L'utilisation de la solution de sous-processus est problématique car le sous-processus ne vérifie pas le CHEMIN où se trouve Azure CLI, par exemple sous Windows. Utiliser "cmd -c" serait une solution spécifique à Windows et aurait besoin d'un fork si/else pour un support Linux supplémentaire.

La réponse de @ tom-Sun est presque correcte, car vous pouvez réutiliser les modules Azure CLI python, car la CLI est également écrite en Python. Le problème est que le retour de l'instruction .invoke () renvoie toujours le code d'erreur. Pour obtenir la réponse complète du corps, vous devez passer un objet de type fichier dans la liste d'arguments du code Knack sous-jacent pour obtenir la réponse. Par défaut, cela redirige vers StdOut, c'est pourquoi vous pouvez le voir par exemple dans votre terminal mais vous obtenez toujours un zéro pour le succès.

J'ai écrit une petite fonction d'aide qui accepte les instructions Azure CLI dans une chaîne (je n'aime pas beaucoup d'arguments comme liste, elle ne se lit pas bien - mais ce n'est qu'une préférence personnelle, ne me blâmez pas). Il utilise un fichier temporaire comme cible de sortie, puis il est relu en mémoire - cela est nécessaire afaik à partir du code CLI Knack sous-jacent; par défaut, StdOut est le tuyau standard.

Cela nécessite que vous ayez installé Azure-cli pour Python: pip install Azure-cli

Fichier azhelper.py:

from Azure.cli.core import get_default_cli
import tempfile

def az_cli (args_str):
    temp = tempfile.TemporaryFile()
    args = args_str.split()
    code = get_default_cli().invoke(args, None, temp)
    temp.seek(0)
    data = temp.read().strip()
    temp.close()
    return [code, data]

Vous pouvez alors invoquer comme ceci:

from azhelper import *

code, response = az_cli("vm list")
print("vm's: %s" % (response))

Bien sûr, vous devez être connecté, voir la réponse @ 4c74356b41.

Si quelqu'un trouve une meilleure façon de traiter la réponse à la place avec un fichier temporaire, ce serait très apprécié! J'ai essayé avec un objet StringIO en mémoire, mais cela n'est pas conforme au code CLI Knack sous-jacent.

4
cbehrenberg

Utilisation subprocess.run à la place d'utiliser subprocess.Popen

Il provoquera par défaut python à attendre que le programme exécuté à partir du sous-processus (dans ce cas, la commande Azure cli) soit terminé.

Par exemple, créons une application Azure AD.

import subprocess
import json

# create command you want to run on az cli as a string
create_app_command = "az ad sp create-for-rbac --skip-assignment --years 20 --name dummy_app"

# use 'Shell = True' as Azure CLI installed on system is accessible from native Shell
# using 'subprocess.PIPE' will return stderr and stdout to create_app object
create_app = subprocess.run(create_app_command, Shell = True, stdout=sbuprocess.PIPE, stderr = sbuprocess.PIPE)

# reading output and error
create_app_stdout =  create_app.stdout.decode("utf-8")
create_app_stderr = create_app.stderr.decode("utf-8")

# now you can log error to a file 'logging.error(create_app_stderr)

# you can use stdout for further logic in code
# let's get you need to get appID and password for authentication somewhere later in code
ad_app_details = json.loads(create_app_stdout)
ad_app_appId = ad_app_details['appId']
ad_app_password = ad_app_details['password']

Pour plus d'informations sur l'utilisation du module de sous-processus, voir this link

0
Arun Pant

Je pense que vous pouvez utiliser le sous-processus et appeler l'az cli pour obtenir la sortie à la place en utilisant get_default_cli. Référence Git Repo

import subprocess
import json

process = subprocess.Popen(['az','network', 'ddos-protection', 'list'], stdout=subprocess.PIPE)
out, err = process.communicate()
d = json.loads(out)
print(d)
0
Andy Wong

puisque vous n'avez toujours pas supprimé cela, je suppose que vous cherchez toujours un moyen.

from subprocess import call   
call(["az", "vm", "list", "-g", "rgName"])

vous devrez également vous authentifier silencieusement en premier avec quelque chose comme:

az login --service-principal -u http://sample-cli-login -p Test1234 --tenant 54826b22-38d6-4fb2-bad9-b7b93a3e9c5a
0
4c74356b41