当前位置: 首页 > news >正文

精益求精:使用Ansible集中式自动备份核心数据

1、引言

在当今数字化时代,数据是企业和组织的核心资产。为了确保数据的安全性和可恢复性,备份是至关重
要的。然而,手动备份数据可能会繁琐且容易出错,特别是在面对大规模和分布式的数据存储情况下。幸运的是,Ansible作为一种自动化工具,能够帮助我们轻松实现核心数据的集中式自动备份。本文将深入探讨如何使用Ansible来自动备份核心数据,确保数据安全无忧。

2、背景

公司有一些核心数据需要备份,比如,gitlab,wiki,MySQL,MongoDB等等数据库。

为了防止数据丢失或损坏,我们需要定期备份GitLab数据。备份的内容通常包括Git存储库、配置文件、数据库等

之前方案:

在每台相关的机器上备份,任务分散,数据不容易管理,存储

现在方案:

采用一台机器,设置定时任务,把备份数据归档到同一地方存储,统一管理

在这里插入图片描述
使用Ansible自动备份GitLab具有以下优点:

  • 提高效率:使用Ansible可以自动备份,无需手动执行备份操作。

  • 提高可靠性:通过Ansible自动化备份可以减少人为错误,提高备份的可靠性。

  • 充分利用资源:Ansible可以在多个主机上并行执行任务,充分利用资源提高效率。

3、方案实现

  1. 编写Ansible Playbook:在Playbook中定义需要备份的文件和路径,以及备份的文件存储位置。

  2. 执行Ansible Playbook:通过执行Playbook来自动备份GitLab。

  3. 验证备份:检查备份文件是否已正确存储,并确保文件可用于恢复。

1、基础环境

backupGitlab.yml  group_vars  hosts
[root@ansible-yunwei backupData]# tree .
.
├── backupGitlab.yml
├── group_vars
│?? └── all
└── hosts

在这里插入图片描述
创建hosts主机

[gitlab]
192.168.xx.xx ansible_ssh_user=root ansible_ssh_pass="xxxx.xx"[confluence]
192.168.xx.xx ansible_ssh_user=root ansible_ssh_pass="xxxx.xx"[uatmysql]
192.168.xx.xx ansible_ssh_user=root ansible_ssh_pass="xxx.xx"[uatmongo8449]
192.168.xx.xx ansible_ssh_user=root ansible_ssh_pass="xxxx.xx"[uatmongo9942]
192.168.xxx.xx ansible_ssh_user=root ansible_ssh_pass="xxxxx.xx"

定义变量环境

# gitlab备份存放目录
gitlabBackupDir: /data/backup/gitlab# confluence备份存放目录
confluenceBackupDir: /data/backup/confluence# uat环境mysql备份存放目录
uatMysqlBackupDir: /data/backup/uatmysql# uat环境mongo(192.168.84.xx)备份存放目录
uatMongo8449BackupDir: /data/backup/uatmongo8449# uat环境mongo(192.168.99.xx)备份存放目录
uatMongo9942BackupDir: /data/backup/uatmongo9942# 备份结果记录文件
statusFile: /data/backup/backupStatus

2、编写Ansible Playbook

  1. 获取当前日期,创建备份目录。
  2. 生成GitLab备份文件并拉取至本地备份目录。
  3. 拉取GitLab配置文件并存储在备份目录中。
  4. 删除原始备份文件及旧备份文件。
  5. 记录备份完成状态
