自学内容网 自学内容网

脚本化挂在物理盘、nfs、yum、pg数据库

文章目录

  • 前言
  • 一、什么是脚本化安装
  • 二、使用步骤
    • 1.物理磁盘脚本挂载(离线)
    • 2.yum脚本化安装(离线)
    • 3.nfs脚本化安装(离线)
    • 4.pg数据库脚本化安装(离线)
  • 总结


前言

在Linux中,Shell脚本是一种强大的工具,用于自动化任务和管理系统。编写Shell脚本时,需要遵循一定的格式和规范,以确保脚本的可读性和可维护性。


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是脚本化安装

Linux脚本是一种可以在Linux或其他类Unix操作系统上运行的脚本语言。它可以用于自动化系统管理任务、软件开发、数据处理等各种任务。脚本通常是以文本文件的形式编写,其中包含一系列命令和语句,这些命令和语句可以在终端或脚本解释器中执行。

底层原理是,当用户运行脚本时,操作系统会将其交给解释器解释执行。解释器会逐行读取脚本文件,将每一行转化为对应的操作系统命令进行执行。因为Linux脚本语言是一种解释型语言,所以它可以在不同的平台和系统上运行,而不需要进行编译。这使得脚本编写和调试更加容易。

脚本语言的优点是它具有易读性、易维护性、易于使用的特点。Linux脚本可以处理多种文本格式,包括CSV、XML、JSON等。此外,它还具有强大的系统管理功能,如文件管理、进程管理、网络管理等。因此,它在自动化运维、软件开发、数据处理等领域广泛应用。

二、使用步骤

1.物理磁盘脚本挂载(离线)

使用方法
将代码保存为.sh格式

dos2unix 物理盘挂载.sh     ----转载为linux可识别的语言
sh 物理盘挂载.sh           ----根据提示填写信息即可

代码

#!/bin/bash

# 检查是否以root用户运行
if [ "$EUID" -ne 0 ]; then
  echo "请以root用户或使用sudo运行此脚本"
  exit 1
fi

# 列出所有块设备
echo "当前块设备列表:"
lsblk

# 提示用户输入设备路径
read -p "请输入要格式化的磁盘设备路径(例如 /dev/vdb):" DEVICE_PATH

# 检查设备是否存在
if [ ! -e "$DEVICE_PATH" ]; then
  echo "设备 $DEVICE_PATH 不存在,请检查路径是否正确!"
  exit 1
fi

# 提示用户确认设备路径
echo "您选择的设备是:$DEVICE_PATH"
read -p "请确认是否继续格式化此设备?(y/n): " CONFIRM

if [ "$CONFIRM" != "y" ]; then
  echo "操作已取消。"
  exit 0
fi

# 提示用户选择文件系统类型
echo "请选择要使用的文件系统类型:"
echo "1. ext3"
echo "2. ext4"
echo "3. xfs"
echo "4. btrfs"
read -p "输入选项(1-4):" FILESYSTEM_OPTION

# 根据用户选择设置文件系统类型
case $FILESYSTEM_OPTION in
  1) FILESYSTEM="ext3";;
  2) FILESYSTEM="ext4";;
  3) FILESYSTEM="xfs";;
  4) FILESYSTEM="btrfs";;
  *) echo "无效选项,默认使用 ext3"; FILESYSTEM="ext3";;
esac

# 格式化磁盘
echo "格式化 $DEVICE_PATH 为 $FILESYSTEM 文件系统..."
if [ "$FILESYSTEM" == "xfs" ]; then
  mkfs.xfs "$DEVICE_PATH"
elif [ "$FILESYSTEM" == "btrfs" ]; then
  mkfs.btrfs "$DEVICE_PATH"
else
  mkfs.$FILESYSTEM "$DEVICE_PATH"
fi

# 提示用户输入挂载点路径
read -p "请输入挂载点路径(例如 /vdb):" MOUNT_POINT

# 创建挂载点目录
echo "创建挂载点目录 $MOUNT_POINT..."
mkdir -p "$MOUNT_POINT"

# 挂载设备到挂载点
echo "挂载 $DEVICE_PATH 到 $MOUNT_POINT..."
mount "$DEVICE_PATH" "$MOUNT_POINT"

