diff options
Diffstat (limited to 'ansible/roles/proxmox_vm')
-rw-r--r-- | ansible/roles/proxmox_vm/tasks/create_vm.yaml | 16 | ||||
-rw-r--r-- | ansible/roles/proxmox_vm/tasks/enable_qemu_guest_agent.yaml | 12 | ||||
-rw-r--r-- | ansible/roles/proxmox_vm/tasks/get_ip.yaml | 29 | ||||
-rw-r--r-- | ansible/roles/proxmox_vm/tasks/main.yaml | 17 | ||||
-rw-r--r-- | ansible/roles/proxmox_vm/tasks/set_network.yaml | 20 | ||||
-rw-r--r-- | ansible/roles/proxmox_vm/tasks/start_vm.yaml | 13 | ||||
-rw-r--r-- | ansible/roles/proxmox_vm/tasks/upload_files.yaml | 9 |
7 files changed, 116 insertions, 0 deletions
diff --git a/ansible/roles/proxmox_vm/tasks/create_vm.yaml b/ansible/roles/proxmox_vm/tasks/create_vm.yaml new file mode 100644 index 0000000..21645b9 --- /dev/null +++ b/ansible/roles/proxmox_vm/tasks/create_vm.yaml @@ -0,0 +1,16 @@ +--- +- name: "create vm from template" + community.general.proxmox_kvm: + api_host: "{{ proxmox_hostname }}" + api_user: "{{ proxmox_username }}" + api_token_id: "{{ proxmox_api_token_id }}" + api_token_secret: "{{ proxmox_api_token_secret }}" + node: "{{ proxmox_node }}" + clone: "{{ template }}" + vmid: "{{ id }}" + newid: "{{ newid | int }}" + name: "{{ vm }}" + full: true + storage: "local-lvm" + timeout: 1337 + register: clone_result diff --git a/ansible/roles/proxmox_vm/tasks/enable_qemu_guest_agent.yaml b/ansible/roles/proxmox_vm/tasks/enable_qemu_guest_agent.yaml new file mode 100644 index 0000000..df6da92 --- /dev/null +++ b/ansible/roles/proxmox_vm/tasks/enable_qemu_guest_agent.yaml @@ -0,0 +1,12 @@ +--- +- name: "vmid {{ clone_result.vmid }}: enabling qemu guest agent via proxmox api" + uri: + url: "https://{{ proxmox_hostname }}:8006/api2/json/nodes/{{ proxmox_node }}/qemu/{{ clone_result.vmid }}/config" + method: PUT + headers: + Authorization: "PVEAPIToken={{ proxmox_username }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}" + body: + agent: 1 + body_format: json + validate_certs: no + diff --git a/ansible/roles/proxmox_vm/tasks/get_ip.yaml b/ansible/roles/proxmox_vm/tasks/get_ip.yaml new file mode 100644 index 0000000..584b44d --- /dev/null +++ b/ansible/roles/proxmox_vm/tasks/get_ip.yaml @@ -0,0 +1,29 @@ +--- +- name: "vmid {{ clone_result.vmid }}: getting config via proxmox api" + set_fact: + vm_config: "{{ lookup('url', config_url, validate_certs=False, headers=config_headers) }}" + vars: + config_url: "https://{{ proxmox_hostname }}:8006/api2/json/nodes/{{ proxmox_node }}/qemu/{{ clone_result.vmid }}/agent/network-get-interfaces" + config_headers: + Authorization: "PVEAPIToken={{ proxmox_username }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}" + +- name: "vmid {{ clone_result.vmid }}: extracting ipv4 address" + set_fact: + vm_ip: >- + {{ + vm_config['data']['result'] + | map(attribute='ip-addresses') + | flatten + | selectattr("ip-address-type", "equalto", "ipv4") + | selectattr("ip-address", "ne", "127.0.0.1") + | map(attribute="ip-address") + | first + }} + +- name: "vmid {{ clone_result.vmid }}: ip address result" + ansible.builtin.debug: + msg: "vmid {{ clone_result.vmid }} ip address is {{ vm_ip }}" + +- name: "vmid {{ clone_result.vmid }}: set ip to {{ vm_ip }}" + set_fact: + ansible_host: "{{ vm_ip }}" diff --git a/ansible/roles/proxmox_vm/tasks/main.yaml b/ansible/roles/proxmox_vm/tasks/main.yaml new file mode 100644 index 0000000..c6abe93 --- /dev/null +++ b/ansible/roles/proxmox_vm/tasks/main.yaml @@ -0,0 +1,17 @@ +- name: create vm from template + import_tasks: create_vm.yaml + +- name: enable qemu guest agent + import_tasks: enable_qemu_guest_agent.yaml + +- name: start vm + import_tasks: start_vm.yaml + +- name: get vm ip address + import_tasks: get_ip.yaml + +- name: set vm network configuration + import_tasks: set_network.yaml + +- name: upload files to vm + import_tasks: upload_files.yaml diff --git a/ansible/roles/proxmox_vm/tasks/set_network.yaml b/ansible/roles/proxmox_vm/tasks/set_network.yaml new file mode 100644 index 0000000..20ab31c --- /dev/null +++ b/ansible/roles/proxmox_vm/tasks/set_network.yaml @@ -0,0 +1,20 @@ +--- +- name: "vmid {{ clone_result.vmid }}: set up static ip address" + win_shell: | + Start-Transcript -Path C:\set_domain_network_log.txt -Append + Get-NetIpAddress -InterfaceAlias 'Ethernet' | Remove-NetIPAddress -Confirm:$false + New-NetIPAddress -InterfaceAlias 'Ethernet' -IPAddress "{{ ip }}" -PrefixLength 24 -DefaultGateway "{{ gateway }}" + Set-DnsClientServerAddress -InterfaceAlias 'Ethernet' -ServerAddresses "{{ dns }}" + Get-NetConnectionProfile -InterfaceAlias 'Ethernet' | Set-NetConnectionProfile -NetworkCategory Private + Stop-Transcript + async: 15 + poll: 0 + delegate_to: "{{ vm_ip }}" + +- name: "vmid {{ clone_result.vmid }}: update ip to {{ ip }}" + set_fact: + ansible_host: "{{ ip }}" + +- name: "vmid {{ clone_result.vmid }}: pause execution for 1 minute to allow ip change and reconnect" + pause: + minutes: 1 diff --git a/ansible/roles/proxmox_vm/tasks/start_vm.yaml b/ansible/roles/proxmox_vm/tasks/start_vm.yaml new file mode 100644 index 0000000..f2ed036 --- /dev/null +++ b/ansible/roles/proxmox_vm/tasks/start_vm.yaml @@ -0,0 +1,13 @@ +- name: "start vm" + community.general.proxmox_kvm: + api_host: "{{ proxmox_hostname }}" + api_user: "{{ proxmox_username }}" + api_token_id: "{{ proxmox_api_token_id }}" + api_token_secret: "{{ proxmox_api_token_secret }}" + node: "{{ proxmox_node }}" + vmid: "{{ vmid | int }}" + state: started + +- name: "pause execution for 3 minutes to allow vm to fully boot" + pause: + minutes: 3 diff --git a/ansible/roles/proxmox_vm/tasks/upload_files.yaml b/ansible/roles/proxmox_vm/tasks/upload_files.yaml new file mode 100644 index 0000000..651d203 --- /dev/null +++ b/ansible/roles/proxmox_vm/tasks/upload_files.yaml @@ -0,0 +1,9 @@ +--- +- name: "upload directories" + ansible.builtin.copy: + src: "{{ item.src }}" + dest: "{{ item.dest }}" + loop: + - { src: ../../../scripts/, dest: C:\scripts\ } + - { src: ../../../files/software/, dest: C:\software\ } + delegate_to: "{{ ansible_host }}" |