pipeline { agent any parameters { string( name: 'LIMIT', defaultValue: '', description: 'Target host(s)/group(s), e.g. "vms", "lxcs", "docker_hosts", "kubernetes", "update_targets", or a hostname (no .lan required). Leave blank to run against all machines.' ) booleanParam( name: 'DRY_RUN', defaultValue: false, description: 'Run in check mode (no changes made)' ) } environment { PROXMOX_URL = 'https://192.168.0.166:8006' PROXMOX_USER = 'dynamic-inventory@pve' PROXMOX_TOKEN_ID = 'dynamic-inventory' PROXMOX_TOKEN_SECRET = credentials('PROXMOX_TOKEN_SECRET') ANSIBLE_HOST_KEY_CHECKING = 'False' } stages { stage('Checkout') { steps { checkout scm } } stage('Verify Inventory') { steps { sh ''' echo "Testing dynamic inventory connection..." ansible-inventory -i inventories/inventory.proxmox.yml --list | head -10 ''' } } stage('Run Playbook') { steps { script { def limitFlag = params.LIMIT ? "--limit '${params.LIMIT}'" : '' def checkFlag = params.DRY_RUN ? '--check --diff' : '' echo "Limit: '${params.LIMIT ?: 'all'}'" echo "Dry run: ${params.DRY_RUN}" sh """ ansible-playbook \ -i inventories/inventory.proxmox.yml \ site.yml \ ${limitFlag} \ ${checkFlag} """ } } } } post { success { echo "site.yml completed successfully (limit: ${params.LIMIT ?: 'all'})" } failure { echo "site.yml failed (limit: ${params.LIMIT ?: 'all'})" } } }