Proxmox dynamic inventory for Ansible. Based on original plugin from Mathieu Gauthier-Lafaye
It will generate an inventory on the fly with all your VMs stored in your ProxmoxVE. Therefore, Ansible will be able to connect to all your VM.
Resolvable VM AND CT names: the inventory script collects the VM/CT names (and not IP addresses!). That's why your computer must be able to resolve these names; either with the DNS server or your /etc/hosts
Update: IP detection has been implemented (quemu-agent is required). When the VMs have multiple ethernet interfaces, it is possible to include/exclude the interfaces you want.
- ProxmoxVE cluster: if your have a ProxmoxVE cluster, it will gather the whole VM list from your cluster
- Advanced filtering: you can filter the VM list based in their status or a custom tag included in the
Notes
field - Authenticate witch PVE API Token: instead of using username and password, you can use the username together with the PVE API Token
Download proxmox.py to /etc/ansible/ directory:
cd /etc/ansible
sudo wget https://github.com/xezpeleta/Ansible-Proxmox-inventory/raw/master/proxmox.py
sudo chmod +x proxmox.py
Let's test it:
python /etc/ansible/proxmox.py \
--url=https://<your-proxmox-url>:8006/ \
--username=<proxmox-username> \
--password=<proxmox-password> \
--trust-invalid-certs \
--list --pretty
Alternative configuration with PVE API Token:
python /etc/ansible/proxmox.py \
--url=https://<your-proxmox-url>:8006/ \
--username=<proxmox-username> \
--token=<api-token-name> \
--secret=<api-token-secret> \
--trust-invalid-certs \
--list --pretty
If you get a list with all the VM in your Proxmox cluster, everything is ok.
I suggest you to use environment variables to store Proxmox credentials:
# You also can do that using the file setenv.sh
# Run the command: "source setenv.sh"
export PROXMOX_URL=https://10.0.0.1:8006/
export PROXMOX_USERNAME=apiuser@pve
export PROXMOX_PASSWORD=apiuser1234
export PROXMOX_INVALID_CERT=False
Alternative configuration with PVE API Token:
# You also can do that using the file setenv.sh
# Run the command: "source setenv.sh"
export PROXMOX_URL=https://10.0.0.1:8006/
export PROXMOX_USERNAME=apiuser@pve
export PROXMOX_INVALID_CERT=False
export PROXMOX_TOKEN=api_token_name
export PROXMOX_SECRET=api_token_secret
You may also save your settings in a JSON file with the same name of the Python script, in its same folder (e.g.: if the downloaded script is /etc/ansible/proxmox.py
, the configuration file will be /etc/ansible/proxmox.json
):
{
"url": "https://10.0.0.1:8006/",
"username": "apiuser@pve",
"password": "apiuser1234",
"validateCert": false,
"include": [".*"],
"exclude": []
}
Alternative configuration with PVE API Token:
{
"url": "https://10.0.0.1:8006/",
"username": "apiuser@pve",
"validateCert": false,
"include": [".*"],
"exclude": [],
"token": "api-token-name",
"secret": "api-token-secret"
}
So now you can check it again without credential parameters:
python /etc/ansible/proxmox.py --list --pretty
Once you get this working, you can include the dynamic inventory in your ansible commands:
# Ping: connect to all VM in Proxmox using root user
ansible -i /etc/ansible/proxmox.py all -m ping -u root
If you prefer, you can limit the commands to the group "running":
# Run a playbook in every running VM in Proxmox
ansible-playbook -i /etc/ansible/proxmox.py --limit='running' playbook-example/playbook.yml
Thanks to Matt Harris, you can now use the Notes field in Proxmox to add a host to a group:
Added support for Proxmox VE 4.x Added support for using the Notes field of a VM to define groups and variables: A well-formatted JSON object in the Notes field will be added to the _meta section for that VM. In addition, the "groups" key of this JSON object may be used to specify group membership:
{ "groups": ["utility", "databases"], "a": false, "b": true }
For instance, you can use the following JSON code in a VM host:
{ "groups": ["windows"] }
So if you want to exclude Windows machines, you could do the following:
# Run a playbook in every running Linux machine in Proxmox
ansible-playbook -i /etc/ansible/proxmox.py --limit='running,!windows' playbook-example/playbook.yml
You can also pass regex filters for the network interfaces to use on your VM hosts.
# Ignore any docker network interfaces when determining the IP address
python proxmox.py --list --exclude "docker.*"
You can pass multiple parameters of either exclude or include but you cannot use both include and exclude in a single run. These parameters can also be configured in the config file or through and ENV separated by a ;
export EXCLUDE_LIST="docker.*;veth.*"
ansible all -i /etc/ansible/proxmox.py --limit 'running,!windows' -m setup -u root -a 'filter=ansible_distribution_*'
Check more info about Ansible setup module