无法弄清楚如何使用Python SDK修改Azure Loadbalancer BackEndPool

时间:2015-09-06 17:41:03

标签: python azure azure-resource-manager

我在Azure(ARM)中配置了负载均衡器,我有2个后端池:prod,stage。通过GUI,当我想将登台服务器升级为生产时,我将其从阶段池中删除并将其放在prod池中。我很困惑这一切是如何工作的,因为当我配置堆栈时,我首先配置负载均衡器,当我配置VM将附加到的NIC时,我将该NIC放在我想要的后端池中。但是,当我想将VM移动到另一个池时,我不再在NIC级别执行此操作。我必须在负载均衡器上这样做。

使用Python SDK,如果我查询LB,我可以看到哪个NIC在后端池中,但似乎没有办法修改它。我也可以查询网卡并查看它与之关联的后端池,但是再次无法修改(从我可以告诉的内容)。这就是我到目前为止所做的:

# Create the client
network_client = azure.mgmt.network.NetworkResourceProviderClient(creds)

# Get all LBs
lbs = network_client.load_balancers

# select LB in question
lb = lbs.get(group,'cc-lb01')

# get all pools
pools = lb.load_balancer.backend_address_pools

# set variables for pools
prod = pools[0]
stage = pools[1]

print(dir(stage))的输出是:

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_backend_ip_configurations', '_etag', '_id', '_load_balancing_rules', '_name', '_provisioning_state', 'backend_ip_configurations', 'etag', 'id', 'load_balancing_rules', 'name', 'provisioning_state']

所以当我看到“backend_ip_configurations'”时,我以为自己已经做了些什么。在那里查看我的选项(通过输入):

print(stage.backend_ip_configurations)

它返回一个对象数组:

[<azure.mgmt.network.networkresourceprovider.ResourceId object at 0x03C9C090>]

该数组中只有1个项目,因此我将该项目设置为变量:

beip = stage.backend_ip_configurations[0].id

当我看到我的选择是什么时候&#39; beip&#39;,这就是我死路一条的地方。

/subscriptions/xxx-xxx-xxx/resourceGroups/myresourcegroup/providers/Microsoft.Network/networkInterfaces/app-green04-nic/ipConfigurations/ipconfig1

print(dir(beip))的输出是:

['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

我无法弄清楚如何查看后端池中的NIC,并通过GUI修改该池。

2 个答案:

答案 0 :(得分:1)

同样的问题已经由Hugues在github上通过以下链接回答:https://github.com/Azure/azure-sdk-for-python/issues/471

如果其他社区成员有类似的询问,请在此处引用答案:

  

资源引用目前不方便,因为   没有get()允许你使用引用ID获取。那么你   需要解析构成id的资源的名称。

     

在这种情况下,您需要解析资源ID以获取名称   &#39; myresourcegroup&#39;,&#39; app-green04-nic&#39;和&#39; ipconfig1&#39;。用这些,   您将能够访问NIC   network_client.network_interfaces.get(&#39; myresourcegroup,   &#39; app-green04-nic&#39;)。

     

看看LoadBalancerOperations,看起来你应该可以   做一个get(),修改内容   load_balancer.backend_address_pools [0] .backend_ip_configurations by   添加/修改/删除ResourceId对象,然后调用   使用修改后的LoadBalancer对象创建create_or_update()。

     

获取资源ID以创建ResourceId很简单,不需要   自己构建字符串,通常可以调用get()方法   并且Azure将填充并返回您的ID。例如,要获得   NIC配置的资源ID:

result = network_client.network_interfaces.get('myresourcegroup', 'app-green04-nic')
result.network_interface.ip_configurations[0].name
#ipconfig1
result.network_interface.ip_configurations[0].id
#/subscriptions/xxx-xxx-xxx/resourceGroups/myresourcegroup/providers/Microsoft.Network/networkInterfaces/app-green04-nic/ipConfigurations/ipconfig1
     

您无法按名称对这些集合进行索引,因此您需要这样做   迭代找到你要找的那个。

如果您有任何进一步的顾虑,请随时告诉我们。

答案 1 :(得分:1)

看一下这个视频和GitHub repo,演示如何通过REST和Python修改Pool成员资格。

最后,它是关于到达通过更新发送的正确的json

https://mix.office.com/watch/f4cvoa3cnfoe

请注意,以下/src路径具有Python版本

https://github.com/cicorias/AzureLoadbalancedPoolUpdate - [R

方法和订单

您实际上是从NIC方向开始,而不是Load Balancer。更新(PUT)针对&#34; NIC&#34;。

一般订单是
  1. 获取VM及其NIC
  2. 获取NIC与后端池的关系
  3. loadBalancerBackendAddressPools
  4. 删除
  5. 将资源ID放入`loadBalancerBackendAddressPools&#39;阵列
  6. 通过PUT创建REST请求就在这里。

    def build_request(vm_object, nic_object, load_balancer=None):
    """
    :param vm_object : azure.mgmt.compute.VirtualMachine
    :param nic_object : azure.mgmt.network.networkresourceprovider.NetworkInterface
    :param load_balancer : azure.mgmt.network.LoadBalancer
    :return: dict
    """
    if load_balancer == None:
        backend_pool = []
    else:
        backend_pool = [{ 'id' : load_balancer.load_balancer.backend_address_pools[0].id }]
    
    request = {
        'properties': {
            'virtualMachine' : {
                'id' : vm_object.virtual_machine.id
                },
            'ipConfigurations' : [{ #may have to build by hand
                'properties' : {
                    'loadBalancerBackendAddressPools' : backend_pool,
                    'subnet' : {
                        'id' :  nic_object.ip_configurations[0].subnet.id
                        }
                    },
                'name' : nic_object.ip_configurations[0].name,
                'id' : nic_object.ip_configurations[0].id
                 }]
            },
        'id' : nic_object.id,
        'name' : nic_object.name,
        'location' : vm_object.virtual_machine.location,
        'type' : 'Microsoft.Network/networkInterfaces'
        }
    
    
    return request