一、目录结构与拆分思路

1.1 Rocky 与 Ubuntu 分成两条安装线

  • rocky9.4离线安装ansible-2.14.17/rocky9.4-offline.sh
  • rocky9.4离线安装ansible-2.14.17/使用说明-脚本文件和压缩包都放在一起.txt
  • ubuntu2404离线安装ansible-2.17.9/ubuntu2404-offline.sh
  • ubuntu2404离线安装ansible-2.17.9/使用说明-安装包需要放到root目录下.txt

1.2 这组脚本的共同目标

  • 在无法联网的环境中安装指定版本 Ansible。
  • 通过本地 RPM 或 DEB 包完成部署。
  • 安装完成后立即做版本校验,避免“装了但命令不可用”。

二、Rocky Linux 离线安装方案

2.1 脚本核心流程

check_installed
setup_directory
extract_package
install_rpms
verify_installation

2.2 适合整理进正文的关键命令

install_dir="/opt/offline_ansible"
package="ansible-2.14.17.tar.gz"

mkdir -p "$install_dir"
tar xf "$package" -C "$install_dir"
cd "$install_dir/ansible-2.14.17"
yum localinstall -y *.rpm
ansible --version

三、Ubuntu 离线安装方案

3.1 与 Rocky 方案的主要差异

Ubuntu 版本在安装前先检查 /data/softs/root 两个位置是否存在离线包,随后解压并通过 dpkg -i 安装;如果遇到依赖问题,再调用 apt-get -f install 自动修复。

check_ansible
create_dir
copy_package
verify_package
extract_package
install_debs
verify_install

3.2 适合整理进正文的关键命令

install_dir="/data/softs"
package="ansible-2.17.9.tar.gz"

cp "/root/$package" "$install_dir/"
tar -xzf "$install_dir/$package" -C "$install_dir"
cd "$install_dir/ansible-2.17.9"
dpkg -i *.deb || apt-get -y install -f
ansible --version

四、完整脚本

以下为本文对应的完整脚本,便于直接复制复用。

4.1 rocky9.4-offline.sh

#!/bin/bash
#
#********************************************************************
#Author:            zhangqing
#QQ:                1904763431
#Date:              2020-03-04
#FileName:          offline_install_ansible.sh
#URL:               https://zhang-qing.com
#Description:       The test script
#Copyright (C):     2020 All rights reserved
#********************************************************************

#********************************************************************
#脚本使用注意事项:ansible-2.14.17.tar.gz包必须和脚本文件处于同一目录
#********************************************************************

# 功能1:检查系统是否已安装Ansible
check_installed() {
    if command -v ansible &>/dev/null; then
        current_version=$(ansible --version | head -n1 | awk '{print $3}' | tr -d ']')
        echo "rocky系统已经安装ansible,且ansible的版本是 $current_version"
        exit 0
    fi
}

# 功能2:创建安装目录
setup_directory() {
    install_dir="/opt/offline_ansible"
    mkdir -p "$install_dir" || {
        echo "目录创建失败:$install_dir"
        exit 1
    }
    echo "安装目录已创建:$install_dir"
}

# 功能3:解压安装包
extract_package() {
    package="ansible-2.14.17.tar.gz"
    if ! tar xf "$package" -C "$install_dir"; then
        echo "解压失败:$package"
        exit 1
    fi
    echo "解压成功:$package"
}

# 功能4:安装RPM包
install_rpms() {
    cd "$install_dir/ansible-2.14.17" || exit 1
    if ! yum localinstall -y *.rpm >/dev/null 2>&1; then
        echo "RPM包安装失败"
        exit 1
    fi
    echo "RPM包安装成功"
}

# 功能5:验证最终安装结果
verify_installation() {
    if ! command -v ansible &>/dev/null; then
        echo "ansible安装失败"
        exit 1
    fi
    final_version=$(ansible --version | head -n1 | awk '{print $3}' | tr -d ']')
    echo "ansible安装成功,版本号为 $final_version"
}