[root@ansible-yunwei backupData]# cat backupGitlab.yml 
- name: 备份gitlabhosts: gitlabremote_user: roottasks:- name: 获取当日日期local_action: shell date +%Y%m%dargs:warn: noregister: date- name: 本机创建备份目录local_action: file path={{gitlabBackupDir}}/{{date.stdout}} state=directory owner=root group=root mode=0700- name: 生成gitlab备份shell: gitlab-backup create STRATEGY=copyargs:warn: no- name: 获取文件名find: paths=/var/opt/gitlab/backups/ recurse=no patterns='*.tar'register: backupFile- name: 拉取备份文件fetch: src={{item.path}} dest={{gitlabBackupDir}}/{{date.stdout}}/ flat=Truewith_items:- '{{backupFile.files}}'- name: 拉取配置文件fetch: src={{item}} dest={{gitlabBackupDir}}/{{date.stdout}}/ flat=Truewith_items:- /etc/gitlab/gitlab.rb- /etc/gitlab/gitlab-secrets.json- name: 删除原始文件file: path={{item.path}} state=absentwith_items:- '{{backupFile.files}}'- name: 查找旧的备份local_action: find paths={{gitlabBackupDir}}/ recurse=no patterns='*' age=3d age_stamp=mtime file_type=directoryregister: backupDir- name: 删除旧的备份local_action: file path={{item.path}} state=absentwith_items:- '{{backupDir.files}}'- name: 记录备份完成状态local_action: shell if [ ! "`ls -A {{gitlabBackupDir}}/{{date.stdout}}`" = "" ]; then echo '{{date.stdout}}:successful:gitlab' >> {{statusFile}} ; else echo '{{date.stdout}}:failed:gitlab' >> {{statusFile}} ; fiargs:warn: no

3、执行ansible-playbook

/usr/local/python36/bin/ansible-playbook /opt/ansible/backupData/backupGitlab.yml -i /opt/ansible/backupData/hosts 2>&1 >> /data/backup/backup.log

4、设置定时任务

1  0 * * * /usr/local/python36/bin/ansible-playbook /opt/ansible/backupData/backupGitlab.yml -i /opt/ansible/backupData/hosts 2>&1 >> /data/backup/backup.log

5、执行结果

在这里插入图片描述

4、备份其余类型

backupConfluence.yml

- name: 备份confluencehosts: confluenceremote_user: roottasks:- name: 获取当日日期local_action: shell date +%Y%m%dargs:warn: noregister: date- name: 获取用于模式匹配的当日日期local_action: shell date +%Y_%m_%dargs:warn: noregister: datePattern- name: 本机创建备份目录local_action: file path={{confluenceBackupDir}}/{{date.stdout}} state=directory owner=root group=root mode=0700- name: 获取文件名find: paths=/var/atlassian/application-data/confluence/backups/ recurse=no patterns='backup-{{datePattern.stdout}}.zip'register: backupFile- name: 拉取备份文件fetch: src={{item.path}} dest={{confluenceBackupDir}}/{{date.stdout}}/ flat=Truewith_items:- '{{backupFile.files}}'- name: 查找旧的备份local_action: find paths={{confluenceBackupDir}}/ recurse=no patterns='*' age=3d age_stamp=mtime file_type=directoryregister: backupDir- name: 删除旧的备份local_action: file path={{item.path}} state=absentwith_items:- '{{backupDir.files}}'- name: 记录备份完成状态local_action: shell if [ ! "`ls -A {{confluenceBackupDir}}/{{date.stdout}}`" = "" ]; then echo '{{date.stdout}}:successful:confluence' >> {{statusFile}} ; else echo '{{date.stdout}}:failed:confluence' >> {{statusFile}} ; fiargs:warn: no

** backupUatMongo8449.yml**

- name: 备份uat环境mongo数据库(192.168.xx.xx)hosts: uatmongo8449remote_user: roottasks:- name: 获取当日日期local_action: shell date +%Y%m%dargs:warn: noregister: date- name: 本机创建备份目录local_action: file path={{uatMongo8449BackupDir}}/{{date.stdout}} state=directory owner=root group=root mode=0700- name: 生成备份shell: mongodump --host '192.168.xx.xx' --port '27017' -u 'root' -p 'xxx' --authenticationDatabase 'admin' --gzip -o /tmp/uatmongo8449-{{date.stdout}}args:warn: no- name: 进行打包archive: path=/tmp/uatmongo8449-{{date.stdout}} dest=/tmp/uatmongo8449-{{date.stdout}}.tar format=tar remove=True- name: 拉取备份文件fetch: src=/tmp/uatmongo8449-{{date.stdout}}.tar dest={{uatMongo8449BackupDir}}/{{date.stdout}}/ flat=True- name: 删除原始文件file: path={{item}} state=absentwith_items:- '/tmp/uatmongo8449-{{date.stdout}}.tar'- '/tmp/uatmongo8449-{{date.stdout}}'- name: 查找旧的备份local_action: find paths={{uatMongo8449BackupDir}}/ recurse=no patterns='*' age=3d age_stamp=mtime file_type=directoryregister: backupDir- name: 删除旧的备份local_action: file path={{item.path}} state=absentwith_items:- '{{backupDir.files}}'- name: 记录备份完成状态local_action: shell if [ ! "`ls -A {{uatMongo8449BackupDir}}/{{date.stdout}}`" = "" ]; then echo '{{date.stdout}}:successful:uatMongo8449' >> {{statusFile}} ; else echo '{{date.stdout}}:failed:uatMongo8449' >> {{statusFile}} ; fiargs:warn: no

