综合架构4 - Ansible批量部署NFS、RSYNC全网备份

Ansible的介绍

ansible是一款自动化运维工具,基于Python开发,默认通过SSH协议管理机器,因此,客户端无需任何配置,管理端配置好后即可使用,可以实现批量系统设置、批量程序部署、批量执行命令等功能。

Ansible的特点

  1、ansible不需要单独安装客户端,也不需要启动任何服务
  2、ansible是python中的一套完整的自动化执行任务模块
  3、ansible playbook 采用yaml配置,对于自动化任务执行过程一目了然

 

Ansible组成结构

  • Ansible

  是Ansible的命令工具,核心执行工具;一次性或临时执行的操作都是通过该命令执行。

  • Ansible Playbook

  任务剧本(又称任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,yaml格式。

  • Inventory

  Ansible管理主机的清单,默认是/etc/ansible/hosts文件。

  • Modules

  Ansible执行命令的功能模块,Ansible2.3版本为止,共有1039个模块。还可以自定义模块。

  • Plugins

  插件,模块功能的补充,常有连接类型插件,循环插件,变量插件,过滤插件,插件功能用的较少。

  • API

  提供给第三方程序调用的应用程序编程接口。

综合架构4 - Ansible批量部署NFS、RSYNC全网备份

 

Ansible的应用环境

  • 应用代码自动化部署
  • 系统管理配置自动化
  • 支持持续交付自动化
  • 支持云计算,大数据平台环境
  • 批量任务执行可以写成脚本,不用分发到远程就可以执行
  • 支持非root用户管理操作,支持sudo
  • 使用python编写,维护更简单。

 

Ansible部署NFS共享存储

环境准备:

一台存储服务器: IP: 172.16.1.31  主机名:nfs01

一台web服务器: IP: 172.16.1.7     主机名:web01

 

nfs安装步骤:

服务器端

第一步:下载安装rpcbind、nfs-utils

第二步:编写配置文件

第三步:创建存储目录,并将属主修改为nfsnobody

第四步:启动服务

 

客户端:

第一步:下载安装rpcbind nfs-utils

第二步:挂载远程存储

 

编写主机清单:

[root@m01 ~]# vim /etc/ansible/hosts #定义可以管理的主机清单 [nfs-server] 172.16.1.31   [nfs-client] 172.16.1.7 #172.16.1.8 #172.16.1.9   [nfs:children] nfs-server nfs-client

 

编写NFS服务剧本:

第一个历程:创建目录结构 [root@m01 ~]# mkdir -p /etc/ansible/roles/{nfs,nfs_server,nfs_client}/{files,handlers,tasks,templates,vars}               --- 创建角色目录下面的子目录 [root@backup ~]# tree /etc/ansible/roles/ /etc/ansible/roles/ ├── nfs                    │   ├── files       --- 保存需要分发文件目录 │   ├── handlers    --- 保存触发器配置文件信息 │   ├── tasks       --- 保存要执行的动作信息文件 │   ├── templates   --- 保存需要分发模板文件,模板文件中可以设置变量信息 │   └── vars        --- 保存变量信息文件 ├── nfs_client │   ├── files │   ├── handlers │   ├── tasks │   ├── templates │   └── vars ├── nfs_server     ├── files     ├── handlers     ├── tasks     └── vars   第二个历程:在roles目录中创建相关文件 nfs公共部分: 1)编写tasks目录中的main.yml [root@m01 roles]# cd nfs/tasks/ [root@m01 tasks]# vim main.yml - name: 01-install rpcbind & nfs   yum:     name: [ 'rpcbind', 'nfs-utils' ]     state: installed   nfs_server部分: 1)编写tasks目录中的main.yml [root@m01 ~]# cd /etc/ansible/roles/nfs_server/tasks [root@m01 tasks]# vim main.yml - name: 02-push conf file   copy: src=exports dest=/etc/   notify: restart nfs server  #设置触发通知信息,当exports文件里内容有变化时,发通知给handlers - name: 03-create data dir   file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody - name: start rpcbind & nfs service   service: name={{ item }} state=started enabled=yes    #循环重启服务       with_items:     - rpcbind     - nfs   2)编写vars目录中的main.yml [root@m01 tasks]# cd ../vars/ [root@m01 vars]# vim main.yml Data_dir: /data   3)编写files目录中的文件 [root@m01 vars]# cd ../files/ [root@m01 files]# echo "/data 172.16.1.0/24(rw.sync)" >exports [root@m01 files]# cat exports /data 172.16.1.0/24(rw,sync) [root@m01 files]# vim ../tasks/main.yml - name: 02-push conf file   copy: src=exports dest=/etc/   4)编写handlers目录中的main.yml [root@m01 files]# cd ../handlers/ [root@m01 handlers]# vim main.yml - name: restart nfs server   service: name=nfs state=restarted   nfs_client部分: 1)编写tasks目录中的main.yml [root@m01 tasks]# cd ../../nfs_client/ [root@m01 nfs_client]# cd tasks/ [root@m01 tasks]# vim main.yml - name: 02-mount nfs   mount: src=172.16.1.31:{{ Data_dir }} path=/mnt fstype=nfs state=mounted - name: 03-check mount info   shell: df -h|grep {{ Data_dir }}   register: nfs_dir         #对上面的df -h 进行注册,再通过下面的debug显示出命令执行的结果 - name: display nfs-dir   debug: msg={{ nfs_dir.stdout_lines }}   2)编写vars目录中的main.yml [root@m01 roles]# cd nfs_client/vars/ [root@m01 vars]# vim main.yml Data_dir: /data   第三个历程:编写一个主剧本文件 [root@m01 nfs]# cd /etc/ansible/roles/ [root@m01 roles]# vim site.yml - hosts: nfs   roles:     - nfs - hosts: nfs_server   roles:     - nfs_server - hosts: nfs_client   roles:     - nfs_client   文件编写好后结构 [root@m01 roles]# tree . ├── nfs │   ├── files │   ├── handlers │   ├── tasks │   │   └── main.yml │   ├── templates │   └── vars ├── nfs_client │   ├── files │   ├── handlers │   ├── tasks │   │   └── main.yml │   ├── templates │   └── vars ├── nfs_server │   ├── files │   │   └── exports │   ├── handlers │   │   └── main.yml │   ├── tasks │   │   └── main.yml │   ├── templates │   └── vars │       └── main.yml └── site.yml

综合架构4 - Ansible批量部署NFS、RSYNC全网备份

 

 Ansible实现rsync全网备份

 环境准备:

一台备份服务器:  IP: 172.16.1.41    主机名:backup

一台存储服务器:  IP: 172.16.1.31    主机名:nfs01

一台web服务器:  IP: 172.16.1.7    主机名:web01

 

 要求:

  1. 把每台服务器的重要数据、配置及脚本备份到本地以及备份服务器。
  2. 本地数据保留7天备份数据
  3. 本地备份文件推送到备份服务器上
  4. 备份服务器保留最近180天备份,并且保留所有周一的备份数据
  5. 将推送到备份服务器的数据进行验证,并将验证结果通过邮箱发送到运维人员邮箱

 备注:利用脚本实现

rsync安装过程:

服务器端:

第一步:下载安装rysnc

第二步:编写配置文件

第三步:创建rsync虚拟用户

第四步:创建备份目录(/backup)

第五步:启动服务

第六步:编写脚本

第七步:设置定时任务

 

客户端:

第一步:下载安装rsync

第二步:测试rsync服务是否正常

第三步:编写脚本

第四步:设置定时任务

 

rsync服务端准备工作     1)编写rsyncd.conf配置文件 [root@m01 /ansible/rsync_server]# vim rsyncd.conf ##create by HQ at 2020 ###rsyncd.conf start###   uid = rsync gid = rsync port = 873 fake super = yes use chroot = no max connections = 200 timeout = 300 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log ignore errors read only = false list = false hosts allow = 172.16.1.0/24 hosts deny = 0.0.0.0/32 auth users = rsync_backup secrets file = /etc/rsync.password   [backup] comment = "backup dir by oldboy" path = /backup/          2)编写密码认证文件 [root@m01 /ansible/rsync_server]# echo "rsync_backup:oldboy123" >/ansible/rsync_server/rsync.password [root@m01 /ansible/rsync_server]# chmod 600 rsync.password       3)编写脚本 [root@m01 /ansible/rsync_server]# vim backup-server.sh #!/bin/bash ################################# #       rsync-server脚本        # #################################   Backup_dir=/backup #del 180 day ago.backup every week1 data find $Backup_dir/ -type f -mtime +180 ! -name "*week1*"|xargs rm &>/dev.null   #check backup,create check file find $Backup_dir/ -type f -name "finger.txt"|xargs md5sum -c >/tmp/check.txt   #send check to mail mail -s "check backup_$(date +%F_week%w -d -"1day") data" 915979992@qq.com </tmp/check.txt   rsync客户端准备工作        1)编写密码认证文件 [root@m01 /ansible/rsync_client]# echo "oldboy123" >/ansible/rsync_client/rsync.password [root@m01 /ansible/rsync_client]# chmod 600 rsync.password       2)编写脚本 #!/bin/bash #=======================================# #        rsync全网备份客户端脚本          # #=======================================#   Backup_dir="/backup" IP_info=$(hostname -i)    #hostname -i    获取主机IP   #create backup dir mkdir -p $Backup_dir/$IP_info   #tar backup data cd / tar -zchf $Backup_dir/$IP_info/system_data-$(date +%F_week%w -d -"1day").tar.gz ./var/spool/cron/root ./etc/sysconfig/iptables ./etc/rc.local ./server/scripts/   #del 7 day ago data find $Backup_dir/ -type f -mtime +7|xargs rm &>/dev/null   #create finger file find $Backup_dir/$IP_info/ -type f -mtime -1 ! -name "finger.txt" | xargs md5sum >> $Backup_dir/$IP_info/finger.txt   #backup push data info rsync -avz $Backup_dir/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

 

 编写主机清单:

