homeserver initial commit
- ansible - docker-compose - Kubernetes_deployments
This commit is contained in:
		
							
								
								
									
										1
									
								
								ansible/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								ansible/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| secrets/ | ||||
							
								
								
									
										86
									
								
								ansible/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								ansible/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,86 @@ | ||||
| # Ansible Playbook for Proxmox VM Management | ||||
|  | ||||
| This Ansible playbook automates the creation, deletion, and configuration of  | ||||
| virtual machines (VMs) on a Proxmox server. | ||||
|  | ||||
| ## Prerequisites | ||||
|  | ||||
| - Ansible installed on the local machine | ||||
| - Ansible community.general.proxmox_kvm module | ||||
| - Access to a Proxmox server with API access enabled | ||||
| - Python `proxmoxer` library installed (`pip install proxmoxer`) | ||||
|  | ||||
| ## Setup | ||||
|  | ||||
| 1. Clone this repository: | ||||
|     ```sh | ||||
|     git clone https://github.com/TheTaqiTahmid/proxmox_ansible_automation | ||||
|     ``` | ||||
|  | ||||
| 2. Update the `inventory` file with your Proxmox server details: | ||||
|     ```yaml | ||||
|     all: | ||||
|       hosts: | ||||
|         proxmox: | ||||
|           ansible_host: your_proxmox_ip | ||||
|           ansible_user: your_proxmox_user | ||||
|           ansible_password: your_proxmox_password | ||||
|     ``` | ||||
|     In the current example implementation in `inventories/hosts.yaml`, there are | ||||
|     multiple groups depending on the types of hosts. | ||||
|  | ||||
| 3. Add group-related variables to the group file under the `group_vars` directory | ||||
|    and individual host-related variables to the files under the `host_vars`  | ||||
|   directory. Ansible will automatically pick up these variables. | ||||
|  | ||||
| ## Playbooks | ||||
|  | ||||
| ### Create VM | ||||
|  | ||||
| To create the VMs, run the following command: | ||||
| ```sh | ||||
| ansible-playbook playbooks/create-vms.yaml | ||||
| ``` | ||||
| The playbook can be run against specific Proxmox instance using: | ||||
| ```sh | ||||
| ansible-playbook playbooks/create-vms.yaml --limit proxmox1 | ||||
| ``` | ||||
|  | ||||
| ### Delete VM | ||||
|  | ||||
| To delete existing VMs, run the following command: | ||||
| ```sh | ||||
| ansible-playbook playbooks/destroy-vms.yaml | ||||
| ``` | ||||
|  | ||||
| Similarly the destory playbook can be run against specific Proxmox instance using: | ||||
| ```sh | ||||
| ansible-playbook playbooks/destroy-vms.yaml --limit proxmox1 | ||||
| ``` | ||||
|  | ||||
| ### Configure VM | ||||
|  | ||||
| To configure an existing VM, run the following command: | ||||
| ```sh | ||||
| ansible-playbook playbooks/configure-vms.yaml | ||||
| ``` | ||||
|  | ||||
| The configuration can be limited to individual VMs using limits: | ||||
| ```sh | ||||
| ansible-playbook playbooks/configure-vms.yaml --limit vm6 | ||||
| ``` | ||||
|  | ||||
| ## Variables | ||||
|  | ||||
| The playbooks use the following variables, which can be customized in the  | ||||
| `group_vars/proxmox.yml` file: | ||||
|  | ||||
| - `vm_id`: The ID of the VM | ||||
| - `vm_name`: The name of the VM | ||||
| - `vm_memory`: The amount of memory for the VM | ||||
| - `vm_cores`: The number of CPU cores for the VM | ||||
| - `vm_disk_size`: The size of the VM disk | ||||
|  | ||||
| ## Author | ||||
|  | ||||
| - Taqi Tahmid (mdtaqitahmid@gmail.com) | ||||
							
								
								
									
										5
									
								
								ansible/ansible.cfg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								ansible/ansible.cfg
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | ||||
| [defaults] | ||||
| inventory = ./inventory/hosts.yaml | ||||
| roles_path = ./roles | ||||
| host_key_checking = False | ||||
| vault_password_file = ~/.ansible_vault_pass | ||||
							
								
								
									
										11
									
								
								ansible/inventory/group_vars/all.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								ansible/inventory/group_vars/all.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | ||||
| # Proxmox access related variables | ||||
| proxmox_api_url: "192.168.1.121" | ||||
|  | ||||
| # Cloud-init image related variables | ||||
| image_url: "https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img" | ||||
| image_dest: "/tmp/cloud-image.img" | ||||
| image_format: "qcow2" | ||||
| storage_name: "local" | ||||
|  | ||||
| # ansible venv | ||||
| ansible_venv: "/home/taqi/.venv/ansible/bin/python" | ||||
							
								
								
									
										4
									
								
								ansible/inventory/group_vars/vms.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								ansible/inventory/group_vars/vms.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| apt_packages: | ||||
