精益求精:使用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++】:类和对象(中)之类的默认成员函数——构造函数and析构函数

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

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

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

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

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

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

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

KubeSphere安装mysql8

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

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…

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

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

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

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

【数据结构】队列(C语言实现)

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 队列 1. 队列的概念及结构…

搜维尔科技:Varjo-探讨汽车工业使用虚拟现实/XR的可能性

新的 奇亚EV9 被定位为起亚有史以来最豪华的车型。在一次活动中,起亚通过向芬兰媒体、利益相关者和经销商网络推出新的汽车车型(起亚EV9,EV9是一款高度超过5米的全电动车,拥有100千瓦的电池、快速充电能力、2500公斤的拖曳能力和7公斤的座位--这在市场上是一个独特的…

常见问题-找不到vcruntime140.dll无法继续执行代码解决方案

本文将介绍五种不同的解决方案,帮助大家解决这个问题。 首先,我们需要了解为什么会出现找不到vcruntime140.dll的情况。这种情况通常是由于以下几个原因导致的: 1. 系统环境变量设置不正确:系统环境变量中可能没有包含vcruntime…

jvm的jshell,学生的工具

jshell 在我眼里,只能作为学校教学的一个玩具,事实上官方也做了解释,以下是官方的解释: 在学习编程语言时,即时反馈很重要,并且 它的 API。学校引用远离Java的首要原因 教学语言是其他语言有一个“REPL”…

轻量级导出 Excel 标准格式

一般业务系统中都有导出到 Excel 功能,其实质就是把数据库里面一条条记录转换到 Excel 文件上。Java 常用的第三方类库有 Apache POI 和阿里巴巴开源的 EasyExcel 等。另外也有通过 Web 模板技术渲染 Excel 文件导出,这实质是 MVC 模式的延伸&#xff0c…