161 lines
3.9 KiB
Bash
Executable File
161 lines
3.9 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Ansible Integration Library
|
|
# Provides helpers for Ansible operations
|
|
#
|
|
|
|
# Source common library
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
# shellcheck source=./common.sh
|
|
source "${SCRIPT_DIR}/common.sh"
|
|
|
|
# Default Ansible paths
|
|
readonly ANSIBLE_DIR="${ANSIBLE_DIR:-${SCRIPT_DIR}/../../ansible}"
|
|
readonly ANSIBLE_INVENTORY="${ANSIBLE_INVENTORY:-${ANSIBLE_DIR}/inventory/production.yml}"
|
|
readonly ANSIBLE_PLAYBOOK_DIR="${ANSIBLE_PLAYBOOK_DIR:-${ANSIBLE_DIR}/playbooks}"
|
|
|
|
# Check Ansible installation
|
|
check_ansible() {
|
|
log_step "Checking Ansible installation..."
|
|
|
|
require_command "ansible" "sudo apt install ansible" || return 1
|
|
require_command "ansible-playbook" || return 1
|
|
|
|
local version
|
|
version=$(ansible --version | head -1)
|
|
log_success "Ansible installed: $version"
|
|
}
|
|
|
|
# Test Ansible connectivity
|
|
test_ansible_connectivity() {
|
|
local inventory="${1:-$ANSIBLE_INVENTORY}"
|
|
|
|
log_step "Testing Ansible connectivity..."
|
|
|
|
if ! ansible all -i "$inventory" -m ping &> /dev/null; then
|
|
log_error "Cannot connect to production server"
|
|
log_info "Check:"
|
|
log_info " - SSH key: ~/.ssh/production"
|
|
log_info " - Network connectivity"
|
|
log_info " - Server availability"
|
|
return 1
|
|
fi
|
|
|
|
log_success "Connection successful"
|
|
return 0
|
|
}
|
|
|
|
# Run Ansible playbook
|
|
run_ansible_playbook() {
|
|
local playbook="$1"
|
|
shift
|
|
local extra_args=("$@")
|
|
|
|
log_step "Running Ansible playbook: $(basename "$playbook")"
|
|
|
|
# Build command
|
|
local cmd="ansible-playbook -i ${ANSIBLE_INVENTORY} ${playbook}"
|
|
|
|
# Add extra args
|
|
if [[ ${#extra_args[@]} -gt 0 ]]; then
|
|
cmd="${cmd} ${extra_args[*]}"
|
|
fi
|
|
|
|
log_debug "Command: $cmd"
|
|
|
|
# Execute with proper error handling
|
|
if eval "$cmd"; then
|
|
log_success "Playbook completed successfully"
|
|
return 0
|
|
else
|
|
local exit_code=$?
|
|
log_error "Playbook failed with exit code $exit_code"
|
|
return $exit_code
|
|
fi
|
|
}
|
|
|
|
# Run deployment playbook
|
|
run_deployment() {
|
|
local git_repo_url="${1:-}"
|
|
local playbook="${ANSIBLE_PLAYBOOK_DIR}/deploy.yml"
|
|
|
|
if [[ ! -f "$playbook" ]]; then
|
|
log_error "Deployment playbook not found: $playbook"
|
|
return 1
|
|
fi
|
|
|
|
log_step "Starting deployment..."
|
|
|
|
local extra_args=()
|
|
if [[ -n "$git_repo_url" ]]; then
|
|
extra_args+=("-e" "git_repo_url=${git_repo_url}")
|
|
log_info "Git repository: $git_repo_url"
|
|
else
|
|
log_info "Using existing code on server"
|
|
fi
|
|
|
|
run_ansible_playbook "$playbook" "${extra_args[@]}"
|
|
}
|
|
|
|
# Get Ansible facts
|
|
get_ansible_facts() {
|
|
local inventory="${1:-$ANSIBLE_INVENTORY}"
|
|
local host="${2:-production_server}"
|
|
|
|
ansible "$host" -i "$inventory" -m setup
|
|
}
|
|
|
|
# Ansible dry-run
|
|
ansible_dry_run() {
|
|
local playbook="$1"
|
|
shift
|
|
local extra_args=("$@")
|
|
|
|
log_step "Running dry-run (check mode)..."
|
|
|
|
extra_args+=("--check" "--diff")
|
|
|
|
run_ansible_playbook "$playbook" "${extra_args[@]}"
|
|
}
|
|
|
|
# List Ansible hosts
|
|
list_ansible_hosts() {
|
|
local inventory="${1:-$ANSIBLE_INVENTORY}"
|
|
|
|
log_step "Listing Ansible hosts..."
|
|
|
|
ansible-inventory -i "$inventory" --list
|
|
}
|
|
|
|
# Check playbook syntax
|
|
check_playbook_syntax() {
|
|
local playbook="$1"
|
|
|
|
log_step "Checking playbook syntax..."
|
|
|
|
if ansible-playbook --syntax-check "$playbook" &> /dev/null; then
|
|
log_success "Syntax check passed"
|
|
return 0
|
|
else
|
|
log_error "Syntax check failed"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Execute Ansible ad-hoc command
|
|
ansible_adhoc() {
|
|
local host="$1"
|
|
local module="$2"
|
|
shift 2
|
|
local args=("$@")
|
|
|
|
log_step "Running ad-hoc command on $host..."
|
|
|
|
ansible "$host" -i "$ANSIBLE_INVENTORY" -m "$module" -a "${args[*]}"
|
|
}
|
|
|
|
# Export functions
|
|
export -f check_ansible test_ansible_connectivity run_ansible_playbook
|
|
export -f run_deployment get_ansible_facts ansible_dry_run
|
|
export -f list_ansible_hosts check_playbook_syntax ansible_adhoc
|