2017-10-13 13 views
2

私の要件は、起動時にすべてのVMをサブスクリプションで取得することです。私はVMがダッシュボードで時刻を作成したのを見つけませんでした。Activity logにあるようにタイムスタンプが見つかりました。作成した時刻と共に1つのサブスクリプションIDで作成されたすべてのVMをフェッチしたいと思います。Python APIを使用してAzureで仮想マシンの作成時間を取得します

(2FAがそのように有効になっている。このアカウントの詳細について - UserPassCredentialsが動作しません)サブスクリプションID内のすべてのVMの

一覧:

import os 
from azure.common.credentials import ServicePrincipalCredentials 
from azure.mgmt.compute import ComputeManagementClient 
subscription_id = os.environ['AZURE_SUBSCRIPTION_ID'] 
credentials = ServicePrincipalCredentials(client_id=os.environ['AZURE_CLIENT_ID'], secret=os.environ['AZURE_CLIENT_SECRET'], tenant=os.environ['AZURE_TENANT_ID']) 
compute_client = ComputeManagementClient(credentials, subscription_id) 
for vm in compute_client.virtual_machines.list_all(): 
    print("\tVM: {}".format(vm.name)) 

Activity logから作成された時刻を取得:

import os 
import datetime 
from pprint import pprint 
from azure.monitor import MonitorClient 
from azure.common.credentials import ServicePrincipalCredentials 

today = datetime.datetime.now().date() 
filter = " and ".join([ "eventTimestamp le '{}T00:00:00Z'".format(today), "resourceGroupName eq 'test-group'" ]) 
subscription_id = 'xxxxx' 
credentials = ServicePrincipalCredentials(client_id=os.environ['AZURE_CLIENT_ID'], secret=os.environ['AZURE_CLIENT_SECRET'], tenant=os.environ['AZURE_TENANT_ID']) 
client = MonitorClient(credentials, subscription_id) 
select = ",".join([ "Administrative", "Write VirtualMachines" ]) 
activity_logs = client.activity_logs.list(filter=filter, select=select) 

for i in activity_logs: 
    pprint(i.__dict__) 

私はすべてのVMを取得できます(1 tサンプルプログラム)、しかしActivity logをフェッチしようとしているときにエラーが発生しました(2番目のサンプルプログラム)。

エラー:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Python/2.7/site-packages/msrest/paging.py", line 109, in __next__ 
    self.advance_page() 
    File "/Library/Python/2.7/site-packages/msrest/paging.py", line 95, in advance_page 
    self._response = self._get_next(self.next_link) 
    File "/Library/Python/2.7/site-packages/azure/monitor/operations/activity_logs_operations.py", line 117, in internal_paging 
    raise models.ErrorResponseException(self._deserialize, response) 
azure.monitor.models.error_response.ErrorResponseException: Operation returned an invalid status code 'Bad Request' 

誰かが問題をしてください見つけるために私を助けることができますか?任意のヘルプは本当に感謝します。

+0

私の答え、thanks.Itは私のために働くことを参照してください。 –

答えて

1

は、私はあなたが提供されたコードを使用することにより、今日のリソース・グループの私のアクティブなログを取得しようとしましたが、私はあなたの問題を再現:また、彼らは日時(とない日)を取るようです。

私のコード

import os 
import datetime 
from pprint import pprint 
from azure.monitor import MonitorClient 
from azure.common.credentials import ServicePrincipalCredentials 

subscription_id = '***' 
client_id='***' 
secret='***' 
tenant='***' 

today = datetime.datetime.now().date() 
filter = " and ".join([ "eventTimestamp le '{}T00:00:00Z'".format(today), "resourceGroupName eq 'jay'" ]) 

credentials = ServicePrincipalCredentials(client_id=client_id, secret=secret, tenant=tenant) 

client = MonitorClient(credentials, subscription_id) 
select = ",".join([ "eventName", "operationName" ]) 

print select 
print filter 
activity_logs = client.activity_logs.list(filter=filter, select=select) 

for log in activity_logs: 
    # assert isinstance(log, azure.monitor.models.EventData) 
    print(" ".join([ 
     log.event_name.localized_value, 
     log.operation_name.localized_value 
    ])) 

実行結果は:

eventName,operationName 
eventTimestamp le '2017-10-17T00:00:00Z' and resourceGroupName eq 'jay' 
Traceback (most recent call last): 
    File "E:/PythonWorkSpace/ActiveLog/FetchActiveLog.py", line 24, in <module> 
    for log in activity_logs: 
    File "E:\Python27\lib\site-packages\msrest\paging.py", line 109, in __next__ 
    self.advance_page() 
    File "E:\Python27\lib\site-packages\msrest\paging.py", line 95, in advance_page 
    self._response = self._get_next(self.next_link) 
    File "E:\Python27\lib\site-packages\azure\monitor\operations\activity_logs_operations.py", line 117, in internal_paging 
    raise models.ErrorResponseException(self._deserialize, response) 
azure.monitor.models.error_response.ErrorResponseException: Operation returned an invalid status code 'Bad Request' 

​​をrearchingした後、私は違いを発見しました。ここで

filter = " and ".join([ "eventTimestamp ge '{}T00:00:00Z'".format(today), "resourceGroupName eq 'jay'" ]) 

ge、ないleです。

キーワードを変更してコードがうまく動作します。

eventName,operationName 
eventTimestamp ge '2017-10-17T00:00:00Z' and resourceGroupName eq 'jay' 
End request Microsoft.Compute/virtualMachines/delete 
End request Microsoft.Compute/virtualMachines/delete 
End request Microsoft.Compute/virtualMachines/delete 
Begin request Microsoft.Compute/virtualMachines/delete 
End request Microsoft.Compute/virtualMachines/deallocate/action 
End request Microsoft.Compute/virtualMachines/deallocate/action 
Begin request Microsoft.Compute/virtualMachines/deallocate/action 
End request Microsoft.Compute/virtualMachines/write 
End request Microsoft.Compute/disks/write 
End request Microsoft.Compute/virtualMachines/write 
End request Microsoft.Network/networkSecurityGroups/write 
End request Microsoft.Network/networkInterfaces/write 
End request Microsoft.Network/publicIPAddresses/write 

希望します。

0

ドキュメントに基づいて、あなたの日付をエスケープする必要があるようです。 https://docs.microsoft.com/en-us/rest/api/monitor/activitylogs

filter = " and ".join([ 
     "eventTimestamp le '{}T00:00:00Z'".format(today), 
     "resourceGroupName eq 'test-group'" 
]) 
+0

提案したコードを更新しましたが、問題は依然として続きます。私はactivity_logのすべての属性をリストアップしようとしました。運がない。 – user6136315

関連する問題