Azure SDK Python:标记特定资源

Vaibhav帕纳里亚

我想使用python在Azure中的每个资源上创建标签。

我在文档中看到了这个模块:http : //azure-sdk-for-python.readthedocs.io/en/latest/ref/azure.mgmt.resource.resources.operations.html#azure.mgmt.resource.resources。 Operations.TagsOperations

create_or_update:创建订阅资源标签列表:获取订阅资源标签列表

好像我只能对资源组执行标记操作,而不能对资源执行标记操作?

例子:

要将标签添加到资源组:Set-AzureRmResourceGroup将标签添加到资源:Set-AzureRmResource

编辑:

感谢您的api查找代码,非常简洁。但是我相信我手动放置的旧api也应该起作用。我稍加修改就尝试了您的代码(我们可能有不同的Azure SDK,我使用的是2.0.0rc5)。添加api函数后(非常有用),不幸的是我仍然遇到相同的错误。

from azure.common.credentials import UserPassCredentials
from azure.mgmt.resource.resources import ResourceManagementClient

def resolve_resource_api(client, resource):
    """ This method retrieves the latest non-preview api version for
    the given resource (unless the preview version is the only available
    api version) """
    provider = client.providers.get(resource.id.split('/')[6])
    rt = next((t for t in provider.resource_types
               if t.resource_type == '/'.join(resource.type.split('/')[1:])), None)
    #print(rt)
    if rt and 'api_versions' in rt.__dict__:
        #api_version = [v for v in rt[0].api_versions if 'preview' not in v.lower()]
        #return npv[0] if npv else rt[0].api_versions[0]
        api_version = [v for v in rt.__dict__['api_versions'] if 'preview' not in v.lower()]
        return api_version[0] if api_version else rt.__dict__['api_versions'][0]

credentials = UserPassCredentials(
    '****@****.com',    # Your new user
    '******',  # Your password
)

subscription_id= '*****-***-****-****-*******'

resource_client = ResourceManagementClient(credentials,
                                                    subscription_id)

for resource in resource_client.resources.list():
    #print(resource)
    #print(resolve_resource_api(resource_client, resource))
    if resource.id.split('/')[4] == 'Build':
        #resource.tags = {'foo':'bar'}
        if resource.type == 'Microsoft.Web/sites':
            print('resource.id: ', resource.id)
            print('resource_group_name: ', resource.id.split('/')[4])
            print('resource_provider_namespace: ', resource.id.split('/')[6])
            print('parent_resource_path: ', '')
            print('resource_type: ', str(resource.type).split('/')[-1])
            print('resource_name: ', resource.name)
            print('api_version: ', resolve_resource_api(resource_client, resource))
            resource.tags['test'] = 'test1'

            #print(resolve_resource_api(resource_client, resource))
            #continue
            print(resource)
            resource_client.resources.create_or_update(
                resource_group_name= resource.id.split('/')[4], # Extract from resource.id
                resource_provider_namespace=resource.id.split('/')[6], # Extract from resource.id
                parent_resource_path='', # Extract from resource.id
                resource_type=str(resource.type).split('/')[-1], # Extract from resource type
                resource_name=resource.name,
                api_version=resolve_resource_api(resource_client, resource),
                parameters=resource
                )
        print('-'*10)

错误回溯(最近一次呼叫最近):文件“ C:\ Python35-32 \ Scripts \ Azure \ temp.py”,第56行,参数=资源文件“ C:\ Python35-32 \ lib \ site-packages \ azure \ mgmt \ resource \ resources \ operations \ resources_operations.py“,行408,在create_or_update中,引发exp msrestazure.azure_exceptions.CloudError:操作失败,状态:“错误请求”。详细说明:400客户端错误:错误的请求URL:https://management.azure.com/subscriptions/ - - *** - ***** - ******* / resourcegroups /编译/供应商/微软.Web / sites / build-dev?api-version = 2016-03-01

我做了更多工作,发现我可以通过以下方式使用create_or_update方法:

from azure.mgmt.resource.resources.models import GenericResource
parameters=GenericResource(
        location='West US',
        properties={},
    )

代码示例的响应错误消息显示“参数属性具有无效值”。所以我猜参数=资源需要固定。我将对此进行更多研究。

更新(已解决!):

for resource in resource_client.resources.list():
    #print(resource)
    if resource.id.split('/')[4] == 'Build':
        if resource.type == 'Microsoft.Web/sites':
            print('resource.id: ', resource.id)
            print('resource_group_name: ', resource.id.split('/')[4])
            print('resource_provider_namespace: ', resource.id.split('/')[6])
            print('parent_resource_path: ', '')
            print('resource_type: ', str(resource.type).split('/')[-1])
            print('resource_name: ', resource.name)
            print('api_version: ', resolve_resource_api(resource_client, resource))
            if not resource.tags:
                resource.tags = {}
                resource.tags['test'] = 'test1'
            else:
                resource.tags['test'] = 'test1'

            # This solves the error 400 Client Error: Bad Request. The parameter properties has an invalid value. 
            if not resource.properties:
                resource.properties = {}

            resource_client.resources.create_or_update(
                resource_group_name= resource.id.split('/')[4], # Extract from resource.id
                resource_provider_namespace=resource.id.split('/')[6], # Extract from resource.id
                parent_resource_path='', # Extract from resource.id
                resource_type=str(resource.type).split('/')[-1], # Extract from resource type
                resource_name=resource.name,
                api_version=resolve_resource_api(resource_client, resource),
                parameters=resource,
                )
        print('-'*10)