|   - curl | ||||
|   - vim | ||||
|   - htop | ||||
							
								
								
									
										29
									
								
								ansible/inventory/host_vars/proxmox1.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								ansible/inventory/host_vars/proxmox1.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | ||||
| # VM related variables | ||||
| vm_list: | ||||
|   - id: 106 | ||||
|     name: "vm6" | ||||
|     memory: 4096 | ||||
|     cores: 2 | ||||
|     disk_size: 30G | ||||
|     ip: "192.168.1.151/24" | ||||
|     gateway: "192.168.1.1" | ||||
|     nameserver1: "1.1.1.1" | ||||
|     nameserver2: "8.8.8.8" | ||||
|   - id: 107 | ||||
|     name: "vm7" | ||||
|     memory: 4096 | ||||
|     cores: 2 | ||||
|     disk_size: 30G | ||||
|     ip: "192.168.1.152/24" | ||||
|     gateway: "192.168.1.1" | ||||
|     nameserver1: "1.1.1.1" | ||||
|     nameserver2: "8.8.8.8" | ||||
|  | ||||
| # cloud-init variables | ||||
| node: "homeserver1" | ||||
| net0: "virtio,bridge=vmbr0" | ||||
| # disk_name: "local:1000/vm-1000-disk-0.raw,discard=on" | ||||
| disk_path: "/var/lib/vz/images/1000" | ||||
| ide2: "local:cloudinit,format=qcow2" | ||||
| boot_order: "order=scsi0" | ||||
| scsi_hw: "virtio-scsi-pci" | ||||
							
								
								
									
										30
									
								
								ansible/inventory/host_vars/proxmox2.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								ansible/inventory/host_vars/proxmox2.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | ||||
| # VM related variables | ||||
| vm_list: | ||||
|   - id: 206 | ||||
|     name: "vm8" | ||||
|     memory: 4096 | ||||
|     cores: 2 | ||||
|     disk_size: 30G | ||||
|     ip: "192.168.1.161/24" | ||||
|     gateway: "192.168.1.1" | ||||
|     nameserver1: "1.1.1.1" | ||||
|     nameserver2: "8.8.8.8" | ||||
|   - id: 207 | ||||
|     name: "vm9" | ||||
|     memory: 4096 | ||||
|     cores: 2 | ||||
|     disk_size: 30G | ||||
|     ip: "192.168.1.162/24" | ||||
|     gateway: "192.168.1.1" | ||||
|     nameserver1: "1.1.1.1" | ||||
|     nameserver2: "8.8.8.8" | ||||
|  | ||||
|  | ||||
| # cloud-init template variables | ||||
| node: "homeserver2" | ||||
| net0: "virtio,bridge=vmbr0" | ||||
| # disk_name: "local:2000/vm-2000-disk-0.raw,discard=on" | ||||
| disk_path: "/var/lib/vz/images/2000" | ||||
| ide2: "local:cloudinit,format=qcow2" | ||||
| boot_order: "order=scsi0" | ||||
| scsi_hw: "virtio-scsi-pci" | ||||
							
								
								
									
										51
									
								
								ansible/inventory/hosts.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								ansible/inventory/hosts.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | ||||
| all: | ||||
|   children: | ||||
|     hypervisors: | ||||
|     vms: | ||||
|  | ||||
| hypervisors: | ||||
|   children: | ||||
|     server1: | ||||
|     server2: | ||||
|  | ||||
| server1: | ||||
|   hosts: | ||||
|     proxmox1: | ||||
|       ansible_host: 192.168.1.121 | ||||
|       ansible_user:  "{{ ansible_proxmox_user }}" | ||||
|       ansible_ssh_private_key_file: "{{ ansible_ssh_private_key_file }}" | ||||
|  | ||||
| server2: | ||||
|   hosts: | ||||
|     proxmox2: | ||||
|       ansible_host: 192.168.1.122 | ||||
|       ansible_user:  "{{ ansible_proxmox_user }}" | ||||
|       ansible_ssh_private_key_file: "{{ ansible_ssh_private_key_file }}" | ||||
|  | ||||
| vms: | ||||
|   children: | ||||
|     vm_group_1: | ||||
|     vm_group_2: | ||||
|  | ||||
| vm_group_1: | ||||
|   hosts: | ||||
|     vm6: | ||||
|       ansible_host: 192.168.1.151 | ||||
|       ansible_user: "{{ ansible_vm_user }}" | ||||
|       ansible_ssh_private_key_file: "{{ ansible_ssh_private_key_file }}" | ||||
|     vm7: | ||||
|       ansible_host: 192.168.1.152 | ||||
|       ansible_user: "{{ ansible_vm_user }}" | ||||
|       ansible_ssh_private_key_file: "{{ ansible_ssh_private_key_file }}" | ||||
|  | ||||
| vm_group_2: | ||||
|   hosts: | ||||
|     vm8: | ||||
|       ansible_host: 192.168.1.161 | ||||
|       ansible_user: "{{ ansible_vm_user }}" | ||||
|       ansible_ssh_private_key_file: "{{ ansible_ssh_private_key_file }}" | ||||
|     vm9: | ||||
|       ansible_host: 192.168.1.162 | ||||
|       ansible_user: "{{ ansible_vm_user }}" | ||||
|       ansible_ssh_private_key_file: "{{ ansible_ssh_private_key_file }}" | ||||
|  | ||||
							
								
								
									
										6
									
								
								ansible/playbooks/configure-vms.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ansible/playbooks/configure-vms.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | ||||