[rsync_server] 172.16.1.41   [rsync_client] 172.16.1.7 172.16.1.31   [rsync:children] rsync_server rsync_client

 

编写rsync剧本:

第一个历程:在roles目录创建相关文件 [root@m01 roles]# mkdir -p {rsync,rsync_server,rsync_client}/{tasks,vars,files,handlers,templates} [root@m01 roles]# tree rsync* rsync ├── files ├── handlers ├── tasks ├── templates └── vars rsync_client ├── files ├── handlers ├── tasks ├── templates └── vars rsync_server ├── files ├── handlers ├── tasks ├── templates └── vars   第二个历程:编写main.yml rsync公共部分: [root@m01 roles]# vim rsync/tasks/main.yml - name: 01-install rsync   yum: name=rsync state=installed   rsync_server部分: 1)编写tasks目录下的main.yml [root@m01 roles]# vim rsync_server/tasks/main.yml - name: 02-push conf file & password file & bash file   template: src={{ item.src }} dest={{ item.dest }} mode={{ item.mode }}   with_items:     - { src: 'rsyncd.conf', dest: '/etc/', mode: '644' }     - { src: '{{ passfile }}', dest: '/etc/', mode: '600' }     - { src: '{{ scripts }}', dest: '/server/scripts', mode: '755' }   notify: restart rsyncd # ignore_errors: yes - name: 03-create user   user: name=rsync create_home=no shell=/sbin/nologin - name: 04-create rsync dir   file: path={{ backupdir }} state=directory owner=rsync group=rsync - name: start rsync server   service: name=rsyncd state=started enabled=yes - name: 06-check server port   shell: netstat -lntup | grep {{ Port_info }}   register: get_server_port - name: 07-display port info   debug: msg={{ get_server_port.stdout_lines }} - name: 08-set crontab   cron: minute=1 hour=0 name='rsync backup' job='/bin/bash /server/scripts/backup-server.sh &>/dev/null'   2)编写vars目录下的main.yml [root@m01 roles]# vim rsync_server/vars/main.yml backupdir: /backup Port_info: 873 passfile: rsync.password scripts: backup-server.sh   3)准备files目录下的相关文件(包括配置文件,密码认证,脚本文件等) [root@m01 roles]# cp -a /ansible/rsync_server/* rsync_server/files/ [root@m01 roles]# ll rsync_server//files/ total 12 -rwxr-xr-x 1 root root 463 Apr  4 00:22 backup-server.sh -rw-r--r-- 1 root root 530 Apr  3 23:35 rsyncd.conf -rw------- 1 root root  23 Apr  4 00:17 rsync.password   4)编写templates目录下的相关文件 [root@m01 roles]# cp -a rsync_server/files/* rsync_server/templates/ [root@m01 roles]# vim rsync_server/templates/rsyncd.conf uid = rsync gid = rsync port = {{ Port_info }} fake super = yes use chroot = no max connections = 200 timeout = 300 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log ignore errors read only = false list = false hosts allow = 172.16.1.0/24 hosts deny = 0.0.0.0/32 auth users = rsync_backup secrets file = /etc/{{ passfile }}   [backup] comment = "backup dir by oldboy" path = {{ backupdir }} read_only = false

 综合架构4 - Ansible批量部署NFS、RSYNC全网备份

 

