精益求精:使用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数据的安全性和完整性。在实际应用过程中,这种备份策略还可以根据需要进行定制和扩展,以满足不同场景下的需求。希望这篇博客对大家有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/112308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(N-128)基于springboot,vue酒店管理系统

开发工具:IDEA 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 系统分前后台,项目采用前后端分离 前端技术:vueelementUI 服务端技术:springbootmybatis 本系统功…

C语言柔性数组

大家好,我们今天来补充一个知识,就是柔性数组。 柔性数组概念: 也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。 C99 中,结构中的最后一个元素允许是未知大小的数…

【c++】跟webrtc学std array 4: H264PacketBuffer 包缓存

H264PacketBuffer m98代码:H264PacketBuffer 类似于PacketBuffer ,但仅用于H264// The H264PacketBuffer does the same job as the PacketBuffer but for H264 // only. To make it fit in with surronding code the PacketBuffer input/output // classes are used. 因此,…

【C++】:类和对象(中)之类的默认成员函数——构造函数and析构函数

1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数 默认成员函数:用户没有显式实现,编译器会生成…

斯坦福JSKarel编程机器人使用介绍

斯坦福JSKarel编程机器人使用介绍 为了避免被编程语言固有的复杂性所困扰,有一个被称为卡雷尔(Karel)机器人的微型世界(microworld)的简化环境,可以让编程初学者从中学习理解编程的基本概念,而…

ES6 let const var和解构赋值

1.let/const和var的区别 1.变量提升:var会发生变量提升,let和const不存在变量提升 2.暂时性死区:变量声明之前变量不可用称为暂时性死区。var不存在,let和const存在暂时性死区 3.typeof 不再是百分百不会报错:let声…

unity(WebGL) 截图拼接并保存本地,下载PDF

截图参考:Unity3D 局部截图、全屏截图、带UI截图三种方法_unity 截图_野区捕龙为宠的博客-CSDN博客 文档下载: Unity WebGL 生成doc保存到本地电脑_unity webgl 保存文件_野区捕龙为宠的博客-CSDN博客 中文输入:Unity WebGL中文输入 支持输…

Peter算法小课堂—正整数拆分

大家可能会想:正整数拆分谁不会啊,2年级就会了,为啥要学啊 例题 正整数拆分有好几种,这里我们列举两种讲。 关系 我们看着第一幅图,头向左转90,记住你看到的图,再来看第二幅图,你…

KubeSphere安装mysql8

需要持久化储存数据的,建立有状态服务。 无状态服务是不会持久化的,重启就归零 KubeSphere 创建自建应用后,创建有状态服务,但是自己应用的有状态服务不能外放端口,需要在服务哪里删除pod,在创建负载指定相关的有状态服务,就可以外放端口了 安装mysql8 添加初始化密码参…

Linux软件包名称含AMD,ARM,x64的详解

下载clickhouse-backup时看到不同软件包,有的是x86,有的是amd64,有的是arm64,这些有啥区别呢? clickhouse-backup-2.4.2-1.x86_64.rpm clickhouse-backup_2.4.2_amd64.deb clickhouse-backup_2.4.2_arm64.deb x86 和 …

Nmap端口服务 之 CentOS7 关于启动Apache(httpd)服务、telnet服务、smtp服务、ftp服务、sftp服务

Nmap端口服务 之 CentOS7 关于启动Apache(httpd)服务、telnet服务、smtp服务、ftp服务、sftp服务 一. CentOS7 安装配置SFTP服务器详解一、SFTP简介二、关闭防火墙三、安装SSH服务在CentOS7中,sftp只是ssh的一部分,所以采用yum来安装ssh服务即可1. 查看是否已经安装了ssh2.…

狄克斯特拉(Dijkstra) 算法 php实现

《算法图解》中提到的狄克斯特拉算法,用php实现。 一 原理及解释 根据示例图求出起点到终点的最小耗费路径。 因为涉及每条路径的权重,所以这种算法仅适合有向路径。 所谓有向路径,指仅从起点指向终点的路径。 相对的无向路径&#xff0…

【面试题笔记】C++继承和多态常见高频经典面试题

1.继承相关习题 1.1 什么是菱形继承?菱形继承的问题是什么? 菱形继承:菱形继承是多继承的一种特殊情况。两个中间类继承父类,而派生类继承了两个中间类,从而在继承关系上呈现出一种菱形。如下图所示: **…

ZKP3.2 Programming ZKPs (Arkworks Zokrates)

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 3: Programming ZKPs (Guest Lecturers: Pratyush Mishra and Alex Ozdemir) 3.3 Using a library ( tutorial) R1CS Libraries A library in a host language (Eg: Rust, OCaml, C, Go, …)Key type: constraint system Mai…

光伏三相并网逆变器的控制策略与性能分析(Simulink仿真实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

24、Flink 的table api与sql之Catalogs(java api操作分区与函数、表)-4

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

MySQL基本操作之创建数据表

设计表: 学生表(Student): 学号(StudentID)- 主键,用于唯一标识每个学生姓名(Name)性别(Gender)年龄(Age)出生日期(BirthDate)地址(Address)电话(Phone)邮箱(Email)课程表(Course): 课程号(CourseID)- 主键,用于唯一标识每门课程课程名(CourseNam…

利用Spring Boot框架做事件发布和监听

一、编写事件 1.编写事件类并集成spring boot 事件接口,提供访问事件参数属性 public class PeriodicityRuleChangeEvent extends ApplicationEvent {private final JwpDeployWorkOrderRuleDTO jwpDeployWorkOrderRuleDTO;public PeriodicityRuleChangeEvent(Obje…

基于Java的师生交流答疑管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding) 代码参考数据库参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

攻防世界web篇-Training-WWW-Robots

直接点击给出的地址,然后会转到另一个网页界面,在这个界面,已经给出了提示,robots.txt 在浏览器中,直接在地址的后面加上robots.txt,会进到下面这个界面 因为对php语言一窍不通,所以这里纯粹就…