Azure SDK Python: tag a particular resource

本秂侑毒 提交于 2019-12-02 09:39:59

If you are using the Python SDK, you can generally add tags to a resource using that resource's create_or_update method. These methods take an object called parameters which is generally the object type of the resource you are interested in. This is where you will find tags.

For example to tag a virtual network:

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)

Additionally, you can tag your resource through Xplat-Cli using (for this example) the azure network vnet set -t {tags} command.

You can tag resource groups using azure group set -t {tags} and resources generically using azure resource set -t {tags}.

Hopefully that helps.

UPDATE (8/26/16)

Getting API versions can be tricky. You would think it would just be part of the generic resource object, but for some reason it's not. However, try something like this:

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
    )

The list operation under client.resources gives a paged list of GenericResource objects for the entire subscription. The way you posted, you looped through the resource groups one by one and then through the resources within each resource group. That will work just fine, and it will avoid you having to extract the resource group name from the ID, but I think this solution is a little cleaner.

The resolve_resource_api method uses the provider namespace and the resource type from the resource ID to look up the available API versions for that resource type using the resource provider get operation. This code (which is missing some validation) will retrieve the most recent API versions that is not a preview version (unless that is the only version available). Just arbitrarily specifying a version in a string is not going to work generally, as the different resources will have different API versions.

Also, your code specifies '' for parent path, so this would not work generally for a child resource.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!