[Ansible實戰]-ansible部署rsync全網備份項目
第一章 項目需求
1.1 概述:
每天晚上12點整備份全網所有機器的系統配置文件和web服務器上的程序文件至備份服務器上
1.2 具體要求:
1)所有服務器的備份目錄必須都為/backup。
2)要備份的系統配置文件包括但不限於:
a.定時任務服務的配置文件(/var/spool/cron/root)(適合web和nfs服務器)。
b.開機自啟動的配置文件(/etc/rc.local)(適合web和nfs服務器)。
c.日常腳本的目錄 (/server/scripts)(適合web和nfs服務器)。
d.防火牆iptables的配置文件(/etc/sysconfig/iptables)(適合web和nfs服務器)
e.其它一些需要備份的目錄
3)Web服務器站點目錄假定為(/var/html/www)。
4)Web服務器A訪問日志路徑假定為(/app/logs)
5)Web服務器保留打包后的7天的備份數據即可(本地留存不能多於7天,因為太多硬盤會滿)
6)備份服務器上,保留每周一的所有數據副本,其它要保留6個月的數據副本。
7)備份服務器上要按照備份數據服務器的內網IP為目錄保存備份,備份的文件按照時間名字保存。
8)需要確保備份的數據盡量完整正確,在備份服務器上對備份的數據進行檢查,把備份的成功及失敗結果信息發給系統管理員郵箱中
第二章 環境准備
管理服務器 IP:192.168.81.161 主機名:m01 centos7
存儲服務器 IP:192.168.81.162 主機名:nfs01 centos7
WEB服務器 IP:192.168.81.163 主機名:nfs01 centos7
備份服務器 IP:192.168.81.165 主機名:nfs01 centos7
第三章 實現思路
3.1 思路:
3.2 ansible管理主機目錄規划
#前期准備
[root@m01:/etc/ansible]# tree
.
├── rsync_client
│ ├── backup_sys.sh
│ ├── backup_web.sh
│ └── rsync.password
└── rsync_server
├── backup_server.sh
├── rsyncd.conf
└── rsync.password
#角色目錄規划
[root@m01:/etc/ansible/roles]# tree
.
├── rsync
│ ├── files
│ ├── handlers
│ ├── tasks
│ ├── templates
│ └── vars
├── rsync_client
│ ├── files
│ ├── handlers
│ ├── tasks
│ ├── templates
│ └── vars
└── rsync_server
├── files
├── handlers
├── tasks
├── templates
└── vars
第四章 基礎配置准備
4.1 rsync服務端准備工作
4.11 准備rsyncd.conf配置文件
[root@m01: ~]# vim /etc/ansible/rsync_server/rsyncd.conf
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 = 192.168.81.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
[backup]
comment = "backup dir by michaleni"
path = /backup/
4.12 准備服務端密碼認證文件
[root@m01:/etc/ansible/rsync_server]# echo "rsync_backup:123456" >rsync.password
[root@m01:/etc/ansible/rsync_server]# chmod 600 rsync.password
4.13 准備服務端腳本文件
[root@m01:/etc/ansible/rsync_server]# vim backup_server.sh
#!/bin/bash
#
#rsync_server script
#write by michaelni 2018-06-06
# del 180 day ago data
find /backup/ -type f -mtime +180 ! -name "*week1.tar.gz"|xargs rm 2>/dev/null
# check backup data
find /backup/ -type f -name "finger.txt"|xargs md5sum -c >/tmp/check.txt
# send check mail
mail -s "check backup info for $(date +%F -d -"1day") data" 906288036@qq.com </tmp/check.txt
## 4.2 rsync客戶端准備工作
## 4.21 准備客戶端密碼認證文件
```bash
[root@m01:/etc/ansible/rsync_client]# echo "123456" >rsync.password
[root@m01:/etc/ansible/rsync_client]# chmod 600 rsync.password
4.22 准備客戶端腳本文件
1)用來備份系統文件的腳本
[root@m01: ~]# vim /etc/ansible/rsync_client/backup_sys.sh
#!/bin/bash
#
#backup_sys script
#write by michaelni 2018-06-06
Backup_dir="/backup"
IP_info=$(hostname -I)
## hostname -I查看內網網址,此處也可以使用awk進行過濾,也可以寫成IP_info=`hostname -I`
# creat backup dir
mkdir -p $Backup_dir/$IP_info
# tar backup data
cd /
tar zchf $Backup_dir/$IP_info/system_backup_$(date +%F_week%w -d -"1day").tar.gz ./var/spool/cron/root ./etc/rc.local ./server/scripts ./etc/sysconfig/iptables
#del 7 day ago data
find $Backup_dir -type f -name +7|xargs rm 2>/dev/null
##有可能會出現不存在七天之前的文件,此時刪除會報錯,所以將報錯重定向為空
#creat finger file
find $Backup_dir/ -type f -mtime -1 ! -name "finger*"|xargs md5sum >$Backup_dir/$IP_info/finger.txt
##查找一天內的文件排除指紋文件(不對指紋文件進行校驗)生成MD5校驗值並重定向到校驗值文件中
#backup push data info
rsync -az $Backup_dir/ rsync_backup@192.168.81.165::backup --password-file=/etc/rsync.password
2)用來備份服務應用數據的腳本
[root@m01: ~]# vim /etc/ansible/rsync_client/backup_web.sh
#!/bin/bash
#
#bacup_web_data script
#write by michaelni 2018-06-06
Backup_dir="/backup"
IP_info=$(hostname -I)
# creat backup dir
mkdir -p $Backup_dir/$IP_info
# tar backup data
cd /
tar zchf $Backup_dir/$IP_info/system_backup_$(date +%F_week%w -d -"1day").tar.gz ./var/spool/cron/root ./etc/rc.local ./server/scripts ./etc/sysconfig/iptables
tar zchf $Backup_dir/$IP_info/www_backup_$(date +%F_week%w -d -"1day").tar.gz ./var/html/www
tar zchf /$Backup_dir/$IP_info/www_log_backup_$(date +%F_week%w -d -"1day").tar.gz ./app/logs
#del 7 day ago data
find $Backup_dir -type f -name +7|xargs rm 2>/dev/null
#creat finger file
find $Backup_dir/ -type f -mtime -1 ! -name "finger*"|xargs md5sum >$Backup_dir/$IP_info/finger.txt
#backup push data info
rsync -az $Backup_dir/ rsync_backup@192.168.81.165::backup --password-file=/etc/rsync.password
4.3 編寫主機清單
[rsync_server]
192.168.81.165
[rsync_client]
192.168.81.162
192.168.81.163
[rsync:children]
rsync_server
rsync_client
第五章 編寫劇本
5.1 創建rsync角色標准目錄
[root@m01:~]# cd /etc/ansible/roles/
[root@m01:/etc/ansible/roles]# mkdir -p {rsync,rsync_server,rsync_client}/{tasks,vars,files,handlers,templates}
5.2 編寫main.yml
5.21 rsync公共部分
[root@m01:/etc/ansible/roles]# vim rsync/tasks/main.yml
- name: 01-install rsync
yum: name=rsync state=installed
5.22 rsync_server部分
1)編寫tasks目錄下的main.yml
[root@m01:/etc/ansible/roles]# vim rsync_server/tasks/main.yml
- name: 01-push conf file & password file & bash file
template: src={{ item.src }} dest={{ item.dest }} mode={{ item.mode }}
loop:
- { 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: 02-create user
user: name=rsync create_home=no shell=/sbin/nologin
- name: 03-create rsync dir
file: path={{ backupdir }} state=directory owner=rsync group=rsync
- name: 04-start rsync server
service: name=rsyncd state=restarted enabled=yes
- name: 05-check server port
shell: netstat -lntup | grep {{ Port_info }}
register: get_server_port
- name: 06-display port info
debug: msg={{ get_server_port.stdout_lines }}
- name: 07-set crontab
cron: minute=5 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 /etc/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 /etc/ansible/roles/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 = 192.168.81.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/{{ passfile }}
[backup]
comment = "backup dir by michaelni"
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
## 5.23 rsync_client部分
```bash
1)編寫tasks目錄下的main.yml
[root@m01: roles]# vim /etc/ansible/roles/rsync_client/tasks/main.yml
- name: 01-create scripts dir
file: path=/server/scripts/ state=directory
- name: 02-push passfile & scriptfile
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@192.168.81.165::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: roles]# vim /etc/ansible/roles/rsync_client/vars/main.yml
passfile: rsync.password
scripts: backup_sys.sh
#scripts: backup_web.sh
Port_info: 873
3)將客戶端需要的文件准備好放到files目錄下
[root@m01:/etc/ansible/roles]# cp -a ../rsync_client/* /etc/ansible/roles/rsync_client/files/
4)編寫templates目錄下文件
[root@m01:/etc/ansible/roles]# cp rsync_client/files/* rsync_client/templates/
[root@m01 templates]# vim backup_sys.sh
.......略........
rsync -az $Backup_dir/ rsync_backup@192.168.81.165::backup --port= {{ Port_info }} --password-file=/etc/ {{ passfile }}
[root@m01 templates]# vim backup_web.sh
.......略........
rsync -az $Backup_dir/ rsync_backup@192.168.81.165::backup --port= {{ Port_info }} --password-file=/etc/ {{ passfile }}
5.24 編寫raync主劇本文件
[root@m01 roles]# vim /etc/ansible/roles/site_rsync.yml
- hosts: rsync
roles:
- rsync
- hosts: rsync_server
roles:
- rsync_server
- hosts: rsync_client
roles:
- rsync_client
5.25 測試
測試:將端口號改為999,看看配置文件和腳本里的端口是否更改,能否正常備份數據
[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