CentOS 软连接的自动化工具与实现方案
一、工具选型与适用场景
二、快速上手示例
Shell 脚本通用模板(幂等、可覆盖)
#!/usr/bin/env bash
set -Eeuo pipefail
usage() { echo "Usage: $0 <source> <link>"; exit 1; }
[[ $# -eq 2 ]] || usage
src=$1; link=$2
if [[ ! -e $src ]]; then
echo "ERROR: Source does not exist: $src" >&2
exit 2
fi
# 若目标是符号链接或普通文件/目录,先移除再建链(可按需改为仅对链接做 rm -f)
if [[ -e $link || -L $link ]]; then
rm -rf -- "$link"
fi
ln -s "$src" "$link"
echo "Created symlink: $link -> $src"
使用:chmod +x create_symlink.sh && ./create_symlink.sh /path/to/src /path/to/link。
Ansible Playbook(幂等)
---
- name: Ensure symlink exists
hosts: all
become: yes
tasks:
- name: Create symlink
ansible.builtin.file:
src: /path/to/source
dest: /path/to/target
state: link
force: yes # 需要时覆盖已存在目标
运行:ansible-playbook -i inventory setup_symlinks.yml。
Python 脚本(便于嵌入自动化平台)
#!/usr/bin/env python3
import os, sys
def main():
if len(sys.argv) != 3:
print(f"Usage: {sys.argv[0]} <source> <link>")
sys.exit(1)
src, link = sys.argv[1], sys.argv[2]
if not os.path.exists(src):
sys.exit(f"ERROR: Source does not exist: {src}")
try:
os.symlink(src, link)
print(f"Created symlink: {link} -> {src}")
except FileExistsError:
print(f"ERROR: Link already exists: {link}")
sys.exit(2)
if __name__ == "__main__": main()
使用:python3 create_symlink.py /path/to/src /path/to/link。
三、定时与常驻自动化
Cron 定时执行
# 每小时检查并修复软连接
0 * * * * /usr/local/bin/create_symlink.sh /opt/app/current /var/www/html
编辑:crontab -e,确保脚本具备可执行权限与日志路径可写。
Systemd 定时器(替代 Cron,便于日志与依赖管理)
# /etc/systemd/system/symlink-manager.service
[Unit]
Description=Symlink Manager
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/create_symlink.sh /opt/app/current /var/www/html
RemainAfterExit=yes
# /etc/systemd/system/symlink-manager.timer
[Unit]
Description=Run symlink manager hourly
[Timer]
OnCalendar=hourly
Persistent=true
[Install]
WantedBy=timers.target
启用:systemctl daemon-reload && systemctl enable --now symlink-manager.timer。
四、生产实践与注意事项
ln -sfn 或先 rm -f 再建链,但要避免误删非链接的真实目录/文件。