| - name: Create Proxmox VMs | ||||
|   hosts: vms | ||||
|   vars_files: | ||||
|     - ../secrets/vault.yaml  # Load the encrypted vault file | ||||
|   roles: | ||||
|     - configure-vms | ||||
							
								
								
									
										6
									
								
								ansible/playbooks/create-vms.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ansible/playbooks/create-vms.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | ||||
| - name: Create Proxmox VMs | ||||
|   hosts: hypervisors | ||||
|   vars_files: | ||||
|     - ../secrets/vault.yaml  # Load the encrypted vault file | ||||
|   roles: | ||||
|     - create-vms | ||||
							
								
								
									
										6
									
								
								ansible/playbooks/destroy-vms.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ansible/playbooks/destroy-vms.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | ||||
| - name: Destroy Proxmox VMs | ||||
|   hosts: hypervisors | ||||
|   vars_files: | ||||
|     - ../secrets/vault.yaml  # Load the encrypted vault file | ||||
|   roles: | ||||
|     - destroy-vms | ||||
							
								
								
									
										11
									
								
								ansible/roles/configure-vms/tasks/main.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								ansible/roles/configure-vms/tasks/main.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | ||||
| --- | ||||
| - name: Update apt cache | ||||
|   ansible.builtin.apt: | ||||
|     update_cache: yes | ||||
|   become: true | ||||
|  | ||||
| - name: Install necessary packages | ||||
|   ansible.builtin.apt: | ||||
|     name: "{{ apt_packages }}" | ||||
|     state: present | ||||
|   become: true | ||||
							
								
								
									
										70
									
								
								ansible/roles/create-vms/tasks/main.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								ansible/roles/create-vms/tasks/main.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,70 @@ | ||||
| --- | ||||
| - name: Download cloud image | ||||
|   get_url: | ||||
|     url: "{{ image_url }}" | ||||
|     dest: "{{ image_dest }}" | ||||
|     use_netrc: yes | ||||
|  | ||||
| - name: create VMs | ||||
|   delegate_to: localhost | ||||
|   vars: | ||||
|     ansible_python_interpreter: /home/taqi/.venv/ansible/bin/python | ||||
|   community.general.proxmox_kvm: | ||||
|     api_host: "{{ proxmox_api_url }}" | ||||
|     api_user: "{{ proxmox_user }}" | ||||
|     api_token_id: "{{ proxmox_api_token_id }}" | ||||
|     api_token_secret: "{{ proxmox_api_token }}" | ||||
|     node: "{{ node }}" | ||||
|     vmid: "{{ item.id }}" | ||||
|     name: "{{ item.name }}" | ||||
|     memory: "{{ item.memory }}" | ||||
|     cores: "{{ item.cores }}" | ||||
|     scsihw: "{{ scsi_hw }}" | ||||
|     boot: "{{ boot_order }}" | ||||
|     net: | ||||
|       net0: "{{ net0 }}" | ||||
|     ipconfig: | ||||
|       ipconfig0: "ip={{ item.ip }},gw={{ item.gateway }}" | ||||
|     ide: | ||||
|       ide2: "{{ ide2 }}" | ||||
|     nameservers: "{{ item.nameserver1 }},{{ item.nameserver2 }}" | ||||
|     ciuser: "{{ ciuser }}" | ||||
|     cipassword: "{{ cipassword }}" | ||||
|     sshkeys: "{{ lookup('file', '/home/taqi/.ssh/homeserver.pub') }}" | ||||
|   loop: "{{ vm_list }}" | ||||
|  | ||||
| - name: Import disk image | ||||
|   ansible.builtin.shell: | | ||||
|     qm importdisk "{{ item.id }}" "{{ image_dest }}" "{{ storage_name }}" --format "{{ image_format }}" | ||||
|   loop: "{{ vm_list }}" | ||||
|  | ||||
| - name: Attach disk to VM | ||||
|   ansible.builtin.shell: | | ||||
|     qm set "{{ item.id }}" --scsi0 "{{ storage_name }}:{{ item.id }}/vm-{{ item.id }}-disk-0.{{ image_format }},discard=on" | ||||
|   loop: "{{ vm_list }}" | ||||
|  | ||||
| - name: Resize disk | ||||
|   ansible.builtin.shell: | | ||||
|     qm resize {{ item.id }} scsi0 {{ item.disk_size }} | ||||
|   loop: "{{ vm_list }}" | ||||
|  | ||||
| - name: Start VMs | ||||
|   delegate_to: localhost | ||||
|   vars: | ||||
|     ansible_python_interpreter: /home/taqi/.venv/ansible/bin/python | ||||
|   community.general.proxmox_kvm: | ||||
|     api_host: "{{ proxmox_api_url }}" | ||||
|     api_user: "{{ proxmox_user }}" | ||||
|     api_token_id: "{{ proxmox_api_token_id }}" | ||||
|     api_token_secret: "{{ proxmox_api_token }}" | ||||
|     node: "{{ node }}" | ||||
|     name: "{{ item.name }}" | ||||
|     state: started | ||||
|   loop: "{{ vm_list }}" | ||||
|   tags: | ||||
|     - start_vms | ||||
|  | ||||
| - name: Clean up downloaded image | ||||
|   file: | ||||
|     path: "{{ image_dest }}" | ||||
|     state: absent | ||||
							
								
								
									
										59
									
								
								ansible/roles/destroy-vms/tasks/main.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								ansible/roles/destroy-vms/tasks/main.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,59 @@ | ||||
