编辑代码

#!/bin/bash

set +x
# 函数:检查并备份daemon.json配置文件
function backup_daemon_json() {
    local daemon_json_file="/etc/docker/daemon.json"
    local backup_dir="/etc/docker/daemon_json_backup"

    # 检查是否有sudo权限,如果没有,则退出脚本
    if ! sudo -n true 2>/dev/null; then
        echo "脚本需要sudo权限才能操作文件,请确保脚本以sudo或root身份运行。"
        exit 1
    fi

    # 检查是否存在daemon.json文件
    if [ -f "$daemon_json_file" ]; then
        # 备份daemon.json文件
        local backup_date=$(date "+%Y-%m-%d_%H-%M-%S")
        local backup_file="$backup_dir/daemon.json_$backup_date"

        # 创建备份目录
        if ! mkdir -p "$backup_dir"; then
            echo "创建备份目录失败,请检查目录权限或路径设置。"
            exit 1
        fi

        # 备份daemon.json文件
        sudo cp "$daemon_json_file" "$backup_file"
        echo "已备份原有的daemon.json文件为 $backup_file"
    fi
}

# 函数:在目标服务器上创建并写入daemon.json指定私库地址
function create_daemon_json() {
    local daemon_json_content='{"insecure-registries": ["192.168.1.144:8083", "192.168.1.144:8082"]}'

    # 检查是否有sudo权限,如果没有,则退出脚本
    if ! sudo -n true 2>/dev/null; then
        echo "脚本需要sudo权限才能写入文件,请确保脚本以sudo或root身份运行。"
        exit 1
    fi

    # 创建并写入daemon.json文件
    echo "$daemon_json_content" | sudo tee /etc/docker/daemon.json > /dev/null
    #重新加载配置
    echo "重新加载daemon.json配置"
    sudo systemctl daemon-reload
    #重启docker使其生效
    echo "重启 Docker 以使daemon.json配置生效"
    sudo systemctl restart docker
    sleep 5

    # 检查是否已经存在同样版本的镜像,如果不存在则从私库中拉取镜像并重命名
    #if ! docker images | grep -q 'elasticdump' | grep -q '6.41.0'; then
     if ! docker images | awk -v image="elasticdump" -v tag="6.41.0" '$1 == image && $2 == tag { found = 1; exit } END { exit !found }'; then
        if docker pull 192.168.1.144:8083/elasticdump:6.41.0; then
            echo "成功从私库中拉取镜像 192.168.1.144:8083/elasticdump:6.41.0"
            # 重新标记镜像名称
            docker tag 192.168.1.144:8083/elasticdump:6.41.0 elasticdump:6.41.0
        else
            echo "从私库中拉取镜像失败,请检查私库地址和镜像是否正确。"
            exit 1
        fi
    else
        echo "本地已存在相同版本的镜像 elasticdump:6.41.0,跳过拉取镜像步骤。"
    fi
}


# 函数:备份Elasticsearch数据(Docker安装方式)
function backup_docker_elasticsearch() {
    if ! command -v docker &>/dev/null; then
        echo "未安装 Docker,无法进行容器备份。"
        return 1
    fi

    # 获取Docker容器ID
    local container_id=$(docker ps -a | grep -E "es|elasticsearch" | awk '{print $1}' 2>/dev/null)

    if [ -n "$container_id" ]; then
        local backup_dir="$1"
        local index_name="$2"
        local es_user="$3"
        local es_password="$4"
        local es_ip="$5"

        # 检查并创建备份路径
        local backup_date=$(date "+%Y-%m-%d_%H-%M-%S")
        local backup_path="$backup_dir/$backup_date"

        # 创建备份路径
        if ! mkdir -p "$backup_path"; then
            echo "创建备份路径失败,请检查目录权限或路径设置。"
            return 1
        fi

	sleep 3
        # 备份多个索引名称
        for index in $2; do
            if [ -z "$es_password" ]; then
                docker run --rm -ti -v "$backup_path/$index":/tmp "elasticdump:6.41.0" --input="http://$5:9200/$index" --output="/tmp/elasticsearch_data.json" --all=true --limit 10000
            else
                # 备份时捕获错误并输出错误信息
                if docker run --rm -ti -v "$backup_path/$index":/tmp "elasticdump:6.41.0" --input="http://$3:$4@$5:9200/$index" --output="/tmp/elasticsearch_data.json" --all=true --limit 10000; then
                    echo "Elasticsearch 数据备份完成,备份目录:$backup_path/$index"
                else
                    echo "备份失败,请检查 Elasticsearch 用户名和密码是否正确。"
                    return 1
                fi
            fi
        done

    else
        echo "未找到正在运行的 Elasticsearch 容器(Docker部署)。"
        return 1
    fi
}


