ansible-for-nsxt
ansible-for-nsxt copied to clipboard
nsxt_edge_clusters module throws "Existing [xxx] new [yyy]" error if cluster members are in unexpected order
Hi Guys,
I've found what I believe to be a bug in the nsxt_edge_clusters
module when making subsequent playbook reruns depending on the order of the edge cluster members. Let me articulate this:
Here is my task:
- name: Add edge cluster
nsxt_edge_clusters:
hostname: "{{ nsx_manager }}"
username: "{{ nsx_username }}"
password: "{{ nsx_password }}"
validate_certs: "{{ validate_certs }}"
display_name: "{{ item.display_name }}"
cluster_profile_bindings: "{{ item.cluster_profile_bindings }}"
members: "{{ item.members }}"
state: "{{ state }}"
with_items:
- "{{ edge_clusters }}"
Here is the definition of the edge clusters (following the same format as the examples provided in the repo):
"edge_clusters": [
{
"display_name": "a-edgecluster-01",
"cluster_profile_bindings": [
{ "profile_name": "nsx-default-edge-high-availability-profile" }
],
"members": [
{ "transport_node_name": "a-nsxedge-01" },
{ "transport_node_name": "a-nsxedge-02" }
]
},
{
"display_name": "a-edgecluster-02",
"cluster_profile_bindings": [
{ "profile_name": "nsx-default-edge-high-availability-profile" }
],
"members": [
{ "transport_node_name": "a-nsxedge-03" },
{ "transport_node_name": "a-nsxedge-04" }
]
},
{
"display_name": "a-edgecluster-03",
"cluster_profile_bindings": [
{ "profile_name": "nsx-default-edge-high-availability-profile" }
],
"members": [
{ "transport_node_name": "a-nsxedge-05" },
{ "transport_node_name": "a-nsxedge-06" }
]
},
{
"display_name": "a-edgecluster-04",
"cluster_profile_bindings": [
{ "profile_name": "nsx-default-edge-high-availability-profile" }
],
"members": [
{ "transport_node_name": "a-nsxedge-07" },
{ "transport_node_name": "a-nsxedge-08" }
]
}
]
On first run, it will create the edge clusters successfully:
TASK [Add edge cluster] ***************************************************************************************************************************************
changed: [127.0.0.1] => (item={'display_name': 'a-edgecluster-01', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-01'}, {'transport_node_name': 'a-nsxedge-02'}]})
changed: [127.0.0.1] => (item={'display_name': 'a-edgecluster-02', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-03'}, {'transport_node_name': 'a-nsxedge-04'}]})
changed: [127.0.0.1] => (item={'display_name': 'a-edgecluster-03', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-05'}, {'transport_node_name': 'a-nsxedge-06'}]})
changed: [127.0.0.1] => (item={'display_name': 'a-edgecluster-04', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-07'}, {'transport_node_name': 'a-nsxedge-08'}]})
Subsequent runs were throwing errors for edge clusters 02, 03, 04:
TASK [Add edge cluster] ***************************************************************************************************************************************
ok: [127.0.0.1] => (item={'display_name': 'a-edgecluster-01', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-01'}, {'transport_node_name': 'a-nsxedge-02'}]})
failed: [127.0.0.1] (item={'display_name': 'a-edgecluster-02', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-03'}, {'transport_node_name': 'a-nsxedge-04'}]}) => {"ansible_loop_var": "item", "changed": false, "item": {"cluster_profile_bindings": [{"profile_name": "nsx-default-edge-high-availability-profile"}], "display_name": "a-edgecluster-02", "members": [{"transport_node_name": "a-nsxedge-03"}, {"transport_node_name": "a-nsxedge-04"}]}, "msg": "Existing [9e03fbcf-c346-4c54-a955-56fc853f27dd] new [a008b51c-a2de-40a1-a130-0a0f89c636a7]"}
failed: [127.0.0.1] (item={'display_name': 'a-edgecluster-03', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-05'}, {'transport_node_name': 'a-nsxedge-06'}]}) => {"ansible_loop_var": "item", "changed": false, "item": {"cluster_profile_bindings": [{"profile_name": "nsx-default-edge-high-availability-profile"}], "display_name": "a-edgecluster-03", "members": [{"transport_node_name": "a-nsxedge-05"}, {"transport_node_name": "a-nsxedge-06"}]}, "msg": "Existing [cd694163-c586-4ec9-801c-47abd9aa71b3] new [b6b8a15c-a784-4b1c-8d24-8e3578f6f53d]"}
failed: [127.0.0.1] (item={'display_name': 'a-edgecluster-04', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-07'}, {'transport_node_name': 'a-nsxedge-08'}]}) => {"ansible_loop_var": "item", "changed": false, "item": {"cluster_profile_bindings": [{"profile_name": "nsx-default-edge-high-availability-profile"}], "display_name": "a-edgecluster-04", "members": [{"transport_node_name": "a-nsxedge-07"}, {"transport_node_name": "a-nsxedge-08"}]}, "msg": "Existing [b7de735d-bec5-423e-92be-2503bee62e5a] new [cc3161b1-38d4-41a2-b055-b77c1669198e]"}
I tried rearranging the edge cluster member definition in JSON (using a-edgecluster-02
as an example):
...
{
"display_name": "a-edgecluster-03",
"cluster_profile_bindings": [
{ "profile_name": "nsx-default-edge-high-availability-profile" }
],
"members": [
{ "transport_node_name": "a-nsxedge-04" },
{ "transport_node_name": "a-nsxedge-03" }
]
},
...
This immediately fixed a-edgecluster-02
, indicating that there is a bug whereby the next_edge_cluster
module needs to have the edge cluster members listed in a particular order otherwise it throws the error defined at nsxt_edge_clusters.py:197
.
Can someone please confirm that they are seeing the same behaviour?
To summarise:
edge cluster definition used to create edge clusters:
"edge_clusters": [
{
"display_name": "a-edgecluster-01",
"cluster_profile_bindings": [
{ "profile_name": "nsx-default-edge-high-availability-profile" }
],
"members": [
{ "transport_node_name": "a-nsxedge-01" },
{ "transport_node_name": "a-nsxedge-02" }
]
},
{
"display_name": "a-edgecluster-02",
"cluster_profile_bindings": [
{ "profile_name": "nsx-default-edge-high-availability-profile" }
],
"members": [
{ "transport_node_name": "a-nsxedge-03" },
{ "transport_node_name": "a-nsxedge-04" }
]
},
{
"display_name": "a-edgecluster-03",
"cluster_profile_bindings": [
{ "profile_name": "nsx-default-edge-high-availability-profile" }
],
"members": [
{ "transport_node_name": "a-nsxedge-05" },
{ "transport_node_name": "a-nsxedge-06" }
]
},
{
"display_name": "a-edgecluster-04",
"cluster_profile_bindings": [
{ "profile_name": "nsx-default-edge-high-availability-profile" }
],
"members": [
{ "transport_node_name": "a-nsxedge-07" },
{ "transport_node_name": "a-nsxedge-08" }
]
}
]
- Subsequent runs threw the above errors
Modified edge cluster definitions used to avoid error in subsequent runs (observe the re-ordering of edge cluster members:
"edge_clusters": [
{
"display_name": "a-edgecluster-01",
"cluster_profile_bindings": [
{ "profile_name": "nsx-default-edge-high-availability-profile" }
],
"members": [
{ "transport_node_name": "a-nsxedge-01" },
{ "transport_node_name": "a-nsxedge-02" }
]
},
{
"display_name": "a-edgecluster-02",
"cluster_profile_bindings": [
{ "profile_name": "nsx-default-edge-high-availability-profile" }
],
"members": [
{ "transport_node_name": "a-nsxedge-04" },
{ "transport_node_name": "a-nsxedge-03" }
]
},
{
"display_name": "a-edgecluster-03",
"cluster_profile_bindings": [
{ "profile_name": "nsx-default-edge-high-availability-profile" }
],
"members": [
{ "transport_node_name": "a-nsxedge-06" },
{ "transport_node_name": "a-nsxedge-05" }
]
},
{
"display_name": "a-edgecluster-04",
"cluster_profile_bindings": [
{ "profile_name": "nsx-default-edge-high-availability-profile" }
],
"members": [
{ "transport_node_name": "a-nsxedge-08" },
{ "transport_node_name": "a-nsxedge-07" }
]
}
]
This is the expected output (regardless of order) that was seen only when the reordering of members was done:
TASK [Add edge cluster] ***************************************************************************************************************************************
ok: [127.0.0.1] => (item={'display_name': 'a-edgecluster-01', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-01'}, {'transport_node_name': 'a-nsxedge-02'}]})
ok: [127.0.0.1] => (item={'display_name': 'a-edgecluster-02', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-04'}, {'transport_node_name': 'a-nsxedge-03'}]})
ok: [127.0.0.1] => (item={'display_name': 'a-edgecluster-03', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-06'}, {'transport_node_name': 'a-nsxedge-05'}]})
ok: [127.0.0.1] => (item={'display_name': 'a-edgecluster-04', 'cluster_profile_bindings': [{'profile_name': 'nsx-default-edge-high-availability-profile'}], 'members': [{'transport_node_name': 'a-nsxedge-08'}, {'transport_node_name': 'a-nsxedge-07'}]})
I believe the relevant code was merged in #340
Looping in @madhukark and @kaushiklele for visibility as they submitted/reviewed the PR.
up
Hi - When is this going to be addressed? I've raised a SR with VMware to get a fix on this as its breaking our NSX code.