first commit
This commit is contained in:
91
Jenkinsfile
vendored
Normal file
91
Jenkinsfile
vendored
Normal file
@@ -0,0 +1,91 @@
|
||||
pipeline {
|
||||
agent any
|
||||
|
||||
parameters {
|
||||
choice(
|
||||
name: 'PLAYBOOK',
|
||||
choices: ['update.yaml', 'snapshotAndUpdate.yaml', 'dockerUpdate.yml', 'dockerPrune.yaml', 'newMachine.yaml'],
|
||||
description: 'Select the playbook to run'
|
||||
)
|
||||
string(
|
||||
name: 'LIMIT',
|
||||
defaultValue: '',
|
||||
description: 'Limit to specific hosts or groups (e.g., "vms", "lxcs", "update_targets", or hostname) no.lan required'
|
||||
)
|
||||
booleanParam(
|
||||
name: 'DRY_RUN',
|
||||
defaultValue: false,
|
||||
description: 'Run in check mode (no changes made)'
|
||||
)
|
||||
booleanParam(
|
||||
name: 'CLEANUP_SNAPSHOTS',
|
||||
defaultValue: false,
|
||||
description: 'Remove snapshots after successful update (only for snapshotAndUpdate.yaml)'
|
||||
)
|
||||
}
|
||||
|
||||
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 {
|
||||
// Set default limits based on playbook if not specified
|
||||
def limitValue = params.LIMIT
|
||||
if (!params.LIMIT) {
|
||||
if (params.PLAYBOOK in ['dockerUpdate.yml', 'dockerPrune.yaml']) {
|
||||
limitValue = 'docker_hosts'
|
||||
}
|
||||
}
|
||||
def limitFlag = limitValue ? "--limit '${limitValue}'" : ''
|
||||
def checkFlag = (params.DRY_RUN == true) ? '--check --diff' : ''
|
||||
def extraVars = (params.CLEANUP_SNAPSHOTS == true) ? "-e cleanup_old_snapshots=true" : ''
|
||||
|
||||
echo "DRY_RUN parameter: ${params.DRY_RUN}"
|
||||
echo "Check flag: '${checkFlag}'"
|
||||
echo "Limit: '${limitValue}'"
|
||||
|
||||
sh """
|
||||
ansible-playbook \
|
||||
-i inventories/inventory.proxmox.yml \
|
||||
playbooks/${params.PLAYBOOK} \
|
||||
${limitFlag} \
|
||||
${checkFlag} \
|
||||
${extraVars} \
|
||||
-v
|
||||
"""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
post {
|
||||
success {
|
||||
echo "Playbook ${params.PLAYBOOK} completed successfully"
|
||||
}
|
||||
failure {
|
||||
echo "Playbook ${params.PLAYBOOK} failed"
|
||||
}
|
||||
}
|
||||
}
|
||||
96
README.md
Normal file
96
README.md
Normal file
@@ -0,0 +1,96 @@
|
||||
# Proxmox OS Update
|
||||
|
||||
Ansible-based automation for managing and updating virtual machines and LXC containers on a Proxmox hypervisor. Uses Jenkins as a CI/CD orchestrator to execute playbooks for various maintenance tasks.
|
||||
|
||||
## Features
|
||||
|
||||
- **Dynamic Inventory**: Automatically discovers running VMs and LXCs from the Proxmox API
|
||||
- **Tag-Based Targeting**: Group machines by Proxmox tags (update, docker, k8s)
|
||||
- **CI/CD Integration**: Jenkins pipeline for scheduled and on-demand execution
|
||||
- **Dry-Run Mode**: Test changes before applying them
|
||||
- **Flexible Targeting**: Update specific hosts, groups, or all running machines
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
proxmox-os-update/
|
||||
├── Jenkinsfile # CI/CD pipeline configuration
|
||||
├── README.md
|
||||
├── inventories/
|
||||
│ └── inventory.proxmox.yml # Dynamic Proxmox inventory
|
||||
└── playbooks/
|
||||
└── update.yaml # System update playbook
|
||||
```
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Ansible with `community.proxmox` collection
|
||||
- Proxmox VE cluster with API token configured
|
||||
- SSH access to target machines (as `jenkins` user)
|
||||
- Jenkins server (for CI/CD execution)
|
||||
|
||||
## Configuration
|
||||
|
||||
### Proxmox API Token
|
||||
|
||||
Create an API token in Proxmox for the `dynamic-inventory@pve` user. The token credentials should be stored in Jenkins.
|
||||
|
||||
### Inventory Groups
|
||||
|
||||
The dynamic inventory automatically creates these groups:
|
||||
|
||||
| Group | Description |
|
||||
|-------|-------------|
|
||||
| `proxmox_all_running` | All running VMs and LXCs |
|
||||
| `vms` | QEMU virtual machines |
|
||||
| `lxcs` | LXC containers |
|
||||
| `update_targets` | Machines tagged with 'update' |
|
||||
| `docker_hosts` | Machines tagged with 'docker' |
|
||||
| `kubernetes` | Machines tagged with 'k8s' |
|
||||
|
||||
## Usage
|
||||
|
||||
### Via Jenkins (Recommended)
|
||||
|
||||
Trigger the Jenkins pipeline and select:
|
||||
- **Playbook**: Which playbook to run
|
||||
- **Limit**: Target specific hosts or groups (optional)
|
||||
- **Dry Run**: Test without applying changes
|
||||
|
||||
### Manual Execution
|
||||
|
||||
```bash
|
||||
# Update all running machines
|
||||
ansible-playbook -i inventories/inventory.proxmox.yml playbooks/update.yaml
|
||||
|
||||
# Target specific group
|
||||
ansible-playbook -i inventories/inventory.proxmox.yml playbooks/update.yaml --limit docker_hosts
|
||||
|
||||
# Dry run
|
||||
ansible-playbook -i inventories/inventory.proxmox.yml playbooks/update.yaml --check --diff
|
||||
```
|
||||
|
||||
### Ad-hoc Commands
|
||||
|
||||
```bash
|
||||
# Test connectivity to all VMs
|
||||
ansible -i inventories/inventory.proxmox.yml vms -m ping
|
||||
|
||||
# Test connectivity to a specific host
|
||||
ansible -i inventories/inventory.proxmox.yml hostname -m ping
|
||||
```
|
||||
|
||||
## Available Playbooks
|
||||
|
||||
| Playbook | Description |
|
||||
|----------|-------------|
|
||||
| `update.yaml` | Updates apt cache and performs dist-upgrade |
|
||||
|
||||
## Environment Variables
|
||||
|
||||
| Variable | Description |
|
||||
|----------|-------------|
|
||||
| `PROXMOX_URL` | Proxmox API endpoint |
|
||||
| `PROXMOX_USER` | API username |
|
||||
| `PROXMOX_TOKEN_ID` | API token ID |
|
||||
| `PROXMOX_TOKEN_SECRET` | API token secret |
|
||||
25
inventories/inventory.proxmox.yml
Normal file
25
inventories/inventory.proxmox.yml
Normal file
@@ -0,0 +1,25 @@
|
||||
# Proxmox Dynamic Inventory
|
||||
# Requires PROXMOX_TOKEN_SECRET environment variable to be set
|
||||
plugin: community.proxmox.proxmox
|
||||
url: https://192.168.0.166:8006
|
||||
user: dynamic-inventory@pve
|
||||
token_id: dynamic-inventory
|
||||
validate_certs: false
|
||||
want_facts: true
|
||||
|
||||
# Filter to only running machines
|
||||
filters:
|
||||
- proxmox_status == 'running'
|
||||
|
||||
# Group by Proxmox tags and type
|
||||
groups:
|
||||
vms: "'qemu' in proxmox_type"
|
||||
lxcs: "'lxc' in proxmox_type"
|
||||
# Tag-based groups - add tags in Proxmox to auto-group
|
||||
update_targets: "'update' in (proxmox_tags | default([]))"
|
||||
docker_hosts: "'docker' in (proxmox_tags | default([]))"
|
||||
kubernetes: "'k8s' in (proxmox_tags | default([]))"
|
||||
|
||||
compose:
|
||||
ansible_host: name + '.lan'
|
||||
ansible_user: 'jenkins'
|
||||
28
playbooks/update.yaml
Normal file
28
playbooks/update.yaml
Normal file
@@ -0,0 +1,28 @@
|
||||
#ansible-playbook -i ../inventories/inventory.proxmox.yml update.yaml -kK
|
||||
- name: Update all VMs
|
||||
hosts: proxmox_all_running
|
||||
|
||||
tasks:
|
||||
# - name: Run Agent Uninstall
|
||||
# include_tasks: zabbix/zabbixAgentUninstall.yml
|
||||
- name: Update apt cache
|
||||
become: true
|
||||
apt:
|
||||
update_cache: yes
|
||||
cache_valid_time: 3600
|
||||
- name: Upgrade all apt packages
|
||||
apt:
|
||||
force_apt_get: yes
|
||||
upgrade: dist
|
||||
become: yes
|
||||
|
||||
# - name: Install Zabbix Agent on servers
|
||||
# hosts: proxmox_all_running
|
||||
# become: yes
|
||||
# tasks:
|
||||
# - name: Run Debian Agent Install
|
||||
# include_tasks: zabbix/zabbixDebianAgentInstall.yml
|
||||
# when: ansible_distribution == "Debian"
|
||||
# - name: Run Ubuntu Agent Install
|
||||
# include_tasks: zabbix/zabbixUbuntuAgentInstall.yml
|
||||
# when: ansible_distribution == "Ubuntu"
|
||||
Reference in New Issue
Block a user