summaryrefslogtreecommitdiff
path: root/ansible/roles/proxmox_vm
diff options
context:
space:
mode:
Diffstat (limited to 'ansible/roles/proxmox_vm')
-rw-r--r--ansible/roles/proxmox_vm/tasks/create_vm.yaml16
-rw-r--r--ansible/roles/proxmox_vm/tasks/enable_qemu_guest_agent.yaml12
-rw-r--r--ansible/roles/proxmox_vm/tasks/get_ip.yaml29
-rw-r--r--ansible/roles/proxmox_vm/tasks/main.yaml17
-rw-r--r--ansible/roles/proxmox_vm/tasks/set_network.yaml20
-rw-r--r--ansible/roles/proxmox_vm/tasks/start_vm.yaml13
-rw-r--r--ansible/roles/proxmox_vm/tasks/upload_files.yaml9
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 }}"