当前位置: 首页 > 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…...

企业数字化转型时,会遇到的5大挑战

企业数字化转型时&#xff0c;会遇到的5大挑战添加链接描述 数字化转型已然是当今商业战略的一大基石&#xff0c;根据Gartner的《2023年度董事会调查》显示&#xff0c;有89%的企业将数字业务视为其增长的核心。但该研究的另一项统计数据也显示&#xff1a;在这些企业中&…...

动态语句 sqlserver

EXEC sp_executesql DynamicSQL, NFirstName NVARCHAR(50), LastName NVARCHAR(50), FirstName, LastName在EXEC sp_executesql语句中&#xff0c;后面的参数需要按特定顺序传递。这些参数的顺序如下&#xff1a; 1.第一个参数是动态SQL语句本身&#xff0c;通常是一个NVARCHA…...

【一文清晰】单元测试到底是什么?应该怎么做?

我是java程序员出身&#xff0c;后来因为工作原因转到到了测试开发岗位。测试开发工作很多年后&#xff0c;现在是一名自由职业者 1、什么是单元测试 2、该怎么做单元测试 一、什么是单元测试&#xff1f; 单元测试&#xff08;unit testing&#xff09;&#xff0c;是指对软件…...

二、基于PCL的RANSAC拟合点云中所有直线或平面——3D点云处理系列

RANSAC原理&#xff1a;略。 其他博客大多都是介绍拟合单条直线或平面的代码案例&#xff0c;本文介绍如何拟合多条直线或平面&#xff0c;其实是在单个拟合的基础上接着拟合&#xff0c;以此类推。 注意&#xff1a;步骤中的直线模型是每次随机在点云中取点计算的。 步骤&…...

Linux实用指令-指定运行级别、帮助指令

一、 指定运行级别 1.运行级别说明&#xff1a; 0:关机 1:单用户[找回丢失密码] 2:多用户状态没有网络服务 3:多用户状态有网络服务 4:系统未使用保留给用户 5:图形界面 6:系统重启 常用运行级别是3和5&#xff0c;要修改默认的运行级别。可改文件/etc/inittab 的id:5:initd…...

【LeetCode】2562. 找出数组的串联值

难度&#xff1a;简单 题目 给你一个下标从 0 开始的整数数组 nums 。 现定义两个数字的 串联 是由这两个数值串联起来形成的新数字。 例如&#xff0c;15 和 49 的串联是 1549 。 nums 的 串联值 最初等于 0 。执行下述操作直到 nums 变为空&#xff1a; 如果 nums 中存…...

Hive知识梳理(好文)

Hive是建立在 Hadoop 上的数据仓库基础构架。可以将SQL查询转换为MapReduce的job在Hadoop集群上执行。 元数据 Hive元数据信息存储在Hive MetaStore中&#xff0c;或者mysql中。 分隔符 Hive默认的分格符有三种&#xff0c;分别是&#xff08;Ctrl/A&#xff09;、&#xff0…...

GitHub仓库的README文件无法显示图片问题-非域名污染原因

之前上自己仓库就偶然发现图片不显示现象&#xff0c;当时以为是网络问题就没有留意这事。但是一直不显示就有问题了&#xff01;于是网上搜了一遭&#xff0c;看见大家遇到此现象的原因普遍归于DNS污染1而我的问题原来是MarkDown格式&#xff01; 在图片语法前不要加分区语法…...

opencv入门到精通——图片,视频,摄像头的读取与保存

简介 OpenCV是一个流行的开源计算机视觉库&#xff0c;由英特尔公司发起发展。它提供了超过2500个优化算法和许多工具包&#xff0c;可用于灰度、彩色、深度、基于特征和运动跟踪等的图像处理和计算机视觉应用。OpenCV主要使用C语言编写&#xff0c;同时也支持Python、Java、C等…...

Android 13.0 开机动画支持mp4格式视频作为开机动画播放

1.概述 在13.0的系统产品开发中,在系统开机动画这块一般情况下都是播放开机图片,然后绘制多张开机图片形成开机动画模式,而产品需求要求支持开机mp4格式的短视频来作为开机动画播放视频来介绍产品情况,就需要用开机视频来替代开机动画来实现功能 2.开机动画支持mp4格式视频…...