first commit
This commit is contained in:
95
Jenkinsfile
vendored
Normal file
95
Jenkinsfile
vendored
Normal file
@@ -0,0 +1,95 @@
|
||||
pipeline {
|
||||
agent any
|
||||
|
||||
parameters {
|
||||
choice(
|
||||
name: 'PLAYBOOK',
|
||||
choices: ['dockerUpdate.yml', 'dockerPrune.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)'
|
||||
)
|
||||
}
|
||||
|
||||
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 dockerPlaybooks = ['dockerUpdate.yml', 'dockerPrune.yaml']
|
||||
def isDockerPlaybook = params.PLAYBOOK in dockerPlaybooks
|
||||
|
||||
// Build the limit flag
|
||||
def limitValue = ''
|
||||
if (isDockerPlaybook) {
|
||||
// Docker playbooks always target 'docker' tagged hosts
|
||||
// If user provides a limit, use intersection (docker AND limit)
|
||||
limitValue = params.LIMIT ? "docker:&${params.LIMIT}" : 'docker'
|
||||
} else {
|
||||
limitValue = params.LIMIT ?: ''
|
||||
}
|
||||
|
||||
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}'"
|
||||
if (isDockerPlaybook) {
|
||||
echo "Docker playbook detected - targeting hosts with 'docker' tag"
|
||||
}
|
||||
|
||||
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"
|
||||
}
|
||||
}
|
||||
}
|
||||
22
README.md
Normal file
22
README.md
Normal file
@@ -0,0 +1,22 @@
|
||||
# Infrastructure
|
||||
Master Node runs on Plex VM
|
||||
|
||||
# Example Commands
|
||||
`ansible VMs -m ping`
|
||||
This runs the ping module on all hosts in the VMs group
|
||||
|
||||
`ansible vpn -m ping`
|
||||
Runs the ping module on the host named vpn
|
||||
|
||||
`ansible vpn -m ansible.builtin.copy -a "src=/home/jerick/plex/docker-compose.yml dest=/home/jerick/"`
|
||||
Copied the Plex docker-compose file from plex to vpn
|
||||
|
||||
`ansible-playbook update.yaml -kK`
|
||||
Runs the update.yml playbook
|
||||
|
||||
/etc/ansible for app directory
|
||||
|
||||
|
||||
#update.yaml
|
||||
ansible-playbook -i inventories/inventory.linux.proxmox.yml update.yaml -kK
|
||||
this will update all runningVMs and LXCs with the linux tag
|
||||
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'
|
||||
11
playbooks/dockerPrune.yaml
Normal file
11
playbooks/dockerPrune.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
- hosts: VMs
|
||||
gather_facts: no
|
||||
tasks:
|
||||
- name: Prune all unused containers, images, networks, volumes
|
||||
community.docker.docker_prune:
|
||||
containers: true
|
||||
images: true
|
||||
networks: true
|
||||
volumes: true
|
||||
builder_cache: true
|
||||
|
||||
57
playbooks/dockerUpdate.yml
Normal file
57
playbooks/dockerUpdate.yml
Normal file
@@ -0,0 +1,57 @@
|
||||
# Use with: ansible-playbook -i inventories/inventory.proxmox.yml playbooks/dockerUpdate.yml --limit docker_hosts
|
||||
- name: Update Docker containers for media-app
|
||||
hosts: media-app
|
||||
tasks:
|
||||
- name: Pull new images for all services
|
||||
community.docker.docker_compose_v2:
|
||||
project_src: "{{ item.directory }}"
|
||||
state: present
|
||||
loop:
|
||||
- { directory: "/home/jerick/audiobookshelf" }
|
||||
- { directory: "/home/jerick/authelia" }
|
||||
- { directory: "/home/jerick/bazarr" }
|
||||
- { directory: "/home/jerick/firefly3" }
|
||||
- { directory: "/home/jerick/gitea" }
|
||||
- { directory: "/home/jerick/gotify" }
|
||||
- { directory: "/home/jerick/it-tools" }
|
||||
- { directory: "/home/jerick/joplin" }
|
||||
- { directory: "/home/jerick/nginxproxy" }
|
||||
- { directory: "/home/jerick/ombi" }
|
||||
- { directory: "/home/jerick/picoshare" }
|
||||
- { directory: "/home/jerick/romM" }
|
||||
- { directory: "/home/jerick/tandoor_recipes" }
|
||||
- { directory: "/home/jerick/tautulli" }
|
||||
- { directory: "/home/jerick/watchtower" }
|
||||
- { directory: "/home/jerick/immich" }
|
||||
|
||||
- name: Update Docker containers for media-management
|
||||
hosts: media-management
|
||||
tasks:
|
||||
- name: Pull new images for all services
|
||||
community.docker.docker_compose_v2:
|
||||
project_src: "{{ item.directory }}"
|
||||
state: present
|
||||
loop:
|
||||
- { directory: "/home/jerick/docker" }
|
||||
|
||||
- name: Update Docker containers for plex
|
||||
hosts: plex
|
||||
tasks:
|
||||
- name: Pull new images for all services
|
||||
community.docker.docker_compose_v2:
|
||||
project_src: "{{ item.directory }}"
|
||||
state: present
|
||||
loop:
|
||||
- { directory: "/home/jerick/plex" }
|
||||
- { directory: "/home/jerick/plexAutoLanguages" }
|
||||
|
||||
- name: Cleanup
|
||||
hosts: docker_hosts
|
||||
tasks:
|
||||
- name: Prune Docker Images, Networks, etc
|
||||
community.docker.docker_prune:
|
||||
containers: true
|
||||
images: true
|
||||
networks: true
|
||||
volumes: true
|
||||
builder_cache: true
|
||||
Reference in New Issue
Block a user