# 编辑 /etc/fstab 文件,以确保系统重启后自动挂载
echo "编辑 /etc/fstab 文件以确保系统重启后自动挂载..."
echo "$DEVICE_PATH $MOUNT_POINT $FILESYSTEM defaults 0 0" >> /etc/fstab

# 检查挂载是否成功
echo "检查挂载是否成功..."
mount -a

# 列出所有块设备,确认挂载
echo "当前块设备列表:"
lsblk

# 重启系统
echo "系统将在5秒后重启..."
sleep 5
reboot

在这里插入图片描述

2.yum脚本化安装(离线)

使用方法和上面差不多

dos2unix yum.sh
sh yum.sh
#!/bin/bash

# 检查是否以root用户运行
if [ "$EUID" -ne 0 ]; then
  echo "请以root用户或使用sudo运行此脚本"
  exit 1
fi

# 提示用户输入挂载点路径(默认为 /media/cdrom)
read -p "请输入挂载点路径(默认为 /media/cdrom):" MOUNT_POINT

# 如果用户未输入挂载点路径,则使用默认值
if [ -z "$MOUNT_POINT" ]; then
  MOUNT_POINT="/media/cdrom"
fi

# 创建挂载点目录
echo "创建挂载点目录 $MOUNT_POINT..."
mkdir -p "$MOUNT_POINT"

# 显示磁盘使用情况
echo "当前磁盘使用情况:"
df -h

# 备份原有yum仓库配置
echo "备份原有yum仓库配置..."
cp -rf /etc/yum.repos.d /etc/yum.repos.d_bak

