#!/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 "$@"