# 函数:备份Elasticsearch数据(编译安装方式)
function backup_compiled_elasticsearch() {
    local backup_dir="$1"
    local index_name="$2"
    local es_user="$3"
    local es_password="$4"
    local es_ip="$5"

    if ! command -v elasticdump &>/dev/null; then
        echo "未找到 elasticdump 命令,请确认是否已安装。"
        return 1
    fi

    # 检查并创建备份路径
    local backup_date=$(date "+%Y-%m-%d_%H-%M-%S")
    local backup_path="$backup_dir/$backup_date"

    # 创建备份路径
    if ! mkdir -p "$backup_path"; then
        echo "创建备份路径失败,请检查目录权限或路径设置。"
        return 1
    fi

    # 执行数据备份
    if [ -z "$es_password" ]; then
       elasticdump --input="http://$5:9200/$2" --output="$backup_path/elasticsearch_data.json" --all=true --limit 10000
    else
       # 备份时捕获错误并输出错误信息
        if elasticdump --input="http://$3:$4@$5:9200/$2" --output="$backup_path/elasticsearch_data.json" --all=true --limit 10000; then
           echo "Elasticsearch 数据备份完成,备份目录:$backup_path"
        else
           echo "备份失败,请检查 Elasticsearch 用户名和密码是否正确。"
           exit 1
        fi
    fi
	
   # echo "Elasticsearch 数据备份完成,备份目录:$backup_path"
}

# 函数:删除超过指定天数的备份目录
# 参数:$1 -> 备份存储路径, $2 -> 备份保留天数
function delete_old_backups() {
    local backup_dir="$1"
    local retain_days="$2"

    # 确保 $retain_days 大于 0
    if [ "$retain_days" -gt 0 ]; then
        # 获取今天的日期
        today=$(date "+%Y-%m-%d")

        # 删除超过指定天数的备份目录
        for dir in "$backup_dir"/*; do
            if [ -d "$dir" ]; then
                # 提取目录名中的日期部分
                dir_date=$(basename "$dir" | cut -d'_' -f1)

                # 计算日期差值
                days_diff=$(( ($(date -d "$today" +%s) - $(date -d "$dir_date" +%s)) / (3600*24) ))

                if [ $days_diff -gt "$retain_days" ]; then
                    echo "删除 $dir"
                    rm -rf "$dir"
                else
                    echo "保留 $dir"
                fi
            fi
        done

        echo "删除超过 $retain_days 天的备份目录完成。"
    else
        echo "备份保留天数设置不正确,请设置大于 0 的值。"
    fi
}

#主程序参数入口
${IP}}
${username}
${password}
${backup_directory}
${index_name}
${backup_retain_days}

echo "-------------备份任务开始-------------"

#检查并备份daemon.json配置文件
backup_daemon_json

# 创建 daemon.json 指定私库地址,并重启 Docker
create_daemon_json

# 调用备份函数
backup_docker_elasticsearch "$backup_directory" "$index_name" "$username" "$password" "$IP"
backup_compiled_elasticsearch "$backup_directory" "$index_name" "$username" "$password" "$IP"

# 删除超过指定天数的备份目录
delete_old_backups "$backup_directory" "$backup_retain_days"
echo "-------------备份任务完成-------------"