diff --git a/lib/ansible/modules/cloud/azure/azure_rm_virtualmachine.py b/lib/ansible/modules/cloud/azure/azure_rm_virtualmachine.py index a073d4958c6..dd082cbd075 100644 --- a/lib/ansible/modules/cloud/azure/azure_rm_virtualmachine.py +++ b/lib/ansible/modules/cloud/azure/azure_rm_virtualmachine.py @@ -819,7 +819,8 @@ class AzureRMVirtualMachine(AzureRMModuleBase): if set(current_nics) != set(network_interfaces): self.log('CHANGED: virtual machine {0} - network interfaces are different.'.format(self.name)) differences.append('Network Interfaces') - updated_nics = [dict(id=id) for id in network_interfaces] + updated_nics = [dict(id=id, primary=(i is 0)) + for i, id in enumerate(network_interfaces)] vm_dict['properties']['networkProfile']['networkInterfaces'] = updated_nics changed = True @@ -928,7 +929,8 @@ class AzureRMVirtualMachine(AzureRMModuleBase): if not self.short_hostname: self.short_hostname = self.name - nics = [self.compute_models.NetworkInterfaceReference(id=id) for id in network_interfaces] + nics = [self.compute_models.NetworkInterfaceReference(id=id, primary=(i is 0)) + for i, id in enumerate(network_interfaces)] # os disk if self.managed_disk_type: @@ -1057,9 +1059,8 @@ class AzureRMVirtualMachine(AzureRMModuleBase): self.log("Update virtual machine {0}".format(self.name)) self.results['actions'].append('Updated VM {0}'.format(self.name)) - - nics = [self.compute_models.NetworkInterfaceReference(id=interface['id']) - for interface in vm_dict['properties']['networkProfile']['networkInterfaces']] + nics = [self.compute_models.NetworkInterfaceReference(id=interface['id'], primary=(i is 0)) + for i, interface in enumerate(vm_dict['properties']['networkProfile']['networkInterfaces'])] # os disk if not vm_dict['properties']['storageProfile']['osDisk'].get('managedDisk'): diff --git a/test/integration/targets/azure_rm_virtualmachine/tasks/virtualmachine.yml b/test/integration/targets/azure_rm_virtualmachine/tasks/virtualmachine.yml index 775909cc379..c2505331743 100644 --- a/test/integration/targets/azure_rm_virtualmachine/tasks/virtualmachine.yml +++ b/test/integration/targets/azure_rm_virtualmachine/tasks/virtualmachine.yml @@ -1,9 +1,14 @@ -- name: Delete virtual machine +- name: Delete virtual machines azure_rm_virtualmachine: resource_group: "{{ resource_group }}" - name: testvm002 + name: "{{ vms }}" state: absent vm_size: Standard_A0 + loop: + - testvm002 + - testvm003 + loop_control: + loop_var: vms register: output - name: Create storage account name @@ -59,7 +64,7 @@ priority: 110 direction: Inbound -- name: Create NIC +- name: Create NIC for single nic VM azure_rm_networkinterface: resource_group: "{{ resource_group }}" name: testvm001 @@ -68,7 +73,7 @@ public_ip_name: testvm001 security_group: testvm001 -- name: Create virtual machine +- name: Create virtual machine with a single NIC register: output azure_rm_virtualmachine: resource_group: "{{ resource_group }}" @@ -173,7 +178,7 @@ - "azure_vm.powerstate in ['starting', 'running']" - output.changed -- name: Should be idempotent +- name: Should be idempotent with a single NIC azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: testvm002 @@ -251,6 +256,82 @@ state: absent vm_size: Standard_A0 +- name: Create NICs for dual nic VM + azure_rm_networkinterface: + resource_group: "{{ resource_group }}" + name: "{{ item }}" + virtual_network: testvm001 + subnet: testvm001 + security_group: testvm001 + loop: + - testvm011 + - testvm012 + +- name: Create virtual machine with two NICs + register: output + vars: + niclist: + - testvm011 + - testvm012 + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: testvm003 + vm_size: Standard_A0 + storage_account: "{{ storage_account }}" + storage_container: testvm001 + storage_blob: testvm003.vhd + admin_username: adminuser + admin_password: Password123! + short_hostname: testvm + os_type: Linux + network_interfaces: "{{ niclist }}" + availability_set: "avbs{{ resource_group | hash('md5') | truncate(7, True, '') }}" + image: + offer: UbuntuServer + publisher: Canonical + sku: 16.04-LTS + version: latest + +- assert: + that: + - azure_vm.properties.availabilitySet.id + +- name: Should be idempotent with a dual NICs + vars: + niclist: + - testvm011 + - testvm012 + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: testvm003 + vm_size: Standard_A0 + storage_account: "{{ storage_account }}" + storage_container: testvm001 + storage_blob: testvm003.vhd + admin_username: adminuser + admin_password: Password123! + short_hostname: testvm + os_type: Linux + network_interfaces: "{{ niclist }}" + availability_set: "avbs{{ resource_group | hash('md5') | truncate(7, True, '') }}" + image: + offer: UbuntuServer + publisher: Canonical + sku: 16.04-LTS + version: latest + register: output + +- assert: + that: not output.changed + +- name: Delete dual NIC VM + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: testvm003 + state: absent + vm_size: Standard_A0 + register: output + # TODO: Until we have a module to create/delete images this is the best tests # I can do - name: assert error thrown with invalid image dict