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
要求:
- 把每台服务器的重要数据、配置及脚本备份到本地以及备份服务器。
- 本地数据保留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