#!/usr/bin/env bash
#
# 通用 Ansible 安装脚本
# 支持多种方式安装(yum/apt/pip/source)
# 支持 root 和 普通用户
# 支持自定义版本(默认 2.9.27)
set -e
ANSIBLE_VERSION=${1:-2.9.27} # 默认版本
INSTALL_METHOD=${2:-auto} # auto|yum|apt|pip|source
LOG_FILE="/tmp/install_ansible.log"
echo "[INFO] 开始安装 Ansible ${ANSIBLE_VERSION}" | tee -a "$LOG_FILE"
#-----------------------------
# 检测系统类型
#-----------------------------
detect_os() {
if [ -f /etc/os-release ]; then
. /etc/os-release
OS_ID=$ID
OS_VER=$VERSION_ID
else
echo "[ERROR] 无法检测系统类型"
exit 1
fi
echo "[INFO] 检测到系统: ${OS_ID} ${OS_VER}" | 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 build-essential git curl
;;
centos|rocky|almalinux|openEuler|rhel)
sudo yum install -y python3 python3-pip git gcc make curl
;;
*)
echo "[WARN] 未识别的系统,尝试使用 pip 安装依赖"
;;
esac
}
#-----------------------------
# 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
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"
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; }
if [ "$EUID" -eq 0 ]; then
python3 setup.py install
else
python3 setup.py install --user
export PATH=$HOME/.local/bin:$PATH
echo 'export PATH=$HOME/.local/bin:$PATH' >> ~/.bashrc
fi
}
#-----------------------------
# 自动选择安装方式
#-----------------------------
auto_install() {
case "$OS_ID" in
ubuntu|debian) install_by_package ;;
centos|rocky|almalinux|openEuler|rhel) install_by_package ;;
*) install_by_pip ;;
esac
}
#-----------------------------
# 主流程
#-----------------------------
main() {
detect_os
install_deps
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
echo "[INFO] Ansible 安装完成 ✅"
echo "[INFO] 当前版本:"
ansible --version | head -n 1
}
main "$@"