- name: Create virtual machine with a single NIC and no boot diagnostics register: output azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: "{{ vm_name1 }}" vm_size: Standard_A0 storage_account: "{{ storage_account }}" storage_container: "{{ vm_name1 }}" storage_blob: "{{ vm_name1 }}.vhd" admin_username: adminuser admin_password: Password123! short_hostname: testvm os_type: Linux network_interfaces: "{{ vm_name1 }}" availability_set: "{{ abs_name1 }}" image: offer: UbuntuServer publisher: Canonical sku: 16.04-LTS version: latest custom_data: | #!/bin/sh echo "custom_data was executed" > /tmp/custom_data.txt - assert: that: - azure_vm.properties.provisioningState == 'Succeeded' - azure_vm.properties.availabilitySet.id # initial response from creation has no diagnosticsProfile # if you run it again however, there is one in the response # so we handle both cases - "'diagnosticsProfile' not in azure_vm.properties or not azure_vm.properties.diagnosticsProfile.bootDiagnostics.enabled" - name: Get facts for virtual machine without boot diagnostics disabled azure_rm_virtualmachine_facts: resource_group: "{{ resource_group }}" name: "{{ vm_name1 }}" register: output - assert: that: - output.vms != [] - not output.vms[0].boot_diagnostics.enabled - not output.vms[0].boot_diagnostics.storage_uri - name: Enable boot diagnostics on an existing VM for the first time without specifying a storage account azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: "{{ vm_name1 }}" boot_diagnostics: enabled: true # without specifying storage_account you get a new default storage account for the VM register: output - assert: that: - azure_vm.properties.diagnosticsProfile.bootDiagnostics.enabled - azure_vm.properties.diagnosticsProfile.bootDiagnostics.storageUri is defined - azure_vm.properties.instanceView.bootDiagnostics.consoleScreenshotBlobUri is defined - azure_vm.properties.instanceView.bootDiagnostics.serialConsoleLogBlobUri is defined - name: Get facts for virtual machine with boot diagnostics enabled azure_rm_virtualmachine_facts: resource_group: "{{ resource_group }}" name: "{{ vm_name1 }}" register: output - assert: that: - output.vms != [] - output.vms[0].boot_diagnostics.enabled - output.vms[0].boot_diagnostics.storage_uri is defined - output.vms[0].boot_diagnostics.console_screenshot_uri is defined - output.vms[0].boot_diagnostics.serial_console_log_uri is defined - name: Change the boot diagnostics storage account while enabled azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: "{{ vm_name1 }}" boot_diagnostics: enabled: true storage_account: "{{ storage_account2 }}" ignore_errors: true register: output - name: Disable boot diagnostics and change the storage account at the same time azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: "{{ vm_name1 }}" boot_diagnostics: enabled: false storage_account: "{{ storage_account }}" register: output - assert: that: - not azure_vm.properties.diagnosticsProfile.bootDiagnostics.enabled - name: Re-enable boot diagnostics on an existing VM where it was previously configured azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: "{{ vm_name1 }}" boot_diagnostics: enabled: true register: output - assert: that: - azure_vm.properties.diagnosticsProfile.bootDiagnostics.enabled - azure_vm.properties.diagnosticsProfile.bootDiagnostics.storageUri is defined - azure_vm.properties.instanceView.bootDiagnostics.consoleScreenshotBlobUri is defined - azure_vm.properties.instanceView.bootDiagnostics.serialConsoleLogBlobUri is defined # - add_host: # name: new_azure_vm # ansible_host: '{{ output.ansible_facts.azure_vm.properties.networkProfile.networkInterfaces[0].properties.ipConfigurations[0].properties.publicIPAddress.properties.ipAddress }}' # ansible_connection: paramiko # not guaranteed to have sshpass... # ansible_user: adminuser # ansible_password: Password123! # ansible_host_key_checking: false # - name: wait for SSH port to be open # wait_for: # host: '{{ hostvars["new_azure_vm"].ansible_host }}' # port: 22 # timeout: 60 # state: started #- block: # TODO: figure out how to make this work under ansible-test with the coverage injector # - name: wait for host to answer on SSH # delegate_to: new_azure_vm # wait_for_connection: # - name: get content from custom_data script # raw: cat /tmp/custom_data.txt # register: custom_data_content # - name: assert contents # assert: # that: custom_data_content.stdout | regex_search('custom_data was executed') # delegate_to: new_azure_vm # TODO: figure out how to make this work under ansible-test with the coverage injector # - name: wait for file/content created by custom_data script # delegate_to: new_azure_vm # vars: # ansible_python_interpreter: python # wait_for: # path: /tmp/custom_data.txt # search_regex: ^custom_data was executed$ # timeout: 20 - name: Restart the virtual machine azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: "{{ vm_name1 }}" restarted: yes vm_size: Standard_A0 register: output - assert: that: - "azure_vm.powerstate in ['starting', 'running']" - output.changed - name: Deallocate the virtual machine azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: "{{ vm_name1 }}" allocated: no vm_size: Standard_A0 register: output - assert: that: - azure_vm.powerstate == 'deallocated' - output.changed - name: Start the virtual machine azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: "{{ vm_name1 }}" vm_size: Standard_A0 register: output - assert: that: - "azure_vm.powerstate in ['starting', 'running']" - output.changed - name: Should be idempotent with a single NIC azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: "{{ vm_name1 }}" vm_size: Standard_A0 storage_account: "{{ storage_account }}" storage_container: "{{ vm_name1 }}" storage_blob: "{{ vm_name1 }}.vhd" admin_username: adminuser admin_password: Password123! short_hostname: testvm os_type: Linux network_interfaces: "{{ vm_name1 }}" image: offer: UbuntuServer publisher: Canonical sku: 16.04-LTS version: latest register: output - assert: that: not output.changed - name: Resize VM azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: "{{ vm_name1 }}" vm_size: Standard_A1 storage_account: "{{ storage_account }}" storage_container: "{{ vm_name1 }}" storage_blob: "{{ vm_name1 }}.vhd" admin_username: adminuser admin_password: Password123! short_hostname: testvm os_type: Linux network_interfaces: "{{ vm_name1 }}" image: offer: UbuntuServer publisher: Canonical sku: 16.04-LTS version: latest register: output - assert: that: - output.changed - output.ansible_facts.azure_vm.properties.hardwareProfile.vmSize == "Standard_A1" - name: Delete VM azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: "{{ vm_name1 }}" state: absent vm_size: Standard_A0 register: output - name: NIC should be gone azure_rm_networkinterface_facts: resource_group: "{{ resource_group }}" name: "{{ vm_name1 }}" register: output - assert: that: azure_networkinterfaces | length == 0 - name: PIP should be gone azure_rm_publicipaddress_facts: resource_group: "{{ resource_group }}" name: "{{ vm_name1 }}" register: output - assert: that: azure_publicipaddresses | length == 0 - name: Create virtual machine without public ip address and with boot diagnostics enabled azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: testvmnoip vm_size: Standard_A0 admin_username: adminuser admin_password: Password123! short_hostname: testvm os_type: Linux public_ip_allocation_method: Disabled availability_set: "{{ abs_name1 }}" boot_diagnostics: enabled: true image: offer: UbuntuServer publisher: Canonical sku: 16.04-LTS version: latest register: output - assert: that: - azure_vm.properties.diagnosticsProfile.bootDiagnostics.enabled - azure_vm.properties.diagnosticsProfile.bootDiagnostics.storageUri is defined - azure_vm.properties.instanceView.bootDiagnostics.consoleScreenshotBlobUri is defined - azure_vm.properties.instanceView.bootDiagnostics.serialConsoleLogBlobUri is defined - not 'publicIPAddress' in output.ansible_facts.azure_vm.properties.networkProfile.networkInterfaces[0].properties.ipConfigurations[0].properties - name: Delete VM with no public ip azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: testvmnoip state: absent remove_on_absent: all_autocreated vm_size: Standard_A0 async: 5000 poll: 0 - set_fact: niclist: - name: testnic011 resource_group: "{{ resource_group_secondary }}" - name: testnic012 resource_group: "{{ resource_group_secondary }}" - name: Create an availability set azure_rm_availabilityset: name: "{{ abs_name2 }}" resource_group: "{{ resource_group }}" - name: Create virtual network azure_rm_virtualnetwork: resource_group: "{{ resource_group_secondary }}" name: "{{ vm_name2 }}" address_prefixes: "10.10.0.0/16" register: vn - name: Add subnet azure_rm_subnet: resource_group: "{{ resource_group_secondary }}" name: "{{ vm_name2 }}" address_prefix: "10.10.0.0/24" virtual_network: "{{ vm_name2 }}" - name: Create NICs for dual nic VM azure_rm_networkinterface: resource_group: "{{ item.resource_group }}" name: "{{ item.name }}" virtual_network: "{{ vn.state.id }}" subnet: "{{ vm_name2 }}" security_group: "{{ vm_name2 }}" loop: "{{ niclist }}" - name: Create virtual machine with two NICs azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: "{{ vm_name2 }}" vm_size: Standard_A0 storage_account: "{{ storage_account }}" storage_container: "{{ vm_name2 }}" storage_blob: "{{ vm_name2 }}.vhd" admin_username: adminuser admin_password: Password123! short_hostname: testvm os_type: Linux os_disk_size_gb: 64 os_disk_name: testosdiskxx network_interfaces: "{{ niclist }}" availability_set: "{{ abs_name2 }}" image: offer: UbuntuServer publisher: Canonical sku: 16.04-LTS version: latest tags: abc: def register: output - assert: that: - azure_vm.properties.availabilitySet.id - azure_vm.properties.storageProfile.osDisk.name == 'testosdiskxx' - name: Retrieve vms facts (filtering by name) azure_rm_virtualmachine_facts: resource_group: "{{ resource_group }}" name: "{{ vm_name2 }}" register: results - name: Assert that facts module returned the second vm assert: that: - results.vms | length == 1 - results.vms[0].name == "{{ vm_name2 }}" - results.vms[0].location - results.vms[0].admin_username == 'adminuser' - results.vms[0].resource_group == "{{ resource_group }}" - results.vms[0].power_state != None - name: Retrieve facts by tags azure_rm_virtualmachine_facts: tags: - abc:def register: results - name: Assert that facts module returned the second vm assert: that: - results.vms | length >= 1 - name: Should be idempotent with a dual NICs azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: "{{ vm_name2 }}" vm_size: Standard_A0 storage_account: "{{ storage_account }}" storage_container: "{{ vm_name2 }}" storage_blob: "{{ vm_name2 }}.vhd" admin_username: adminuser admin_password: Password123! short_hostname: testvm os_type: Linux os_disk_size_gb: 64 network_interfaces: "{{ niclist }}" availability_set: "{{ abs_name2 }}" image: offer: UbuntuServer publisher: Canonical sku: 16.04-LTS version: latest register: output - assert: that: not output.changed - name: Generalize VM azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: "{{ vm_name2 }}" generalized: yes - name: Gather facts and check if machine is generalized azure_rm_virtualmachine_facts: resource_group: "{{ resource_group }}" name: "{{ vm_name2 }}" register: generalized_output - assert: that: generalized_output.vms[0].power_state == 'generalized' - name: Delete dual NIC VM azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: "{{ vm_name2 }}" state: absent vm_size: Standard_A0 async: 5000 poll: 0 # 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 azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: testvm002 image: offer: UbuntuServer register: fail_invalid_image_dict failed_when: 'fail_invalid_image_dict.msg != "parameter error: expecting image to contain [publisher, offer, sku, version] or [name, resource_group]"' - name: assert error thrown with invalid image type azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: testvm002 image: - testing register: fail_invalid_image_type failed_when: 'fail_invalid_image_type.msg != "parameter error: expecting image to be a string or dict not list"' - name: assert error finding missing custom image azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: testvm002 image: invalid-image register: fail_missing_custom_image failed_when: fail_missing_custom_image.msg != "Error could not find image with name invalid-image" - name: assert error finding missing custom image (dict style) azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: testvm002 image: name: invalid-image register: fail_missing_custom_image_dict failed_when: fail_missing_custom_image_dict.msg != "Error could not find image with name invalid-image" ## Tests possible when CI user acccount setup with required authority #- name: Set test facts #set_fact: #image_paid: #publisher: cognosys #offer: ubuntu-14-04-lts #sku: hardened-ubuntu-14-04 #version: latest #plan_paid: #name: hardened-ubuntu-14-04 #product: ubuntu-14-04-lts #publisher: cognosys #- name: Create virtual machine with image and plan which requires acceptance of terms #azure_rm_virtualmachine: #resource_group: "{{ resource_group }}" #name: testvm009 #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 #availability_set: "avbs{{ resource_group | hash('md5') | truncate(7, True, '') }}" #image: "{{ image_paid }}" #plan_paid: "{{ plan_paid }}" #register: output #- assert: #that: #- output.changed #- output.ansible_facts.azure_vm.properties.storageProfile.imageReference.publisher == image_paid.publisher #- name: Should be idempotent with image and plan which requires acceptance of terms #azure_rm_virtualmachine: #resource_group: "{{ resource_group }}" #name: testvm009 #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 #availability_set: "avbs{{ resource_group | hash('md5') | truncate(7, True, '') }}" #image: "{{ image_paid }}" #plan_paid: "{{ plan_paid }}" #- assert: #that: not output.changed - name: Create minimal VM with defaults azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: "{{ vm_name3 }}" admin_username: "testuser" admin_password: "Pass123$$$abx!" vm_size: Standard_B1ms image: offer: UbuntuServer publisher: Canonical sku: 16.04-LTS version: latest register: vm_output - name: Delete VM azure_rm_virtualmachine: resource_group: "{{ resource_group }}" name: "{{ vm_name3 }}" remove_on_absent: all_autocreated state: absent - name: Query NIC azure_rm_networkinterface_facts: resource_group: "{{ resource_group }}" name: "{{ vm_name3 }}01" register: output_nic - name: Query NSG azure_rm_securitygroup_facts: resource_group: "{{ resource_group }}" name: "{{ vm_name3 }}01" register: output_nsg - name: Query PIP azure_rm_publicipaddress_facts: resource_group: "{{ resource_group }}" name: "{{ vm_name3 }}01" register: output_pip - name: Assert that autocreated resources were deleted assert: that: # what about the default storage group? - output_nic.ansible_facts.azure_networkinterfaces | length == 0 - output_nsg.ansible_facts.azure_securitygroups | length == 0 - output_pip.ansible_facts.azure_publicipaddresses | length == 0