综合架构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

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

 

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

 

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

 

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

 

编写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

 

测试:将端口号改为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

 

 

posted @ 2020-04-08 23:48  向云而生(陈云)  阅读(539)  评论(0编辑  收藏  举报