196 lines
4.0 KiB
Markdown
196 lines
4.0 KiB
Markdown
# Ansible Proxmox Dynamic Inventory
|
|
|
|
Query Proxmox API for automatic inventory generation.
|
|
|
|
## Plugin Setup
|
|
|
|
### Requirements
|
|
|
|
```bash
|
|
pip install proxmoxer requests
|
|
ansible-galaxy collection install community.general
|
|
```
|
|
|
|
### Inventory File
|
|
|
|
Create `inventory/proxmox.yml`:
|
|
|
|
```yaml
|
|
plugin: community.general.proxmox
|
|
url: https://proxmox.example.com:8006
|
|
user: ansible@pve
|
|
token_id: mytoken
|
|
token_secret: "{{ lookup('env', 'PROXMOX_TOKEN_SECRET') }}"
|
|
validate_certs: false
|
|
|
|
# Include VMs and containers
|
|
want_facts: true
|
|
want_proxmox_nodes_ansible_host: false
|
|
|
|
# Filter by status
|
|
filters:
|
|
- status == "running"
|
|
|
|
# Group by various attributes
|
|
groups:
|
|
# By Proxmox node
|
|
node_joseph: proxmox_node == "joseph"
|
|
node_maxwell: proxmox_node == "maxwell"
|
|
node_everette: proxmox_node == "everette"
|
|
|
|
# By type
|
|
vms: proxmox_type == "qemu"
|
|
containers: proxmox_type == "lxc"
|
|
|
|
# By template naming convention
|
|
docker_hosts: "'docker' in proxmox_name"
|
|
pihole: "'pihole' in proxmox_name"
|
|
|
|
# Host variables from Proxmox
|
|
compose:
|
|
ansible_host: proxmox_agent_interfaces[0].ip-addresses[0].ip-address | default(proxmox_name)
|
|
ansible_user: "'ubuntu'"
|
|
proxmox_vmid: proxmox_vmid
|
|
proxmox_node: proxmox_node
|
|
```
|
|
|
|
### Enable in ansible.cfg
|
|
|
|
```ini
|
|
[inventory]
|
|
enable_plugins = community.general.proxmox, yaml, ini
|
|
```
|
|
|
|
## Testing Inventory
|
|
|
|
```bash
|
|
# List all hosts
|
|
ansible-inventory -i inventory/proxmox.yml --list
|
|
|
|
# Graph view
|
|
ansible-inventory -i inventory/proxmox.yml --graph
|
|
|
|
# Specific host details
|
|
ansible-inventory -i inventory/proxmox.yml --host myvm
|
|
```
|
|
|
|
## Common Patterns
|
|
|
|
### Filter by Tags
|
|
|
|
Proxmox 7+ supports VM tags:
|
|
|
|
```yaml
|
|
groups:
|
|
webservers: "'web' in proxmox_tags"
|
|
databases: "'db' in proxmox_tags"
|
|
production: "'prod' in proxmox_tags"
|
|
```
|
|
|
|
### Filter by VMID Range
|
|
|
|
```yaml
|
|
filters:
|
|
- vmid >= 200
|
|
- vmid < 300
|
|
|
|
groups:
|
|
dev_vms: proxmox_vmid >= 200 and proxmox_vmid < 300
|
|
prod_vms: proxmox_vmid >= 300 and proxmox_vmid < 400
|
|
```
|
|
|
|
### IP Address from QEMU Agent
|
|
|
|
Requires QEMU guest agent running in VM:
|
|
|
|
```yaml
|
|
compose:
|
|
# Primary IP from agent
|
|
ansible_host: >-
|
|
proxmox_agent_interfaces
|
|
| selectattr('name', 'equalto', 'eth0')
|
|
| map(attribute='ip-addresses')
|
|
| flatten
|
|
| selectattr('ip-address-type', 'equalto', 'ipv4')
|
|
| map(attribute='ip-address')
|
|
| first
|
|
| default(proxmox_name)
|
|
```
|
|
|
|
### Static + Dynamic Inventory
|
|
|
|
Combine with static inventory:
|
|
|
|
```bash
|
|
# inventory/
|
|
# static.yml # Static hosts
|
|
# proxmox.yml # Dynamic from Proxmox
|
|
|
|
ansible-playbook -i inventory/ playbook.yml
|
|
```
|
|
|
|
## Available Variables
|
|
|
|
Variables populated from Proxmox API:
|
|
|
|
| Variable | Description |
|
|
|----------|-------------|
|
|
| proxmox_vmid | VM/container ID |
|
|
| proxmox_name | VM/container name |
|
|
| proxmox_type | "qemu" or "lxc" |
|
|
| proxmox_status | running, stopped, etc. |
|
|
| proxmox_node | Proxmox node name |
|
|
| proxmox_pool | Resource pool (if any) |
|
|
| proxmox_tags | Tags (Proxmox 7+) |
|
|
| proxmox_template | Is template (bool) |
|
|
| proxmox_agent | QEMU agent enabled (bool) |
|
|
| proxmox_agent_interfaces | Network info from agent |
|
|
| proxmox_cpus | CPU count |
|
|
| proxmox_maxmem | Max memory bytes |
|
|
| proxmox_maxdisk | Max disk bytes |
|
|
|
|
## Caching
|
|
|
|
Enable caching for faster inventory:
|
|
|
|
```yaml
|
|
plugin: community.general.proxmox
|
|
# ... auth ...
|
|
|
|
cache: true
|
|
cache_plugin: jsonfile
|
|
cache_connection: /tmp/ansible_proxmox_cache
|
|
cache_timeout: 300 # 5 minutes
|
|
```
|
|
|
|
Clear cache:
|
|
```bash
|
|
rm -rf /tmp/ansible_proxmox_cache
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### No hosts returned
|
|
|
|
1. Check API connectivity:
|
|
```bash
|
|
curl -k "https://proxmox:8006/api2/json/cluster/resources" \
|
|
-H "Authorization: PVEAPIToken=ansible@pve!mytoken=secret"
|
|
```
|
|
|
|
2. Check filters aren't too restrictive - try removing them
|
|
|
|
3. Verify token permissions include `VM.Audit`
|
|
|
|
### QEMU agent data missing
|
|
|
|
- Agent must be installed and running in guest
|
|
- `want_facts: true` must be set
|
|
- May take a few seconds after VM boot
|
|
|
|
### Slow inventory queries
|
|
|
|
- Enable caching (see above)
|
|
- Use filters to reduce results
|
|
- Avoid `want_facts: true` if not needed
|