** backupUatMysql.yml**

- name: 备份uat环境mysql数据库hosts: uatmysqlremote_user: roottasks:- name: 获取当日日期local_action: shell date +%Y%m%dargs:warn: noregister: date- name: 本机创建备份目录local_action: file path={{uatMysqlBackupDir}}/{{date.stdout}} state=directory owner=root group=root mode=0700- name: 生成备份shell: mysqldump -h'192.168.1xx.xxx' -u'root' -p'xxxx' --single-transaction --flush-logs --master-data=2 --events --routines --triggers --hex-blob --all-databases | gzip > /tmp/uatmysql-{{date.stdout}}.sql.gzargs:warn: no- name: 拉取备份文件fetch: src=/tmp/uatmysql-{{date.stdout}}.sql.gz dest={{uatMysqlBackupDir}}/{{date.stdout}}/ flat=True- name: 删除原始文件file: path=/tmp/uatmysql-{{date.stdout}}.sql.gz state=absent- name: 查找旧的备份local_action: find paths={{uatMysqlBackupDir}}/ recurse=no patterns='*' age=3d age_stamp=mtime file_type=directoryregister: backupDir- name: 删除旧的备份local_action: file path={{item.path}} state=absentwith_items:- '{{backupDir.files}}'- name: 记录备份完成状态local_action: shell if [ ! "`ls -A {{uatMysqlBackupDir}}/{{date.stdout}}`" = "" ]; then echo '{{date.stdout}}:successful:uatMysql' >> {{statusFile}} ; else echo '{{date.stdout}}:failed:uatMysql' >> {{statusFile}} ; fiargs:warn: no
[root@kvm-master backupData]# crontab -l
# 备份数据:Gitlab、Confluence、uat环境mysql(192.168.1xx.xx)、uat环境mongo(192.168.xx.xx) (每天执行一次)
1  0 * * * /usr/local/python36/bin/ansible-playbook /opt/ansible/backupData/backupGitlab.yml -i /opt/ansible/backupData/hosts 2>&1 >> /data/backup/backup.log
10 0 * * * /usr/local/python36/bin/ansible-playbook /opt/ansible/backupData/backupConfluence.yml -i /opt/ansible/backupData/hosts 2>&1 >> /data/backup/backup.log
20 0 * * * /usr/local/python36/bin/ansible-playbook /opt/ansible/backupData/backupUatMysql.yml -i /opt/ansible/backupData/hosts 2>&1 >> /data/backup/backup.log
30 0 * * * /usr/local/python36/bin/ansible-playbook /opt/ansible/backupData/backupUatMongo8449.yml -i /opt/ansible/backupData/hosts 2>&1 >> /data/backup/backup.log
40 0 * * * /usr/local/python36/bin/ansible-playbook /opt/ansible/backupData/backupUatMongo9942.yml -i /opt/ansible/backupData/hosts 2>&1 >> /data/backup/backup.log

5、总结

通过上述自动化备份策略,我们可以有效地保护Gitlab数据的安全性和完整性。在实际应用过程中,这种备份策略还可以根据需要进行定制和扩展,以满足不同场景下的需求。希望这篇博客对大家有所帮助!

相关文章:

精益求精:使用Ansible集中式自动备份核心数据

1、引言 在当今数字化时代,数据是企业和组织的核心资产。为了确保数据的安全性和可恢复性,备份是至关重 要的。然而,手动备份数据可能会繁琐且容易出错,特别是在面对大规模和分布式的数据存储情况下。幸运的是,Ansibl…...