| --- | ||||
| - name: Get VM current state | ||||
|   delegate_to: localhost | ||||
|   vars: | ||||
|     ansible_python_interpreter: "{{ ansible_venv }}" | ||||
|   community.general.proxmox_kvm: | ||||
|     api_host: "{{ proxmox_api_url }}" | ||||
|     api_user: "{{ proxmox_user }}" | ||||
|     api_token_id: "{{ proxmox_api_token_id }}" | ||||
|     api_token_secret: "{{ proxmox_api_token }}" | ||||
|     name: "{{ item.name }}" | ||||
|     node: "{{ node }}" | ||||
|     state: current | ||||
|   register: vm_state | ||||
|   ignore_errors: yes | ||||
|   loop: "{{ vm_list }}" | ||||
|   tags: | ||||
|     - vm_delete | ||||
|  | ||||
| - name: Debug VM state | ||||
|   debug: | ||||
|     msg: "VM state: {{ vm_state.results[0].status }}" | ||||
|   when: vm_state is succeeded | ||||
|   loop: "{{ vm_list }}" | ||||
|  | ||||
| - name: Stop VM | ||||
|   delegate_to: localhost | ||||
|   vars: | ||||
|     ansible_python_interpreter: "{{ ansible_venv }}" | ||||
|   community.general.proxmox_kvm: | ||||
|     api_host: "{{ proxmox_api_url }}" | ||||
|     api_user: "{{ proxmox_user }}" | ||||
|     api_token_id: "{{ proxmox_api_token_id }}" | ||||
|     api_token_secret: "{{ proxmox_api_token }}" | ||||
|     name: "{{ item.name }}" | ||||
|     node: "{{ node }}" | ||||
|     state: stopped | ||||
|     force: true | ||||
|   when: vm_state is succeeded and vm_state.results[0].status != 'absent' | ||||
|   loop: "{{ vm_list }}" | ||||
|   tags: | ||||
|     - vm_delete | ||||
|  | ||||
| - name: Delete VM | ||||
|   delegate_to: localhost | ||||
|   vars: | ||||
|     ansible_python_interpreter: "{{ ansible_venv }}" | ||||
|   community.general.proxmox_kvm: | ||||
|     api_host: "{{ proxmox_api_url }}" | ||||
|     api_user: "{{ proxmox_user }}" | ||||
|     api_token_id: "{{ proxmox_api_token_id }}" | ||||
|     api_token_secret: "{{ proxmox_api_token }}" | ||||
|     name: "{{ item.name }}" | ||||
|     node: "{{ node }}" | ||||
|     state: absent | ||||
|   when: vm_state is succeeded and vm_state.results[0].status != 'absent' | ||||
|   loop: "{{ vm_list }}" | ||||
|   tags: | ||||
|     - vm_delete | ||||
		Reference in New Issue
	
	Block a user