ansbile全生命周期脚本

#!/usr/bin/env bash
#
# 通用 Ansible 全生命周期管理脚本
# 支持安装、检测、升级、卸载
# 支持多种系统和安装方式 (yum/apt/pip/source)
# 可指定版本与安装目录

set -e

# 默认参数
ANSIBLE_VERSION=${1:-2.9.27}
ACTION=${2:-install}     # install|upgrade|uninstall|check
INSTALL_METHOD=${3:-auto}  # auto|yum|apt|pip|source
INSTALL_DIR=${4:-/usr/local/ansible}
LOG_FILE="/tmp/ansible_manager.log"

echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "🔧 Ansible 管理脚本"
echo "📦 版本: ${ANSIBLE_VERSION} | 操作: ${ACTION} | 方式: ${INSTALL_METHOD}"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "日志文件: $LOG_FILE"
echo ""


#-----------------------------------
# 检测系统类型
#-----------------------------------
detect_os() {
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        OS_ID=$ID
    else
        echo "[ERROR] 无法检测系统类型" | tee -a "$LOG_FILE"
        exit 1
    fi
    echo "[INFO] 系统类型: $OS_ID" | tee -a "$LOG_FILE"
}

#-----------------------------------
# 安装依赖
#-----------------------------------
install_deps() {
    echo "[INFO] 安装依赖..." | tee -a "$LOG_FILE"
    case "$OS_ID" in
        ubuntu|debian)
            sudo apt update -y
            sudo apt install -y python3 python3-pip python3-venv git curl build-essential
            ;;
        centos|rocky|almalinux|openEuler|rhel)
            sudo yum install -y python3 python3-pip git gcc make curl
            ;;
        *)
            echo "[WARN] 未识别的系统,尝试使用 pip 依赖" | tee -a "$LOG_FILE"
            ;;
    esac
}

#-----------------------------------
# 检查已安装版本
#-----------------------------------
check_ansible() {
    if command -v ansible >/dev/null 2>&1; then
        local ver
        ver=$(ansible --version 2>/dev/null | head -n1 | awk '{print $2}')
        echo "[INFO] 当前 Ansible 版本: $ver" | tee -a "$LOG_FILE"
        return 0
    else
        echo "[INFO] 当前未安装 Ansible" | tee -a "$LOG_FILE"
        return 1
    fi
}

#-----------------------------------
# pip 安装
#-----------------------------------
install_by_pip() {
    echo "[INFO] 使用 pip 安装 ansible==${ANSIBLE_VERSION}" | tee -a "$LOG_FILE"
    if [ "$EUID" -eq 0 ]; then
        pip3 install "ansible==${ANSIBLE_VERSION}"
    else
        pip3 install --user "ansible==${ANSIBLE_VERSION}"
        export PATH="$HOME/.local/bin:$PATH"
        grep -q ".local/bin" ~/.bashrc || echo 'export PATH=$HOME/.local/bin:$PATH' >> ~/.bashrc
    fi
}

#-----------------------------------
# apt/yum 安装
#-----------------------------------
install_by_package() {
    echo "[INFO] 使用系统包管理器安装 ansible" | tee -a "$LOG_FILE"
    case "$OS_ID" in
        ubuntu|debian)
            sudo apt update -y
            sudo apt install -y ansible
            ;;
        centos|rocky|almalinux|openEuler|rhel)
            sudo yum install -y epel-release || true
            sudo yum install -y ansible
            ;;
        *)
            echo "[WARN] 无法使用包管理器,改用 pip" | tee -a "$LOG_FILE"
            install_by_pip
            ;;
    esac
}

#-----------------------------------
# 源码安装
#-----------------------------------
install_by_source() {
    echo "[INFO] 使用源码方式安装 ansible==${ANSIBLE_VERSION}" | tee -a "$LOG_FILE"
    TMP_DIR=$(mktemp -d)
    cd "$TMP_DIR"
    git clone https://github.com/ansible/ansible.git
    cd ansible
    git checkout "v${ANSIBLE_VERSION}" || { echo "[ERROR] 无法找到版本 v${ANSIBLE_VERSION}"; exit 1; }

    mkdir -p "$INSTALL_DIR"
    if [ "$EUID" -eq 0 ]; then
        python3 setup.py install --prefix="$INSTALL_DIR"
    else
        python3 setup.py install --prefix="$HOME/.local"
        export PATH="$HOME/.local/bin:$PATH"
        grep -q ".local/bin" ~/.bashrc || echo 'export PATH=$HOME/.local/bin:$PATH' >> ~/.bashrc
    fi
    echo "[INFO] 源码安装完成,目录: $INSTALL_DIR"
}

#-----------------------------------
# 自动选择安装方式
#-----------------------------------
auto_install() {
    case "$OS_ID" in
        ubuntu|debian|centos|rocky|almalinux|openEuler|rhel)
            install_by_package ;;
        *)
            install_by_pip ;;
    esac
}

#-----------------------------------
# 卸载 Ansible
#-----------------------------------
uninstall_ansible() {
    echo "[INFO] 正在卸载 Ansible..." | tee -a "$LOG_FILE"

    if command -v ansible >/dev/null 2>&1; then
        if pip3 show ansible >/dev/null 2>&1; then
            pip3 uninstall -y ansible
        fi

        sudo rm -rf /usr/local/bin/ansible* /usr/bin/ansible* /usr/local/lib/python*/site-packages/ansible*
        rm -rf ~/.local/lib/python*/site-packages/ansible*
        echo "[INFO] Ansible 已卸载" | tee -a "$LOG_FILE"
    else
        echo "[INFO] 系统中未发现 Ansible" | tee -a "$LOG_FILE"
    fi
}

#-----------------------------------
# 升级 Ansible
#-----------------------------------
upgrade_ansible() {
    echo "[INFO] 正在升级到 ansible==${ANSIBLE_VERSION}" | tee -a "$LOG_FILE"
    if pip3 show ansible >/dev/null 2>&1; then
        pip3 install --upgrade "ansible==${ANSIBLE_VERSION}"
    else
        echo "[WARN] 未通过 pip 安装,重新安装" | tee -a "$LOG_FILE"
        install_by_pip
    fi
}

#-----------------------------------
# 主流程
#-----------------------------------
main() {
    detect_os
    install_deps

    case "$ACTION" in
        check)
            check_ansible
            ;;
        install)
            if check_ansible; then
                echo "[INFO] 已安装,如需升级请执行: bash $0 ${ANSIBLE_VERSION} upgrade"
            else
                case "$INSTALL_METHOD" in
                    yum|apt) install_by_package ;;
                    pip) install_by_pip ;;
                    source) install_by_source ;;
                    auto) auto_install ;;
                    *) echo "[ERROR] 未知安装方式: $INSTALL_METHOD" && exit 1 ;;
                esac
            fi
            ;;
        upgrade)
            upgrade_ansible
            ;;
        uninstall)
            uninstall_ansible
            ;;
        *)
            echo "[ERROR] 未知操作: $ACTION"
            echo "用法: bash $0 [版本] [install|upgrade|uninstall|check] [方式] [目录]"
            exit 1
            ;;
    esac

    echo ""
    echo "✅ 操作完成: $ACTION"
    if command -v ansible >/dev/null 2>&1; then
        ansible --version | head -n1
    fi
}

main "$@"

 

posted on 2025-10-15 23:05  jun_li123  阅读(5)  评论(0)    收藏  举报

导航