|
|
@ -428,6 +428,36 @@ def build_deployment_body(module):
|
|
|
|
|
|
|
|
|
|
|
|
return dict(properties=properties)
|
|
|
|
return dict(properties=properties)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_failed_nested_operations(client, resource_group, current_operations):
|
|
|
|
|
|
|
|
new_operations = []
|
|
|
|
|
|
|
|
for operation in current_operations:
|
|
|
|
|
|
|
|
if operation.properties.provisioning_state == 'Failed':
|
|
|
|
|
|
|
|
new_operations.append(operation)
|
|
|
|
|
|
|
|
if operation.properties.target_resource and 'Microsoft.Resources/deployments' in operation.properties.target_resource.id:
|
|
|
|
|
|
|
|
nested_deployment = operation.properties.target_resource.resource_name
|
|
|
|
|
|
|
|
nested_operations = client.deployment_operations.list(resource_group, nested_deployment)
|
|
|
|
|
|
|
|
new_nested_operations = get_failed_nested_operations(client, resource_group, nested_operations)
|
|
|
|
|
|
|
|
new_operations += new_nested_operations
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return new_operations
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_failed_deployment_operations(module, client, resource_group, deployment_name):
|
|
|
|
|
|
|
|
operations = client.deployment_operations.list(resource_group, deployment_name)
|
|
|
|
|
|
|
|
return [
|
|
|
|
|
|
|
|
dict(
|
|
|
|
|
|
|
|
id=op.id,
|
|
|
|
|
|
|
|
operation_id=op.operation_id,
|
|
|
|
|
|
|
|
status_code=op.properties.status_code,
|
|
|
|
|
|
|
|
status_message=op.properties.status_message,
|
|
|
|
|
|
|
|
target_resource = dict(
|
|
|
|
|
|
|
|
id=op.properties.target_resource.id,
|
|
|
|
|
|
|
|
resource_name=op.properties.target_resource.resource_name,
|
|
|
|
|
|
|
|
resource_type=op.properties.target_resource.resource_type
|
|
|
|
|
|
|
|
) if op.properties.target_resource else None,
|
|
|
|
|
|
|
|
provisioning_state=op.properties.provisioning_state,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
for op in get_failed_nested_operations(client, resource_group, operations)
|
|
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
def deploy_template(module, client, conn_info):
|
|
|
|
def deploy_template(module, client, conn_info):
|
|
|
|
"""
|
|
|
|
"""
|
|
|
@ -464,11 +494,20 @@ def deploy_template(module, client, conn_info):
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|
client.resource_groups.create_or_update(group_name, params)
|
|
|
|
client.resource_groups.create_or_update(group_name, params)
|
|
|
|
result = client.deployments.create_or_update(group_name, deployment_name, deploy_parameter)
|
|
|
|
result = client.deployments.create_or_update(group_name, deployment_name, deploy_parameter)
|
|
|
|
return result.result() # Blocking wait, return the Deployment object
|
|
|
|
deployment_result = result.result() # Blocking wait, return the Deployment object
|
|
|
|
|
|
|
|
if module.params.get('wait_for_deployment_completion'):
|
|
|
|
|
|
|
|
while not deployment_result.properties.provisioning_state in {'Canceled', 'Failed', 'Deleted', 'Succeeded'}:
|
|
|
|
|
|
|
|
deployment_result = client.deployments.get(group_name, deployment_name)
|
|
|
|
|
|
|
|
time.sleep(module.params.get('wait_for_deployment_polling_period'))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if deployment_result.properties.provisioning_state == 'Succeeded':
|
|
|
|
|
|
|
|
return deployment_result
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
failed_deployment_operations = get_failed_deployment_operations(module, client, group_name, deployment_name)
|
|
|
|
|
|
|
|
module.fail_json(msg='Deployment failed. Deployment id: %s' % (deployment_result.id), failed_deployment_operations=failed_deployment_operations)
|
|
|
|
except CloudError as e:
|
|
|
|
except CloudError as e:
|
|
|
|
module.fail_json(msg='Deploy create failed with status code: %s and message: "%s"' % (e.status_code, e.message))
|
|
|
|
module.fail_json(msg='Deploy create failed with status code: %s and message: "%s"' % (e.status_code, e.message))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def destroy_resource_group(module, client, conn_info):
|
|
|
|
def destroy_resource_group(module, client, conn_info):
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
Destroy the targeted resource group
|
|
|
|
Destroy the targeted resource group
|
|
|
@ -516,14 +555,18 @@ def build_hierarchy(dependencies, tree=None):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_ip_dict(ip):
|
|
|
|
def get_ip_dict(ip):
|
|
|
|
return dict(name=ip.name,
|
|
|
|
ip_dict = dict(name=ip.name,
|
|
|
|
id=ip.id,
|
|
|
|
id=ip.id,
|
|
|
|
public_ip=ip.ip_address,
|
|
|
|
public_ip=ip.ip_address,
|
|
|
|
public_ip_allocation_method=str(ip.public_ip_allocation_method),
|
|
|
|
public_ip_allocation_method=str(ip.public_ip_allocation_method))
|
|
|
|
dns_settings={
|
|
|
|
|
|
|
|
|
|
|
|
if ip.dns_settings:
|
|
|
|
|
|
|
|
ip_dict['dns_settings'] = {
|
|
|
|
'domain_name_label':ip.dns_settings.domain_name_label,
|
|
|
|
'domain_name_label':ip.dns_settings.domain_name_label,
|
|
|
|
'fqdn':ip.dns_settings.fqdn
|
|
|
|
'fqdn':ip.dns_settings.fqdn
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return ip_dict
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def nic_to_public_ips_instance(client, group, nics):
|
|
|
|
def nic_to_public_ips_instance(client, group, nics):
|
|
|
@ -547,7 +590,7 @@ def main():
|
|
|
|
from ansible.module_utils.basic import AnsibleModule
|
|
|
|
from ansible.module_utils.basic import AnsibleModule
|
|
|
|
argument_spec = dict(
|
|
|
|
argument_spec = dict(
|
|
|
|
azure_url=dict(default=AZURE_URL),
|
|
|
|
azure_url=dict(default=AZURE_URL),
|
|
|
|
subscription_id=dict(required=True),
|
|
|
|
subscription_id=dict(),
|
|
|
|
client_secret=dict(no_log=True),
|
|
|
|
client_secret=dict(no_log=True),
|
|
|
|
client_id=dict(),
|
|
|
|
client_id=dict(),
|
|
|
|
tenant_or_domain=dict(),
|
|
|
|
tenant_or_domain=dict(),
|
|
|
@ -560,7 +603,9 @@ def main():
|
|
|
|
parameters_link=dict(default=None),
|
|
|
|
parameters_link=dict(default=None),
|
|
|
|
location=dict(default="West US"),
|
|
|
|
location=dict(default="West US"),
|
|
|
|
deployment_mode=dict(default='Complete', choices=['Complete', 'Incremental']),
|
|
|
|
deployment_mode=dict(default='Complete', choices=['Complete', 'Incremental']),
|
|
|
|
deployment_name=dict(default="ansible-arm")
|
|
|
|
deployment_name=dict(default="ansible-arm"),
|
|
|
|
|
|
|
|
wait_for_deployment_completion=dict(default=True),
|
|
|
|
|
|
|
|
wait_for_deployment_polling_period=dict(default=30)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
module = AnsibleModule(
|
|
|
|
module = AnsibleModule(
|
|
|
@ -591,7 +636,7 @@ def main():
|
|
|
|
'access_token':conn_info['security_token']
|
|
|
|
'access_token':conn_info['security_token']
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
)
|
|
|
|
subscription_id = module.params.get('subscription_id')
|
|
|
|
subscription_id = conn_info['subscription_id']
|
|
|
|
resource_client = ResourceManagementClient(ResourceManagementClientConfiguration(credentials, subscription_id))
|
|
|
|
resource_client = ResourceManagementClient(ResourceManagementClientConfiguration(credentials, subscription_id))
|
|
|
|
network_client = NetworkManagementClient(NetworkManagementClientConfiguration(credentials, subscription_id))
|
|
|
|
network_client = NetworkManagementClient(NetworkManagementClientConfiguration(credentials, subscription_id))
|
|
|
|
conn_info['deployment_name'] = module.params.get('deployment_name')
|
|
|
|
conn_info['deployment_name'] = module.params.get('deployment_name')
|
|
|
@ -612,3 +657,4 @@ def main():
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main()
|
|
|
|
main()
|
|
|
|
|
|
|
|
|
|
|
|