大数据高级面试题

大数据高级面试题 Kafka的producer如何实现幂等性? Producer 幂等性 Producer 的幂等性指的是当发送同一条消息时,数据在 Server 端只会被持久化一次,数据不丟不重,但是这里的幂等性是有条件的: 只能保证 Producer 在单个会话内…...

如何拦截响应内容并修改响应头

背景及需求描述 背景 记录分享下近期遇到并解决的困扰了比较久的问题:在不同系统微信生态发现同一个cos地址用window.open(url)打开在苹果和安卓设备的微信生态上表现不一致:对于文档类型,响应头Content-Type: application/pdf 在安卓微信上…...

分类预测 | Matlab实现WOA-GRU鲸鱼算法优化门控循环单元的数据多输入分类预测

分类预测 | Matlab实现WOA-GRU鲸鱼算法优化门控循环单元的数据多输入分类预测 目录 分类预测 | Matlab实现WOA-GRU鲸鱼算法优化门控循环单元的数据多输入分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现WOA-GRU鲸鱼算法优化门控循环单元的数据多输入…...

特定深度节点链表

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 经典BFS与简单链表结合的题目。 #define MAX_DEPTH (1000)struct ListNode** listOfDepth(struct TreeNode* tree, int* returnSize) {*returnSize 0;struct ListNode **ans (…...

【css】背景换颜色

更换前 longin.html <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>login</title><link href"/css/style.css" type"text/css" rel"stylesheet"><s…...

什么是美颜sdk?直播实时美颜sdk的工作流程和架构分析

在现代社交媒体和娱乐行业中&#xff0c;直播已经成为了一种受欢迎的娱乐形式&#xff0c;同时实时美颜也变得越来越重要。直播实时美颜SDK的工作流程和架构在这一领域起到了关键作用。本文将深入探讨这些SDK的内部机制&#xff0c;从而理解它们如何为用户提供出色的美颜效果。…...

第二证券:跌破3000点,热搜第一!

今天上午&#xff0c;“沪指开盘跌破3000点关口”冲上百度热搜榜榜首。 上午收盘&#xff0c;上证指数下跌0.27%&#xff0c;报2997.22点&#xff1b;深证成指下跌0.36%&#xff0c;创业板指下跌0.44%。 赛道股发力&#xff0c;光伏、风电、新能源轿车等板块盘中冲高。房地产…...

IJCAI2023【基于双曲空间探索的非独立同分布联邦学习】

1、介绍汇报的主题及汇报者 2、粗略介绍面临的挑战及出发点 3、介绍一下预备知识 4、解决方案 5、总览 6、实验设置 7、实验 8、结论...

实现Linux下Word转PDF、Java调用命令方式

使用 LibreOffice 实现 Word 转 PDF 和 Java 调用命令 1、 安装 LibreOffice 外网安装 # 一键安装 yum install -y libreoffice # 验证版本 libreoffice --version # Warning: -version is deprecated. Use --version instead. # LibreOffice 7.5.6.2 f654817fb68d6d4600d7…...

Java并发-06-AQS(AbstractQueuedSynchronizer)相关

1-概述 AQS全称是 AbstractQueuedSynchronizer&#xff0c;是阻塞式锁和相关的同步器工具的框架。同步器的设计是基于模板方法模式的&#xff0c;也就是说&#xff0c;使用者需要继承同步器并重写指定的方法&#xff0c;随后将同步器组合在自定义同步组件的实现中&#xff0c;并…...

【Python接口自动化】--深入了解HTTP接口基本组成和网页构建原理

引言 Python接口自动化有着广泛的应用场景&#xff0c;但是在实际使用过程中&#xff0c;可能会出现一些问题。比如&#xff0c;你不知道HTTP接口的基本构成&#xff0c;也不清楚网页是如何构建的。 这时&#xff0c;你就需要深入了解HTTP接口的基本组成和网页构建原理。通过本…...

window mysql5.7.27 启用SSL openssl mysql_ssl_rsa_setup

