web-dev-qa-db-ja.com

Pythonを使用してAzure CLIコマンドを実行する方法

Azure CLIを使用して、リソースグループ内のすべてのVMのリストを取得したいと考えています。しかし、pythonスクリプトを使用して同じことを実装したいと思います。

たとえば、Azure CLIで次のコマンドを使用して、リソースグループ内のVMを一覧表示します。

「az vm list -g MyResourceGroup」

しかし、pythonスクリプトで同じことを実行したいのですが、CLIコマンドをpythonプログラムに組み込む必要があります。

7
I am L

私はこれを過去数日間実装してきました。 @cbehrenbergが提供する方法はほとんどが私が使用した方法ですが、一時ファイルを使用しなくても実行できることがわかりました。代わりに、Azureクライアントから直接出力をキャッチします。役に立つかもしれないと思った。

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

次に同じ方法で呼び出します:

from azhelper import az_cli

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

Pythonを使用してAzure CLIコマンドを実行する方法

これによると ファイル 。次の方法でAzure CLIを呼び出すことができます。

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

注:No module named 'Azure.cli.command_modules'エラーが発生した場合は、Azure-cliをインストールしてください

enter image description here

5
Tom Sun - MSFT

サブプロセスはAzure CLIが見つかったPATHをチェックしないため、サブプロセスソリューションの使用には問題があります。 Windowsの場合。 「cmd -c」を使用するには、Windows固有のソリューションであり、追加のLinuxサポートのためにfork if/elseが必要です。

@ tom-Sunの答えはほぼ正しいです。CLIもPythonで記述されているため、Azure CLI pythonモジュールを再利用できます。問題は、.invoke()命令が返されることです。は常にエラーコードを返します。完全なボディレスポンスを取得するには、基になるKnackコードの引数リストにオブジェクトのようなファイルを渡して、レスポンスを取得する必要があります。デフォルトでは、これによりStdOutにリダイレクトされるため、これを確認できます。例えばあなたのターミナルでは、あなたは成功のために常にゼロを得ます。

私は、Azure CLIの指示を1つの文字列で受け入れる小さなヘルパー関数を書きました(リストのように多くの引数が好きではないので、うまく読みません。しかし、それは単なる個人的な好みであり、私を責めないでください)。一時ファイルを出力ターゲットとして使用し、それをメモリに読み戻します-これは、基礎となるKnack CLIコードから確認する必要があります。デフォルトでは、StdOutが標準パイプです。

PythonにAzure-cliをインストールする必要があります:pip install Azure-cli

ファイル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]

その後、次のように呼び出すことができます。

from azhelper import *

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

もちろん、ログインする必要があります。@ 4c74356b41の回答を参照してください。

誰かが一時ファイルではなく応答を処理するためのより良い方法を見つけた場合、これは非常にありがたいです!メモリ内のStringIOオブジェクトで試してみましたが、これはどういうわけか基礎となるKnack CLIコードに準拠していません。

4
cbehrenberg

使用する subprocess.runを使用する代わりにsubprocess.Popen

デフォルトでは、pythonスクリプトは、サブプロセス(この場合はAzure cliコマンド)から実行されるプログラムが完了するまで待機します。

たとえば、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']

サブプロセスモジュールの使用の詳細については、 this リンクを参照してください。

0
Arun Pant

Get_default_cliを使用する代わりに、サブプロセスを使用してaz cliを呼び出して出力を取得できると思います。リファレンス 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

あなたはまだこれを削除しなかったので、私はあなたがまだ道を探していると思います。

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

また、次のようなものを使用して、最初にサイレント認証を行う必要もあります。

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