# 清除原有yum仓库配置
echo "清除原有yum仓库配置..."
rm -rf /etc/yum.repos.d/*

# 创建新的yum仓库配置文件
echo "创建新的yum仓库配置文件..."
cat <<EOF > /etc/yum.repos.d/Media.repo
[iso]
name=Media
baseurl=file://${MOUNT_POINT}/
gpgcheck=0
enabled=1
EOF

# 编辑fstab文件以自动挂载光驱
echo "编辑 /etc/fstab 文件以自动挂载光驱..."
echo "/dev/sr0   ${MOUNT_POINT}   iso9660   defaults   0   0" >> /etc/fstab

# 重新加载systemd配置
echo "重新加载systemd配置..."
systemctl daemon-reload

# 挂载所有文件系统
echo "挂载所有文件系统..."
mount -a

# 停止并禁用防火墙
echo "停止并禁用防火墙..."
systemctl stop firewalld
systemctl disable firewalld

# 清除yum缓存并重建
echo "清除yum缓存并重建..."
yum clean all
yum makecache

# 列出可用的软件包
echo "列出可用的软件包..."
yum list

# 确认挂载成功
echo "挂载点 $MOUNT_POINT 的挂载状态:"
mount | grep "$MOUNT_POINT"

# 完成提示
echo "配置完成!挂载点已设置为 $MOUNT_POINT,yum仓库已配置。"

在这里插入图片描述

3.nfs脚本化安装(离线)

使用方法

dos2unix nfs.sh
sh nfs.sh

代码

#!/bin/bash

# 安装nfs-utils和rpcbind
echo "安装nfs-utils和rpcbind..."
yum install -y nfs-utils rpcbind

# 提示用户输入共享路径的目录
read -p "请输入NFS共享目录的路径(例如 /home/nfs): " SHARE_DIR

# 如果用户没有输入,则使用默认值 /home/nfs
if [ -z "$SHARE_DIR" ]; then
    SHARE_DIR="/home/nfs"
    echo "未输入共享目录路径,使用默认值 $SHARE_DIR"
fi

# 创建NFS共享目录
echo "创建NFS共享目录 $SHARE_DIR..."
mkdir -p "$SHARE_DIR"
chmod -R 777 "$SHARE_DIR"  # 将权限改为777

# 配置exports文件
echo "配置 /etc/exports..."
cat > /etc/exports <<EOF
$SHARE_DIR *(rw,sync,no_root_squash)
EOF

# 重新加载exports配置
echo "重新加载exports配置..."
exportfs -ra

# 启动并启用nfs服务
echo "启动nfs服务..."
systemctl start nfs-server

echo "设置nfs服务开机自启动..."
systemctl enable nfs-server

echo "NFS服务器配置完成。"

# 提示用户是否在本地安装NFS客户端
read -p "是否在本地安装NFS客户端?(y/n, 默认n): " INSTALL_LOCAL

if [[ "$INSTALL_LOCAL" == "y" ]]; then
    # 安装nfs客户端
    echo "安装nfs客户端..."
    yum install -y nfs-utils
    echo "NFS客户端安装完成。"
fi

# 提示用户输入目标服务器的IP地址,支持多个IP地址
read -p "请输入目标服务器的IP地址,多个IP地址用逗号分隔(留空跳过): " TARGET_IPS

# 如果用户没有输入目标IP地址,则跳过分发步骤
if [ -z "$TARGET_IPS" ]; then
    echo "未输入目标服务器IP地址,跳过分发步骤。"
else
    # 将逗号分隔的IP地址转换为数组
    IFS=',' read -r -a TARGET_IP_ARRAY <<< "$TARGET_IPS"

    # 定义目标服务器的用户名(默认 root)
    TARGET_USER="root"

    # 定义目标服务器上的目标路径
    TARGET_DIR="/root/"

    # 定义脚本文件名
    SCRIPT_FILE="setup_nfs.sh"

    # 将当前脚本内容保存到临时文件
    echo "将当前脚本保存为临时文件 $SCRIPT_FILE ..."
    cat > "$SCRIPT_FILE" <<EOF
#!/bin/bash

# 安装nfs-utils和rpcbind
echo "安装nfs-utils和rpcbind..."
yum install -y nfs-utils rpcbind

# 提示用户输入共享路径的目录
read -p "请输入NFS共享目录的路径(例如 /home/nfs): " SHARE_DIR

# 如果用户没有输入,则使用默认值 /home/nfs
if [ -z "\$SHARE_DIR" ]; then
    SHARE_DIR="/home/nfs"
    echo "未输入共享目录路径,使用默认值 \$SHARE_DIR"
fi

# 创建NFS共享目录
echo "创建NFS共享目录 \$SHARE_DIR..."
mkdir -p "\$SHARE_DIR"
chmod -R 777 "\$SHARE_DIR"  # 将权限改为777

# 配置exports文件
echo "配置 /etc/exports..."
cat > /etc/exports <<EOL
\$SHARE_DIR *(rw,sync,no_root_squash)
EOL

# 重新加载exports配置
echo "重新加载exports配置..."
exportfs -ra

# 启动并启用nfs服务
echo "启动nfs服务..."
systemctl start nfs-server

echo "设置nfs服务开机自启动..."
systemctl enable nfs-server

echo "NFS服务器配置完成。"
EOF

    # 设置脚本权限
    chmod +x "$SCRIPT_FILE"

    # 遍历所有目标服务器,发送并执行脚本
    for TARGET_IP in "${TARGET_IP_ARRAY[@]}"; do
        echo "处理目标服务器 $TARGET_IP..."

        # 确保目标路径存在
        echo "在目标服务器 $TARGET_IP 上创建目标路径 $TARGET_DIR ..."
        ssh "$TARGET_USER@$TARGET_IP" "mkdir -p $TARGET_DIR"

        # 将脚本发送到目标服务器
        echo "将脚本 $SCRIPT_FILE 发送到目标服务器 $TARGET_IP ..."
        scp "$SCRIPT_FILE" "$TARGET_USER@$TARGET_IP:$TARGET_DIR"

        # 在目标服务器上执行脚本
        echo "在目标服务器 $TARGET_IP 上执行脚本..."
        ssh "$TARGET_USER@$TARGET_IP" "chmod +x $TARGET_DIR/$SCRIPT_FILE && $TARGET_DIR/$SCRIPT_FILE"
    done

    # 删除本地的临时脚本文件
    echo "删除本地的临时脚本文件 $SCRIPT_FILE ..."
    rm "$SCRIPT_FILE"

    echo "NFS配置脚本已成功发送并在所有目标服务器上执行。"
fi

在这里插入图片描述

4.pg数据库脚本化安装(离线)

使用方法

dos2unix pg.sh
sh pg.sh

代码

#!/bin/bash

set -e  # 出现错误时退出脚本

function setup_logging {
    log_file="/var/log/pg_install.log"
    touch "$log_file"
    exec > >(tee -i "$log_file") 2>&1
    echo "日志文件:$log_file"
}

function install_postgresql {
    # 引入日志记录
    setup_logging

    # 提示用户输入源码包的存放路径
    echo "请输入 PostgreSQL 源码包的存放路径(例如 /data/sources):"
    read -r source_path

    # 在指定路径下查找 .tar.gz 或 .tar 文件
    source_file=$(find "$source_path" -type f \( -name "*.tar.gz" -o -name "*.tar" \) -print -quit)

    # 检查是否找到文件
    if [ -z "$source_file" ]; then
        echo "未在路径 $source_path 下找到 .tar.gz 或 .tar 文件。请检查路径并重新运行脚本。"
        exit 1
    fi

    # 解压找到的源码包
    echo "正在解压 $source_file..."
    tar -zxvf "$source_file"

    # 获取解压后的目录名
    tar_dir=$(tar -tf "$source_file" | head -1 | cut -f1 -d"/")

    # 进入解压后的目录
    cd "$tar_dir" || { echo "无法进入目录 $tar_dir。请检查解压结果。"; exit 1; }

    # 添加 PostgreSQL 用户
    useradd postgresql

    # 提示用户是否要手动设置密码
    echo "是否要手动设置 PostgreSQL 用户的密码? (y/n)"
    read -r answer

    if [[ "$answer" == "y" ]]; then
        # 提示用户手动输入密码
        passwd postgresql
    else
        # 使用默认密码 root1234
        echo "postgresql:root1234" | chpasswd
        echo "默认密码 root1234 已设置。"
    fi

    # 提示用户是否已经手动创建了数据目录
    echo "是否已经手动创建了 PostgreSQL 数据目录? (y/n)"
    read -r data_dir_answer

    if [[ "$data_dir_answer" != "y" ]]; then
        # 提示用户输入数据目录路径
        echo "请输入 PostgreSQL 数据目录的路径(例如 /data/postgresql/data):"
        read -r data_dir_path

        # 创建 PostgreSQL 数据目录
        mkdir -p "$data_dir_path"
        chown -R postgresql:postgresql "$data_dir_path"
        chmod 750 "$data_dir_path"
    else
        # 提示用户输入现有的数据目录路径
        echo "请输入现有的 PostgreSQL 数据目录的路径(例如 /data/postgresql/data):"
        read -r data_dir_path
    fi

    # 提示用户是否已经手动创建了安装路径
    echo "是否已经手动创建了 PostgreSQL 安装路径(例如 /data/postgresql/pgsql)? (y/n)"
    read -r install_dir_answer

    if [[ "$install_dir_answer" != "y" ]]; then
        # 提示用户输入 PostgreSQL 安装路径
        echo "请输入 PostgreSQL 安装路径(例如 /data/postgresql/pgsql):"
        read -r install_path

        # 创建 PostgreSQL 安装路径
        mkdir -p "$install_path"
        chown -R postgresql:postgresql "$install_path"
        chmod 750 "$install_path"
    else
        # 提示用户输入现有的安装路径
        echo "请输入现有的 PostgreSQL 安装路径(例如 /data/postgresql/pgsql):"
        read -r install_path
    fi

    # 更新 yum 缓存
    yum makecache fast

    # 定义依赖包列表
    dependencies=(
        readline-devel
        systemtap
        systemtap-sdt-devel
        perl-ExtUtils-Embed
        pam
        pam-devel
        libxml2
        libxml2-devel
        libxslt
        libxslt-devel
        python3-devel
        libicu-devel
        zlib-devel
    )

    # 检查并安装缺失的依赖包
    for pkg in "${dependencies[@]}"; do
        if ! rpm -q "$pkg" &> /dev/null; then
            echo "未安装依赖包 $pkg,正在安装..."
            yum install -y "$pkg"
        fi
    done

    # 特殊处理 python2-devel
    if ! rpm -q python2-devel &> /dev/null; then
        echo "未找到 python2-devel,尝试安装 python3-devel 替代..."
        yum install -y python3-devel
    fi

    # 配置 PostgreSQL 的安装选项
    ./configure --prefix="$install_path" --with-pgport=5432 --with-libraries="$install_path/lib" --with-includes="$install_path/include" --with-perl --with-python --with-openssl --with-pam --with-libxml --with-libxslt

    # 编译并安装 PostgreSQL
    make && make install

    # 设置安装目录权限
    chown -R postgresql:postgresql "$install_path"
    chmod 750 "$install_path"

    # 初始化数据库
    su - postgresql -c "$install_path/bin/initdb -D $data_dir_path"

    # 启动 PostgreSQL 服务
    su - postgresql -c "$install_path/bin/pg_ctl -D $data_dir_path -l $data_dir_path/logfile start"

    # 修改环境变量
    cat <<EOF >> /etc/profile
export PATH=$install_path/bin:\$PATH
export PGHOME=$install_path
export PGDATA=$data_dir_path
export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:\$PGHOME/lib
EOF

    # 使环境变量生效
    source /etc/profile

    # 创建 systemd 服务单元文件
    cat <<EOF > /etc/systemd/system/postgresql.service
[Unit]
Description=PostgreSQL database server
After=network.target

[Service]
Type=forking
User=postgresql
Group=postgresql
Environment=PGPORT=5432
Environment=PGDATA=$data_dir_path
ExecStart=$install_path/bin/pg_ctl start -D \$PGDATA -l \$PGDATA/logfile
ExecStop=$install_path/bin/pg_ctl stop -D \$PGDATA -m fast
ExecReload=$install_path/bin/pg_ctl reload -D \$PGDATA
TimeoutSec=300

[Install]
WantedBy=multi-user.target
EOF

    # 重新加载 systemd 配置
    systemctl daemon-reload

    # 询问用户是否设置开机自启动
    echo "是否设置 PostgreSQL 为开机自启动? (y/n)"
    read -r enable_answer

    if [[ "$enable_answer" == "y" ]]; then
        # 启用 PostgreSQL 服务
        systemctl enable postgresql
        echo "PostgreSQL 已设置为开机自启动。"
    else
        echo "PostgreSQL 未设置为开机自启动。"
    fi

    # 启动 PostgreSQL 服务
    systemctl start postgresql

    echo "PostgreSQL 数据库安装并启动成功。"

    # 修改 postgresql.conf 文件
    modify_postgresql_conf "$data_dir_path"

    # 修改 pg_hba.conf 文件
    modify_pg_hba_conf "$data_dir_path"
}

function modify_postgresql_conf {
    local data_dir_path=$1

    # 编辑 postgresql.conf 文件
    echo "正在修改 $data_dir_path/postgresql.conf 文件..."

    # 修改第60行 listen_addresses 的值为 '*'
    sed -i '60s/^#//; 60s/localhost/*/' "$data_dir_path/postgresql.conf"

    # 修改第64行 port 的值为 5432
    sed -i '64s/^#//' "$data_dir_path/postgresql.conf"

    echo "postgresql.conf 文件修改完成。"
}

function modify_pg_hba_conf {
    local data_dir_path=$1

    # 编辑 pg_hba.conf 文件
    echo "正在修改 $data_dir_path/pg_hba.conf 文件..."

    # 在匹配行后添加新的配置行
    sed -i '/# IPv4 local connections:/ a \
host    all             all             0.0.0.0/0               md5' "$data_dir_path/pg_hba.conf"

    echo "pg_hba.conf 文件修改完成。"
}

# 执行 PostgreSQL 安装
install_postgresql

问题

开机自启可提供选择,如果选择启用可能会报错,或者安装好后会报错,看一下之前创建的数据路径底下的logfile

在这里插入图片描述


总结

脚本就是无脑话和不动手安装,本文不存在抄袭,都是自己平时觉得步骤繁琐,根据经验写的,可能有不足大家多多包涵,后续会更新nginx和k8s脚本化安装


原文地址:https://blog.csdn.net/qq_45673244/article/details/145124033

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!