应客户监管部门要求 mysql必须要启用SSL。由于mysql安装在window上&#xff0c;启用过程中遇到了不少的坑&#xff0c;在此记录一下。 安装openssl 如果已经安装过可跳过此步 https://slproweb.com/download/Win64OpenSSL-1_1_1w.msi复制到浏览器下载后安装即可。如果需要其他…...

性能测试-JMeter分布式测试及其详细步骤

性能测试概要 性能测试是软件测试中的一种&#xff0c;它可以衡量系统的稳定性、扩展性、可靠性、速度和资源使用。它可以发现性能瓶颈&#xff0c;确保能满足业务需求。很多系统都需要做性能测试&#xff0c;如Web应用、数据库和操作系统等。 性能测试种类非常多&#xff0c…...

学习gin-vue-admin之创建api和swagger

文章目录 go:generateViper 读写配置文件ZAP 保存日志定时任务创建apimodel步骤 1. 创建service步骤 2. 创建api步骤 3. 创建router 初始化总路由启动go-swagger路由配置swag init test将嵌套结构定义为指针或对象利弊结构体嵌套学习资源 go:generate //go:generate go env -w …...

2023-10-17 mysql-innodb-解析write_row的record的一行数据-分析

摘要: 2023-10-17 mysql-innodb-解析write_row的record的一行数据-分析. record是一行数据的序列化后的一整个字节流, 在innodb中需要解读出字段. 本文分析如何解析record, 以便学习这种技巧. row_mysql_store_col_in_innobase_format 调用堆栈: #0 row_mysql_store_col_in…...

认识web自动化测试!

1.什么是自动化测试&#xff1f; 自动化测试的概念: 软件自动化测试就是通过测试工具或者其他手段&#xff0c;按照测试人员的预定计划对软件产品进行自动化测试&#xff0c;他是软件测试的一个重要组成部分&#xff0c;能够完成许多手工测试无法完成或者难以实现的测试工作&a…...

多商户进驻小程序商城的作用是什么

多商户进驻商城简单来说就是在一个商城里&#xff0c;由经营者邀请同行、异业商家进驻到商城里&#xff08;子商户&#xff09;&#xff0c;可丰富商城经营业态&#xff0c;满足客户多方购物需求&#xff0c;打造购物商圈及经营者获得更多收益等。 通过【雨科】平台的多商户进驻…...

接口响应慢该如何排查

不知道大家有没有遇到这种情况&#xff0c;接口业务逻辑写完后&#xff0c;用 postman 一调&#xff0c;发现接口响应时间好长&#xff0c;不得不对接口进行优化。但是此时接口的代码往往逻辑比较复杂&#xff0c;调用层次也比较多&#xff0c;很难定位到耗时较长的代码块。 遇…...

spring boot MongoDB实战

文章目录 项目搭建文章评论实体类的编写文章评论的基本增删改查根据上级ID查询文章评论的分页列表MongoTemplate实现评论点赞 GITHUB 项目搭建 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0&q…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...

在Spring Boot中集成RabbitMQ的完整指南

前言 在现代微服务架构中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件&#xff0c;支持多种消息协议&#xff0c;具有高可靠性和可扩展性。 本博客将详细介绍如何在 Spring Boot 项目…...

Excel 怎么让透视表以正常Excel表格形式显示

目录 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总...

软件工程教学评价

王海林老师您好。 您的《软件工程》课程成功地将宏观的理论与具体的实践相结合。上半学期的理论教学中&#xff0c;您通过丰富的实例&#xff0c;将“高内聚低耦合”、SOLID原则等抽象概念解释得十分透彻&#xff0c;让这些理论不再是停留在纸面的名词&#xff0c;而是可以指导…...

大语言模型解析

1. Input Embedding embedding&#xff1a;将自然语言翻译成index 每个index对应一个embedding&#xff0c;embedding需要训练&#xff0c;embedding是一个数组...

设备健康管理的范式革命:中讯烛龙全链路智能守护系统

当工业设备的“亚健康”状态导致隐性产能损失高达23%时&#xff0c;中讯烛龙推出 ​​“感知-诊断-决策-闭环”四位一体解决方案&#xff0c;让设备全生命周期健康管理成为企业增长的隐形引擎。 一、行业痛点&#xff1a;传统运维的三大断层 1. 健康感知盲区 某风电场因无法捕…...