出于某种奇怪的原因,如果resource.properties为None,则请求不喜欢它。它一定要是 {}。

谢谢您对Travis的帮助!在使用Azure SDK时,我将发布更多问题;)

特拉维斯·普雷斯科特(Travis Prescott)

如果您使用的是Python SDK,通常可以使用该资源的create_or_update方法将标签添加到该资源这些方法采用一个称为的对象parameters,该对象通常是您感兴趣的资源的对象类型。在这里可以找到标签。

例如,标记虚拟网络:

from azure.mgmt.network.models import VirtualNetwork

vnet = client.virtual_networks.get(resource_group_name, vnet_name)
vnet.tags = {'a':'b'}
client.virtual_networks.create_or_update(resource_group_name, virtual_network_name, vnet)

另外,您可以使用Xplat-Cli使用azure network vnet set -t {tags}命令标记资源(在本示例中)

您可以使用标记资源组,azure group set -t {tags}而通常使用标记资源azure resource set -t {tags}

希望有帮助。

更新(8/26/16)

获取API版本可能很棘手。您可能会认为它只是通用资源对象的一部分,但由于某种原因,它不是。但是,尝试这样的事情:

from azure.common.credentials import UserPassCredentials
from azure.mgmt.resource.resources import ResourceManagementClient

def resolve_resource_api(client, resource):
    """ This method retrieves the latest non-preview api version for
    the given resource (unless the preview version is the only available
    api version) """
    provider = client.providers.get(resource.id.split('/')[6])
    rt = next((t for t in provider.resource_types if t.resource_type == resource.type), None)
    if rt and len(rt) == 1 and rt[0].api_versions:
        api_version = [v for v in rt[0].api_versions if 'preview' not in v.lower()]
        return npv[0] if npv else rt[0].api_versions[0]

credentials = UserPassCredentials(
    '****@****.com',    # Your new user
    '******',  # Your password
)

subscription_id= '*****-***-****-****-*******'

resource_client = ResourceManagementClient(credentials, subscription_id)

for resource in resource_client.resources.list():
    resource.tags['test'] = 'test1'

    # avoid error 400 if properties must be set
    if not resource.properties:
        resource.properties = {}

    resource_client.resources.create_or_update(
        resource_group_name= resource.id.split('/')[4],
        resource_provider_namespace=resource.id.split('/')[6],
        parent_resource_path='', # WARNING: this will not work with child resources
        resource_type=str(resource.type).split('/')[-1],
        resource_name=resource.name,
        api_version=resolve_resource_api(resource_client, resource),
        parameters=resource
    )

client.resources下的list操作给出了整个订阅的GenericResource对象的分页列表。发布的方式是一个接一个地遍历资源组,然后遍历每个资源组中的资源。这样就可以很好地工作,并且可以避免您不得不从ID中提取资源组名称,但是我认为这种解决方案更干净一些。

resolve_resource_api方法使用提供程序名称空间和资源ID中的资源类型,通过资源提供程序get操作查找该资源类型的可用API版本。此代码(缺少某些验证)将检索不是预览版本的最新API版本(除非这是唯一可用的版本)。通常,仅在字符串中随意指定一个版本将无法正常工作,因为不同的资源将具有不同的API版本。

另外,您的代码为父路径指定了“”,因此这通常不适用于子资源。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从资源对象Azure SDK Python获取资源组名称

来自分类Dev

Python Azure SDK上载Blob

来自分类Dev

Python Azure IoTHub SDK 文档

来自分类Dev

Azure Python SDK-与Azure AD交互

来自分类Dev

使用SDK的Azure资源组设置标签?

来自分类Dev

使用Azure的Java SDK标记所有相关资源来创建VM

来自分类Dev

如何使用Azure Python SDK或Azure Cli管理Azure备份

来自分类Dev

从 .csv 标记 Azure 资源

来自分类Dev

无法在Python中使用Azure SDK

来自分类Dev

无法在Python中使用Azure SDK

来自分类Dev

Python Azure SDK - 无法下载 zip 文件

来自分类Dev

从 azure python sdk JWK 生成 jwcrypto JWK

来自分类Dev

如何使用Azure Python SDK编辑Azure App Service?

来自分类Dev

MS Azure资源提供程序SDK-身份验证

来自分类Dev

如何使用 dotnet SDK 删除 Azure 中的单个资源?

来自分类Dev

Azure Python SDK-获取计算机状态

来自分类Dev

如何使用Python SDK在Azure上创建SQL Server?

来自分类Dev

如何使用azure-sdk-for-python删除磁盘?

来自分类Dev

使用Python SDK将视频上传到Azure媒体服务

来自分类Dev

从python SDK获取Azure VM的备份详细信息

来自分类Dev

如何通过Python SDK创建Azure网络安全组

来自分类Dev

python azure sdk-列出存储帐户SKU

来自分类Dev

Azure Python SDK - 带 cloud-init 的 Spinup VM

来自分类Dev

AKS 群集外部 IP - 适用于 Python 的 Azure SDK

来自分类Dev

无法使用适用于Python的Azure SDK设置Azure Blob的属性

来自分类Dev

标记Azure Databricks的托管资源组

来自分类Dev

是否存在用于Azure资源管理API调用的C#SDK /包装器?

来自分类Dev

如何使用Azure Mgmt SDK流利的获取空资源组的列表

来自分类Dev

在资源管理器模式下通过Java SDK进行Azure身份验证

Related 相关文章

热门标签

归档