pipeline { agent any // Define parameters parameters { string(name: 'host_ip', description: 'Target System Address') string(name: 'new_hostname', defaultValue: 'vm-party-host', description: 'Update Hostname') booleanParam(name: 'update_party', defaultValue: false, description: 'Only update VM Party service') booleanParam(name: 'service_only', defaultValue: false, description: 'Only update VM Party python code') booleanParam(name: 'autologin', defaultValue: true, description: 'Enable autologin with stats on screen') } environment { safe_subnet = true ANSIBLE_FORCE_COLOR = '1' cosmos_password = credentials('cosmos_password') cosmos_root_password = credentials('cosmos_root_password') vm_party_username_password = credentials('vm_party_username_password') matt_public_key = credentials('matt_public_key') jenkins_public_key = credentials('jenkins_public_key') } options { ansiColor('xterm') } stages { stage('Initialize Environment') { steps { script { // Get the current date (in a consistent format) and hash it def date = sh(script: "date +%Y-%m-%dT%H:%M:%S", returnStdout: true).trim() def hash = sh(script: "echo -n '${date}' | sha256sum | cut -c1-8", returnStdout: true).trim() // Set it as an environment variable env.STAGE_TWO_HASH = hash } // Generate the dynamic inventory files sh """ set +x jenkins_group=\$(echo ${env.BUILD_USER_GROUPS} | sed 's/,/\\n/g' | grep -v \$SERVER_SUBNET_GROUP | grep Jenkins | head -n 1) jenkins_subnet_group=\$(echo ${env.BUILD_USER_GROUPS} | sed 's/,/\\n/g' | grep -e authenticated -e \$SERVER_SUBNET_GROUP | sort -rf | head -n 1) jenkins_user=\$(echo ${env.BUILD_USER}) cd /var/jenkins_home/ansible chmod +x /var/jenkins_home/ansible/inventory/inventory.sh playbook_file="/var/jenkins_home/ansible/playbooks/vm_party.yaml set -x /var/jenkins_home/ansible/inventory/inventory.sh -p \$playbook_file -s -a \$jenkins_subnet_group -g \$jenkins_group -u \$jenkins_user -i ${params.host_ip} echo Stage Two Hash: ${env.STAGE_TWO_HASH} """ } } stage('Ansible Playbook Stage One') { when { expression { env.safe_subnet } } steps { //Run the cosmos-base ansible playbook // /workspace/ansible/playbooks/cosmos-base.yaml sh """ set +x echo ${params.host_ip} hash=\$(echo -n ${params.host_ip} | md5sum | cut -c 1-8) inventory_file="/var/jenkins_home/ansible/.inv/inventory-\$hash.yml" playbook_file="/var/jenkins_home/ansible/playbooks/vm_party.yaml extra_vars=\$(echo " \ run_stage_two=false \ new_hostname=${params.new_hostname} \ autologin=${params.autologin} \ service_only=${params.service_only} \ update_party=${params.update_party} \ matt_public_key='${env.matt_public_key}' \ cosmos_password='${env.cosmos_password}' \ cosmos_root_password='${env.cosmos_root_password}' \ STAGE_TWO_HASH=${env.STAGE_TWO_HASH} \ vm_party_username_password=${env.vm_party_username_password} \ " | tr -s " " ) set -x cd /var/jenkins_home/ansible ansible-playbook -i \$inventory_file \$playbook_file \ --ssh-common-args='-o StrictHostKeyChecking=no' \ --extra-vars "\$extra_vars" """ } } stage('Ansible Playbook Stage Two') { // Skip stage two when update_party is set when { expression { params.update_party != true && env.safe_subnet } } steps { script { echo "Sleep 5 seconds..." sleep(5) echo "Waiting for reboot" def ip = sh(script: "cat /var/jenkins_home/ansible/.inv/inventory-${env.STAGE_TWO_HASH}.yml | grep stage_two_ip | cut -d ':' -f 2", returnStdout: true).trim() echo "Detected IP: ${ip}" def timeoutSeconds = 300 // Total timeout: 5 minutes def waitInterval = 5 // Wait 5 seconds between pings def startTime = System.currentTimeMillis() def responded = false while ((System.currentTimeMillis() - startTime) < (timeoutSeconds * 1000)) { def status = sh(script: "ping -c 1 ${ip}", returnStatus: true) if (status == 0) { responded = true echo "IP ${ip} is now responding to ping." break } // echo "Waiting for ${ip} to respond to ping..." sleep(waitInterval) } } // Run the stage two playbook // using the hash sh """ set +x inventory_file="/var/jenkins_home/ansible/.inv/inventory-${env.STAGE_TWO_HASH}.yml" playbook_file="/var/jenkins_home/ansible/playbooks/vm_party.yaml" extra_vars="\$(echo " \ run_stage_two=true \ vm_party_username_password=${env.vm_party_username_password} \ service_only=${params.service_only} \ " | tr -s " " ) set -x cd /var/jenkins_home/ansible ansible-playbook -i \$inventory_file \$playbook_file \ --ssh-common-args='-o StrictHostKeyChecking=no' \ --extra-vars "\$extra_vars" """ } } } post { always { // Remove dynamic Inventory files sh """ set +x hash=\$(echo -n "${params.host_ip}" | md5sum | cut -c 1-8) inventory_file_1="/var/jenkins_home/ansible/.inv/inventory-\$hash.yml" inventory_file_2="/var/jenkins_home/ansible/.inv/inventory-${env.STAGE_TWO_HASH}.yml" set -x rm \$inventory_file_1 || true rm \$inventory_file_2 || true """ } } }