我在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修改该池。
答案 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;。
一般订单是loadBalancerBackendAddressPools
空通过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