5)编写handlers目录下的main.yml [root@m01 roles]# vim rsync_server/handlers/main.yml - name: restart rsyncd   service: name=rsyncd state=restarted   rsync_client部分: 1)编写tasks目录下的main.yml [root@m01 roles]# cd rsync_client/tasks/ [root@m01 tasks]# vi main.yml - name: 02-create password file & password file   template: src={{ item.src }} dest={{ item.dest }} mode={{ item.mode }}   with_items:     - { src: '{{ passfile }}', dest: '/etc/', mode: '600' }     - { src: '{{ scripts }}', dest: '/server/scripts/', mode: '755' }   #tags: t1 - name: 03-test rsync   shell: rsync -az /etc/hosts rsync_backup@172.16.1.41::backup --port={{ Port_info }} --password-file=/etc/{{ passfile }} - name: 04-set crontab   cron: minute=0 hour=0 name='rsync backup' job='/bin/bash /server/scripts/{{ scripts }} &>/dev/null'   2)编写vars目录下的main.yml [root@m01 tasks]# cd ../vars/ [root@m01 vars]# vim main.yml passfile: rsync.password scripts: backup.sh Port_info: 873   3)将客户端需要的文件准备好放到files目录下 [root@m01 vars]# mv /server/scripts/backup.sh /etc/ansible/roles/rsync_client/files/ [root@m01 vars]# mv /ansible/rsync_client/rsync.password /etc/ansible/roles/rsync_client/files/   4)编写templates目录下文件 [root@m01 templates]# cp ../files/* . [root@m01 templates]# ll total 8 -rwxr-xr-x 1 root root 856 Apr  6 02:08 backup.sh -rw------- 1 root root  10 Apr  6 02:08 rsync.password [root@m01 templates]# vim backup.sh #backup to backup-server rsync -az $Backup_dir/ rsync_backup@172.16.1.41::backup --port={{ Port_info }} --password-file=/etc/{{ passfile }} [root@m01 roles]# cd rsync_client/tasks/ [root@m01 tasks]# vi main.yml

综合架构4 - Ansible批量部署NFS、RSYNC全网备份

 

编写rsync主剧本文件 [root@m01 templates]# cd /etc/ansible/roles/ [root@m01 roles]# vim site_rsync.yml - hosts: rsync   roles:     - rsync - hosts: rsync_server   roles:     - rsync_server - hosts: rsync_client   roles:     - rsync_client

综合架构4 - Ansible批量部署NFS、RSYNC全网备份

 

测试:将端口号改为888,看看配置文件和脚本里的端口是否更改,能否正常备份数据 [root@m01 roles]# vim rsync_server/vars/main.yml [root@m01 roles]# vim rsync_client/vars/main.yml passfile: rsync.password scripts: backup.sh Port_info: 888 综合架构4 - Ansible批量部署NFS、RSYNC全网备份综合架构4 - Ansible批量部署NFS、RSYNC全网备份综合架构4 - Ansible批量部署NFS、RSYNC全网备份综合架构4 - Ansible批量部署NFS、RSYNC全网备份

 

 

上一篇:21.zabbix


下一篇:10.1、LNMT架构