# 主执行流程
check_installed
setup_directory
extract_package
install_rpms
verify_installation

4.2 ubuntu2404-offline.sh

#!/bin/bash
# 定义全局变量
install_dir="/data/softs"
package="ansible-2.17.9.tar.gz"
build_dir="$install_dir/ansible-2.17.9"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'  # 重置颜色

# 功能1:检查 Ansible 安装状态
check_ansible() {
    if ! command -v ansible >/dev/null 2>&1; then
        echo -e "${YELLOW}WARN${NC} Ansible 未安装,开始安装..."
    else
        installed_version=$(ansible --version 2>/dev/null | awk -F'[][]' '/^ansible/ {print $2}')
        echo -e "${GREEN}INFO${NC} 已安装 Ansible,版本号:$installed_version"
        exit 0
    fi
}

# 功能2:创建安装目录
create_dir() {
    if [ ! -d "$install_dir" ]; then
        echo -e "${GREEN}INFO${NC} 正在创建安装目录:$install_dir"
        mkdir -p "$install_dir" || {
            echo -e "${RED}ERROR${NC} 目录创建失败:$install_dir"
            exit 1
        }
    fi
}

# 功能3:拷贝离线包到安装目录(默认离线包存放在 /root)
copy_package() {
    if [ ! -f "$install_dir/$package" ]; then
        if [ -f "/root/$package" ]; then
            echo -e "${GREEN}INFO${NC} 从 /root 目录拷贝 $package$install_dir"
            cp "/root/$package" "$install_dir/" || {
                echo -e "${RED}ERROR${NC} 拷贝 $package 失败"
                exit 1
            }
        else
            echo -e "${RED}ERROR${NC} 离线包缺失:请将 $package 放置到 $install_dir 或 /root 目录"
            exit 1
        fi
    else
        echo -e "${GREEN}INFO${NC} 离线包 $package 已存在于 $install_dir"
    fi
}

# 功能4:验证离线包是否存在
verify_package() {
    if [ ! -f "$install_dir/$package" ]; then
        echo -e "${RED}ERROR${NC} 离线包缺失:在 $install_dir 中未找到 $package"
        exit 1
    fi
}

# 功能5:解压安装包
extract_package() {
    echo -e "${GREEN}INFO${NC} 开始解压离线包..."
    if tar -xzf "$install_dir/$package" -C "$install_dir"; then
        echo -e "${GREEN}INFO${NC} 解压成功:$package"
    else
        echo -e "${RED}ERROR${NC} 解压失败,请检查压缩包完整性"
        exit 1
    fi
}

# 功能6:安装 DEB 包
install_debs() {
    echo -e "${GREEN}INFO${NC} 开始安装 DEB 包..."
    cd "$build_dir" || {
        echo -e "${RED}ERROR${NC} 目录不存在:$build_dir"
        exit 1
    }

    # 尝试安装所有 DEB 包
    if dpkg -i *.deb >/dev/null 2>&1; then
        echo -e "${GREEN}INFO${NC} DEB 包安装成功"
    else
        echo -e "${YELLOW}WARN${NC} 检测到依赖问题,尝试自动修复..."
        if apt-get -y install -f >/dev/null 2>&1; then
            echo -e "${GREEN}INFO${NC} 依赖修复成功"
        else
            echo -e "${RED}ERROR${NC} 依赖修复失败,请手动检查以下问题:"
            dpkg -l | grep -v '^ii'
            exit 1
        fi
    fi
}

# 功能7:安装验证
verify_install() {
    if final_version=$(ansible --version 2>/dev/null | awk -F'[][]' '/^ansible/ {print $2}'); then
        echo -e "${GREEN}SUCCESS${NC} Ansible 安装完成,版本号:$final_version"
    else
        echo -e "${RED}ERROR${NC} 安装验证失败,请检查日志"
        exit 1
    fi
}

# 主执行流程
check_ansible
create_dir
copy_package
verify_package
extract_package
install_debs
verify_install