Ansible的介绍
ansible是一款自动化运维工具,基于Python开发,默认通过SSH协议管理机器,因此,客户端无需任何配置,管理端配置好后即可使用,可以实现批量系统设置、批量程序部署、批量执行命令等功能。
Ansible的特点
1、ansible不需要单独安装客户端,也不需要启动任何服务
2、ansible是python中的一套完整的自动化执行任务模块
3、ansible playbook 采用yaml配置,对于自动化任务执行过程一目了然
Ansible组成结构
是Ansible
的命令工具,核心执行工具;一次性或临时执行的操作都是通过该命令执行。
任务剧本(又称任务集),编排定义Ansible
任务集的配置文件,由Ansible
顺序依次执行,yaml
格式。
Ansible
管理主机的清单,默认是/etc/ansible/hosts
文件。
Ansible
执行命令的功能模块,Ansible2.3
版本为止,共有1039
个模块。还可以自定义模块。
插件,模块功能的补充,常有连接类型插件,循环插件,变量插件,过滤插件,插件功能用的较少。
提供给第三方程序调用的应用程序编程接口。
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
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
第三个历程:编写一个主剧本文件
[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
要求:
- 把每台服务器的重要数据、配置及脚本备份到本地以及备份服务器。
- 本地数据保留7天备份数据
- 本地备份文件推送到备份服务器上
- 备份服务器保留最近180天备份,并且保留所有周一的备份数据
- 将推送到备份服务器的数据进行验证,并将验证结果通过邮箱发送到运维人员邮箱
备注:利用脚本实现
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