Ansible Modules for Proxmox
Table of Contents
Create Ansible User in Proxmox #
# create role
pveum role add AnsibleUser --privs "Datastore.AllocateSpace \
VM.Allocate VM.Audit VM.Clone VM.Config.CDROM \
VM.Config.Cloudinit VM.Config.CPU VM.Config.Disk \
VM.Config.HWType VM.Config.Memory VM.Config.Network \
VM.Config.Options VM.Console VM.Monitor VM.PowerMgmt"
# create group
pveum group add ansible-users
# add permissions
pveum acl modify / -group ansible-users -role AnsibleUser
# create user 'ansible'
pveum useradd ansible@pve -groups ansible-users
# generate a token
pveum user token add ansible@pve token -privsep 0
Module: proxmox #
Quick notes:
Module: proxmox_kvm #
Quick notes:
- Ansible Docs: community.general.proxmox_kvm
- Provides a way to provision VMs on PVE from backups, templates or create new VMs.
- Alternative to Terraform, but without a state file.
- Run the plays from a localhost or remote host that is not a Proxmox node, as the task will access the Proxmox API endpoint.
- The task requires the python libraries:
proxmoxerandrequests. However, only the Ansible controller needs these dependencies installed. - You cannot set the
api_*variables in a file, this leads to code duplication in the playbook.
Example Code #
Variable File:
# proxmox_vars.yml
pve_host: "192.168.100.1:8006/api2/json"
pve_node: "proxmox"
pve_storage: "local-lvm"
pve_token_id: "{{ vault_pve_token_id }}"
pve_token_secret: "{{ vault_pve_token_secret }}"
pve_user: "ansible@pve"
Vault File:
# vault.yml
vault_pve_token_id: "token"
vault_pve_token_secret: "782a7700-4010-4802-8f4d-820f1b226850"
Example Playbook:
vmid: PVE template ID.clone: PVE template name, required ifvmidis set, but no validation occurs so the value is arbitrary.name: name of new VM, if unset defaults to'Copy-of-VM-[PVE_TEMPLATE_NAME]'.
# playbook.yml
---
- name: Create VM from Proxmox Template
hosts:
- localhost
vars_files:
- proxmox_vars.yml
tasks:
- name: Create VM from Proxmox Template
delegate_to: localhost
block:
- name: Clone Proxmox Template
community.general.proxmox_kvm:
node: "{{ pve_node }}"
api_host: "{{ pve_host }}"
api_user: "{{ pve_user }}"
api_token_id: "{{ pve_token_id }}"
api_token_secret: "{{ pve_token_secret }}"
vmid: 9000 # template ID
clone: foobar # no validation, arbitrary value to trigger clone process
name: new-vm-name
storage: "{{ pve_storage }}"
timeout: 60
register: proxmox_vm
- name: VM - Start, Stop, Remove
community.general.proxmox_kvm:
node: "{{ pve_node }}"
api_host: "{{ pve_host }}"
api_user: "{{ pve_user }}"
api_token_id: "{{ pve_token_id }}"
api_token_secret: "{{ pve_token_secret }}"
vmid: "{{ proxmox_vm.vmid }}"
state: started # started, stopped, absent
timeout: 60
References #
Ansible:
Proxmox:
Python: