从零搭建 Gitee 标准化脚本仓库:自动化运维脚本管理方案
在 Gitee 搭建标准化自动化脚本仓库的方案,包括环境准备、目录结构规范、Git 版本控制、SSH 免密配置、跨主机迁移及脚本头部自动注入功能。通过规范化命名、提交记录及云端备份,实现运维脚本的高效管理、复用与精准获取,适用于个人或团队场景。

在 Gitee 搭建标准化自动化脚本仓库的方案,包括环境准备、目录结构规范、Git 版本控制、SSH 免密配置、跨主机迁移及脚本头部自动注入功能。通过规范化命名、提交记录及云端备份,实现运维脚本的高效管理、复用与精准获取,适用于个人或团队场景。

日常会编写大量 Ansible、Shell、Python 自动化脚本,分散存放不仅难以检索,还存在丢失风险。本文将带你从零搭建Gitee 标准化脚本仓库,通过规范化目录结构、Git 版本控制、云端备份,实现脚本的高效管理、复用、跨主机迁移,以及单个脚本的精准获取,适合个人或团队运维场景。
# 更新软件源
apt update -y
# 安装 Git
apt install git -y
# 验证安装结果
git --version
# 输出类似:git version 2.43.0
git config --global user.name "<your_name>"
git config --global user.email "<[email protected]>"
# 配置拉取时默认合并方式(避免后续冲突提示)
git config --global pull.rebase false
script-repo-name(自定义,建议含 scripts 标识)[email protected]:<your_gitee_username>/script-repo-name.git避免每次推送都输入账号密码,配置 SSH 免密:
# 生成 SSH 密钥(一路回车,无需设置密码)
ssh-keygen -t ed25519 -C "<[email protected]>"
# 查看公钥内容(全选复制)
cat ~/.ssh/id_ed25519.pub
验证 SSH 连接:
ssh -T [email protected]
# 输出类似:Hi <username>! You've successfully authenticated...
创建 init_script_repo.sh 脚本,一键生成标准化目录结构、README、.gitignore:
cat > init_script_repo.sh << 'EOF'
#!/bin/bash
set -e
# ======================== 配置项(请修改为你的信息)========================
GITEE_USERNAME="<your_gitee_username>" # 你的 Gitee 用户名(路径中的用户名)
REPO_NAME="script-repo-name" # Gitee 仓库名称
LOCAL_REPO_PATH="$HOME/scripts" # 本地脚本仓库路径
GIT_NAME="<your_name>" # Git 提交用户名
GIT_EMAIL="<[email protected]>" # Git 提交邮箱
# ==========================================================================
# 颜色输出函数
green_echo() {
echo -e "\033[32m$1\033[0m"
}
red_echo() {
echo -e "\033[31m$1\033[0m"
}
yellow_echo() {
echo -e "\033[33m$1\033[0m"
}
# 前置检查:检测 Git 是否安装
green_echo "===== 0. 前置检查:检测 Git 环境 ====="
if ! command -v git &> /dev/null; then
red_echo "未检测到 Git,开始自动安装..."
apt update -y && apt install git -y
if ! command -v git &> /dev/null; then
red_echo "Git 安装失败,请手动安装后重试!"
exit 1
fi
green_echo "Git 安装成功!"
else
green_echo "Git 已安装:$(git --version)"
fi
# 第一步:创建标准化目录结构
green_echo "===== 1. 创建脚本目录结构 ====="
mkdir -p "${LOCAL_REPO_PATH}"/{ansible,shell,python,archive}/{cloud,monitor,automation,centos,ubuntu,api}
green_echo "目录创建完成:${LOCAL_REPO_PATH}"
# 第二步:生成标准化 README.md
green_echo "===== 2. 生成标准化 README.md ====="
cat > "${LOCAL_REPO_PATH}/README.md" << README_EOF
# ${REPO_NAME} 个人/团队自动化脚本管理仓库,包含 Ansible/Shell/Python 等运维脚本。
## 目录说明
| 目录 | 用途 |
|--------------|--------------------------|
| ansible/ | Ansible Playbook/Role |
| shell/ | Shell 脚本(按系统分类) |
| python/ | Python 自动化脚本 |
| archive/ | 废弃/归档脚本 |
## 脚本规范
1. 文件名格式:功能_环境。后缀(如:nginx_install_centos.sh)
2. 脚本头部必须包含元数据注释(功能、环境、依赖、版本)
3. Git 提交规范:feat(目录): 描述 / fix(目录): 描述
## 依赖说明
- Shell 脚本:bash 环境,部分需 curl/wget
- Python 脚本:见 requirements.txt
- Ansible 脚本:Ansible 2.10+
README_EOF
# 第三步:生成.gitignore 文件(过滤无用文件)
green_echo "===== 3. 生成.gitignore 文件 ====="
cat > "${LOCAL_REPO_PATH}/.gitignore" << GITIGNORE_EOF
# 通用忽略文件
*.log
*.swp
*.tmp
.DS_Store
.idea/
.vscode/
__pycache__/
*.pyc
# 运维脚本忽略文件
*.iso
*.tar.gz
*.zip
password.txt
*.key
*.pem
GITIGNORE_EOF
# 第四步:初始化 Git 仓库并配置
green_echo "===== 4. 初始化 Git 仓库 ====="
cd "${LOCAL_REPO_PATH}"
if [ -d .git ]; then
yellow_echo "当前目录已存在 Git 仓库,跳过初始化步骤!"
else
git init
green_echo "Git 仓库初始化完成!"
fi
git config user.name "${GIT_NAME}"
git config user.email "${GIT_EMAIL}"
green_echo "Git 用户信息配置完成:${GIT_NAME} <${GIT_EMAIL}>"
# 第五步:关联 Gitee 远程仓库(SSH 方式)
green_echo "===== 5. 关联 Gitee 远程仓库 ====="
GITEE_REPO_URL="[email protected]:${GITEE_USERNAME}/${REPO_NAME}.git"
if git remote | grep -q "origin"; then
yellow_echo "已存在 origin 远程关联,先删除旧关联..."
git remote remove origin
fi
git remote add origin "${GITEE_REPO_URL}"
green_echo "已关联远程仓库(SSH):${GITEE_REPO_URL}"
# 第六步:提交初始版本
green_echo "===== 6. 提交初始版本 ====="
git add .
if git rev-parse --verify HEAD &> /dev/null; then
yellow_echo "已存在提交记录,跳过初始提交步骤!"
else
git commit -m "feat: 初始化脚本仓库,创建标准化目录结构"
green_echo "初始版本提交完成!"
fi
# 第七步:添加空目录占位文件(确保 Git 追踪目录)
green_echo "===== 7. 添加.gitkeep 占位文件 ====="
find . -type d -empty -exec touch {}/.gitkeep \;
git add .
git commit -m "feat: 添加.gitkeep 占位文件,确保空目录被 Git 追踪"
green_echo "占位文件添加完成!"
# 完成提示
green_echo "===== 本地仓库初始化完成!====="
green_echo "本地仓库路径:${LOCAL_REPO_PATH}"
green_echo "后续执行 git push -u origin master 即可推送到 Gitee"
EOF
# 给脚本添加执行权限
chmod +x init_script_repo.sh
# 执行脚本
./init_script_repo.sh
tree /root/scripts
# 输出类似:
# /root/scripts
# ├── ansible
# │ └── ...
# ├── shell
# │ └── ...
# ├── python
# │ └── ...
# ├── archive
# │ └── ...
# ├── .gitignore
# ├── README.md
# └── ... (各目录下包含.gitkeep)
# 进入本地脚本仓库目录
cd /root/scripts
# 推送到 Gitee(首次推送需关联分支)
git push -u origin master
若推送时提示 (fetch first) 冲突,执行以下命令合并:
# 拉取远程内容并合并(允许无共同历史)
git pull origin master --allow-unrelated-histories
# 解决冲突(保留本地版本)
git checkout --ours README.md
git checkout --ours .gitignore
# 标记冲突已解决并提交
git add README.md .gitignore
git commit -m "merge: 解决 README 和.gitignore 冲突,保留本地标准化配置"
# 重新推送
git push -u origin master
当更换新主机时,一键复刻仓库环境:
# 安装 Git
apt update -y && apt install git tree -y
# 配置 Git 全局信息(和原主机一致)
git config --global user.name "<your_name>"
git config --global user.email "<[email protected]>"
git config --global pull.rebase false
# 生成 SSH 密钥
ssh-keygen -t ed25519 -C "<[email protected]>"
# 复制公钥并添加到 Gitee(步骤同原主机)
cat ~/.ssh/id_ed25519.pub
# 验证 SSH 连接
ssh -T [email protected]
# 克隆仓库到新主机的~/scripts 目录
git clone [email protected]:<your_gitee_username>/script-repo-name.git ~/scripts
# 验证目录结构(和原主机一致)
cd ~/scripts
tree -L 2
# 示例:安装 Ansible
apt install ansible -y
# 示例:安装 Python 依赖(若仓库有 requirements.txt)
pip3 install -r ~/scripts/requirements.txt
适用于需要长期使用多个脚本、同步更新的场景:
执行脚本:
cd ~/scripts/shell/centos
bash nginx_install_centos.sh
同步最新脚本:
cd ~/scripts
git pull origin master
HTTPS 方式(需输 Gitee 账号和私人令牌):
git clone https://gitee.com/<your_gitee_username>/script-repo-name.git ~/scripts
SSH 方式(免密,需配置公钥):
git clone [email protected]:<your_gitee_username>/script-repo-name.git ~/scripts
目标主机准备 Git 环境:
apt update -y && apt install git -y
无需克隆完整仓库,仅获取目标脚本,节省空间:
shell/centos/nginx_install_centos.sh);上传到目标主机:
scp 本地脚本路径 root@目标主机 IP:/root/
赋予权限并执行:
chmod +x /root/nginx_install_centos.sh
bash /root/nginx_install_centos.sh
目标主机执行下载命令:
# wget 方式
wget https://gitee.com/<your_gitee_username>/script-repo-name/raw/master/shell/centos/nginx_install_centos.sh -O /root/nginx_install_centos.sh
# curl 方式
curl -o /root/nginx_install_centos.sh https://gitee.com/<your_gitee_username>/script-repo-name/raw/master/shell/centos/nginx_install_centos.sh
需使用某目录下多个脚本,无需完整仓库:
关联仓库并拉取:
git remote add origin [email protected]:<your_gitee_username>/script-repo-name.git
git pull origin master
指定需拉取的目录:
echo "shell/centos/">> .git/info/sparse-checkout # 仅拉取 shell/centos 目录
目标主机初始化空仓库:
mkdir -p ~/scripts && cd ~/scripts
git init
git config core.sparseCheckout true # 开启稀疏克隆
若其他主机是团队成员使用,需配置仓库权限:
功能_环境。后缀nginx_install_centos.sh、vmware_create_vm.yml、log_analyzer_python.py通过配置 PROMPT_COMMAND 钩子,实现任意方式创建.sh/.py/.yml 文件时,自动插入标准化头部,无需依赖 touch 命令,重启终端或系统后永久生效。
编辑 ~/.bashrc 文件(bash 环境):
vim ~/.bashrc
在文件末尾添加以下内容:
# ======================== 自动插入脚本头部配置 ========================
# 配置项(按需修改)
SCRIPT_AUTHOR="<your_name>"
SCRIPT_PERMISSION="root"
SCRIPT_VERSION="v1.0"
# 检测新创建的空脚本文件并插入头部
check_and_add_header(){
# 处理.sh 文件
for file in $(find . -maxdepth 50 -type f -name "*.sh" -size 0 2>/dev/null); do
if ! grep -q "#!/bin/bash" "$file"; then
cat > "$file" << EOF
#!/bin/bash
##############################################################################
# 脚本名称:$(basename "$file")
# 功能描述:[请填写脚本功能,如:自动化安装 Nginx 并配置开机自启]
# 适用环境:[请填写适用环境,如:CentOS 7.x/Ubuntu 20.04]
# 依赖组件:[请填写依赖组件,如:gcc pcre-devel openssl-devel]
# 执行权限:${SCRIPT_PERMISSION}
# 作 者:${SCRIPT_AUTHOR}
# 创建日期:$(date +%Y-%m-%d)
# 版本号:${SCRIPT_VERSION}
# 修订记录:
# ${SCRIPT_VERSION} - 初始版本,实现 [请简要描述核心功能]
##############################################################################
# ======================== 脚本核心逻辑开始 ========================
EOF
chmod +x "$file"
echo "✅ 已为新脚本自动添加头部:$file"
fi
done
# 处理.py 文件
for file in $(find . -maxdepth 50 -type f -name "*.py" -size 0 2>/dev/null); do
if ! grep -q "#!/usr/bin/env python3" "$file"; then
cat > "$file" << EOF
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
##############################################################################
# 脚本名称:$(basename "$file")
# 功能描述:[请填写脚本功能,如:分析 Nginx 异常访问日志]
# 适用环境:[请填写适用环境,如:通用 Linux 环境]
# 依赖组件:[请填写依赖组件,如:python3-pandas python3-numpy]
# 执行权限:${SCRIPT_PERMISSION}
# 作 者:${SCRIPT_AUTHOR}
# 创建日期:$(date +%Y-%m-%d)
# 版本号:${SCRIPT_VERSION}
# 修订记录:
# ${SCRIPT_VERSION} - 初始版本,实现 [请简要描述核心功能]
##############################################################################
# ======================== 脚本核心逻辑开始 ========================
EOF
chmod +x "$file"
echo "✅ 已为新脚本自动添加头部:$file"
fi
done
# 处理.yml/.yaml 文件
for file in $(find . -maxdepth 50 -type f \( -name "*.yml" -o -name "*.yaml" \) -size 0 2>/dev/null); do
if ! grep -q "##############################################################################" "$file"; then
cat > "$file" << EOF
##############################################################################
# 脚本名称:$(basename "$file")
# 功能描述:[请填写脚本功能,如:批量创建 VMware 虚拟机]
# 适用环境:[请填写适用环境,如:VMware ESXi 7.0]
# 依赖组件:[请填写依赖组件,如:ansible 2.10+ pyvmomi]
# 执行权限:${SCRIPT_PERMISSION}
# 作 者:${SCRIPT_AUTHOR}
# 创建日期:$(date +%Y-%m-%d)
# 版本号:${SCRIPT_VERSION}
# 修订记录:
# ${SCRIPT_VERSION} - 初始版本,实现 [请简要描述核心功能]
##############################################################################
# ======================== Playbook 核心逻辑开始 ========================
EOF
echo "✅ 已为新脚本自动添加头部:$file"
fi
done
}
# 设置 PROMPT_COMMAND,每次命令行提示符出现时执行检测
PROMPT_COMMAND="check_and_add_header; $PROMPT_COMMAND"
# ==========================================================================
source ~/.bashrc
# 若仍不生效,重启系统
reboot
vim test1.sh
打开文件后自动显示标准化头部,无需手动操作。
echo "print('test')"> test2.py
cat test2.py
输出包含标准化头部 + 自定义内容。
cat > test3.yml << EOF
- hosts: all
tasks:
- name: test
debug:
msg="hello"
EOF
cat test3.yml
输出包含标准化头部 + Playbook 内容。
vim/cat/echo 等任意方式创建脚本文件,头部自动插入;.sh/.py/.yml/.yaml 三种运维常用脚本类型;.sh/.py 文件自动赋予 chmod +x 权限;.bashrc 中管理,修改后 source 即可生效。提交时按以下格式填写信息,便于追溯历史:
cd /root/scripts
# 新增脚本
git commit -m "feat(shell): 新增 CentOS 下 Nginx 安装脚本 v1.0"
# 修复脚本 bug
git commit -m "fix(ansible): 修复 vmware_create_vm.yml 磁盘参数错误"
# 更新脚本功能
git commit -m "update(python): 优化 log_analyzer.py 日志解析效率"
# 归档废弃脚本
git commit -m "archive(shell): 归档 old_backup.sh 到 archive 目录"
# 1. 新增/修改脚本后提交
git add .
# 添加所有修改文件
git commit -m "描述"
# 提交到本地仓库
# 2. 推送到 Gitee(后续无需加-u)
git push origin master
# 3. 从 Gitee 拉取最新版本(多设备同步)
git pull origin master
# 4. 查看提交历史
git log
# 或 git log --oneline(简洁格式)
# 5. 回滚到指定版本
git reset --hard 版本号(从 git log 获取)
ssh -T [email protected] 是否成功Automatic merge failedgit checkout --ours 文件名 保留本地版本,或手动编辑冲突文件rm -rf ~/scripts
git clone [email protected]:<your_gitee_username>/script-repo-name.git ~/scripts
.bashrc 配置未生效,未重启终端/系统;find 命令的 maxdepth 限制过严;zsh 终端,配置未写入 ~/.zshrc。source ~/.bashrc 或重启系统;maxdepth 50 调大(如 100);zsh 用户将配置写入 ~/.zshrc 并执行 source ~/.zshrc。通过本文操作,你已搭建起一套标准化、可复用、可追溯、可跨主机迁移的脚本管理体系:
PROMPT_COMMAND 钩子,无需 touch,任意方式创建脚本文件都自动插入标准化头部,并赋予执行权限;
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online