Linux运维企业架构项目实战系列

目录

一、全网备份

(一)部署Rsync守护进程

1)服务端(backup)

    [2)客户端(web01/02/03 nfs01)](about:blank#2%29%E5%AE%A2%E6%88%B7%E7%AB%AF%28web01%2F02%2F03%20nfs01%29)

(二)编写脚本文件

1)客户端脚本编写

2)服务端

(三)配置邮件服务

    [1)服务端](about:blank#1%EF%BC%89%E6%9C%8D%E5%8A%A1%E7%AB%AF)

(四)定时任务(实现自动完成全网数据备份)

1)服务端

2)客户端(web01/02/03 nfs01)

二、NFS存储共享服务

1)服务端

2)客户端(web01/02/03)

3)实现开机自动挂载

三、实时同步

(一)部署Rsync守护进程

   [1)服务端(backup)](about:blank#1%EF%BC%89%E6%9C%8D%E5%8A%A1%E7%AB%AF%EF%BC%88backup%EF%BC%89)

   [2)客户端(nfs01)](about:blank#2%29%E5%AE%A2%E6%88%B7%E7%AB%AF%28nfs01%29)

(二)部署inotify监控服务

(三)部署sersync实时同步服务

四、web服务(LNMP架构)

(一)安装linux操作系统(略)

(二)安装配置Nginx服务

1)yum安装Nginx服务

2)配置Nginx服务

(三)安装配置PHP服务

(四)安装配置Mysql服务

(五)Nginx和PHP建立关系

(六)Nginx和Mysql建立关系

(七)部署搭建网站页面(代码上线)

1)安装wordpress服务

2)创建数据库和登录用户

五、Nginx负载均衡(反向代理)

(一)首先四台服务器预装Nginx服务(lb01 web01/02/03)

(二)web服务器编写测试文件(web01/02/03)

(三)配置负载均衡服务器

(四)测试

六、keepalived高可用

(一)部署keepalived高可用服务(lb01/02)

(二)keepalived脑裂问题(lb01/02)

1)脑裂问题产生的原因

2)如何解决脑裂问题?

(三)如何实现keepalived自动释放VIP地址资源(lb01/02)

(四)keepalived服务双主配置(lb0/02)

(五)keepalived服务安全访问配置(lb0/02)

七、ansible自动化管理服务

(一)部署ansible批量管理服务

(1)部署SSH基于密钥对的连接(m01)

(2)部署安装ansible服务

(二)ansible模块介绍

(1)command默认模块

(2)shell(万能模块)

(3)scripts模块(万能模块)

(4)copy文件类型模块

(5)file设置文件属性模块

(6)yum模块(批量安装和卸载软件包)

(7)service模块(管理服务的运行状态)

(8)cron模块(批量设置多个主机的定时任务信息)

(9)mount模块(批量进行挂载操作)

(10)user模块(批量创建用户并设置密码信息)

(三)剧本

(1)剧本的实现步骤

(2)一键化部署Rsync服务

(3) 一键化部署全网备份项目

(4) 一键化部署NFS服务

(5) 一键化部署实时同步服务

八、网站监控服务zabbix

(一)部署安装zabbix服务

(1)服务端(zabbix)

(2)客户端(其他服务器)

(二)实现zabbix自定义监控

(1)需求:监控Nginx服务是否启动

(2)复杂的自定义监控配置(多个服务状态)

(3)报警(邮件报警、微信报警、短信和电话)


总体架构介绍

序号 类型 名称 外网地址 内网地址 软件
01 防火墙服务器 firewalld 10.0.0.81 172.16.1.81 firewalld
02 负载均衡服务器 lb01 10.0.0.5 172.16.1.5 nginx keepalived
03 负载均衡服务器 lb02 10.0.0.6 172.16.1.6 nginx keepalived
04 web服务器 web01 10.0.0.7 172.16.1.7 nginx
05 web服务器 web02 10.0.0.8 172.16.1.8 nginx
06 web服务器 web03 10.0.0.9 172.16.1.9 nginx
07 数据库服务器 db01 10.0.0.51 172.16.1.51 mariadb mysql
08 存储服务器 nfs01 10.0.0.31 172.16.1.31 nfs-utils rpcbind
09 备份服务器 backup 10.0.0.41 172.16.1.41 rsync
10 批量管理服务器 m01 10.0.0.61 172.16.1.61 ansible
11 跳板机服务器 jumpserver 10.0.0.71 172.16.1.71 jumpserver
12 监控服务器 zabbix 10.0.0.72 172.16.1.72 zabbix
13 缓存服务器 redis      

一、全网备份

服务端:backup

客户端:web01 web02 web03 nfs01

要求:

   每天晚上 00 点整在 Web 服务器上打包备份系统配置文件、网站程序目录及访问日志并通过 rsync 命令推送备份服务器 backup 上备份保留(备份思路可以是先在本地按日期打包,然后再推到备份服务器 backup 上) ,NFS 存储服务器同 Web 服务器,实际工作 中就是全部的服务器。

具体要求如下:
1)所有服务器的备份目录必须都为/backup。

2)要备份的系统配置文件包括但不限于:

a.定时任务服务的配置文件(/var/spool/cron/root)

b.开机自启动的配置文件(/etc/rc.local)

c.日常脚本的目录 (/server/scripts)。

d.防火墙 iptables 的配置文件(/etc/sysconfig/iptables)。

e.自己思考下还有什么需要备份呢?

3)Web 服务器站点目录(/var/html/www)。

4)Web 服务器 A 访问日志路径(/app/logs)

5)Web 服务器保留打包后的 7 天的备份数据即可(本地留存不能多于 7 天,因为太多硬盘会 满)

6)备份服务器上,保留每周一的所有数据副本,其它要保留 6 个月的数据副本。

7)备份服务器上要按照备份数据服务器的内网 IP 为目录保存备份,备份的文件按照时间名 字保存。

8)*需要确保备份的数据尽量完整正确,在备份服务器上对备份的数据进行检查,把备份的成功及失败结 果信息发给系统管理员邮箱中。

部署过程

(一)部署Rsync守护进程

1)服务端(backup)
第一步:下载安装Rsync
rpm -qa|grep rsync
yum install -y rsync
第二步:编写Rsync配置文件
[root@backup ~]# vim /etc/rsyncd.conf 
##created by abin 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 abin"

第三步:创建rsync服务的虚拟用户
useradd rsync -M -s /sbin/nologin

第四步:创建备份服务认证密码文件
echo "rsync_backup:123456" >/etc/rsync.password
chmod 600 /etc/rsync.password

第五步:创建备份目录并修改属主属组信息
mkdir /backup
chown rsync.rsync /backup/

第六步:启动备份服务
systemctl start rsyncd
systemctl enable rsyncd
systemctl status rsyncd

2)客户端(web01/02/03 nfs01)

第一步:创建密码认证文件
echo "123456" >/etc/rsync.password
chmod 600 /etc/rsync.password
第二步:进行交互式数据传输测试
rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

(二)编写脚本文件

1)客户端脚本编写
web01/02/03服务器备份脚本:
mkdir -p /server/scripts
vim /server/scripts/backup.sh

#!/bin/bash

Backup_dir="/backup"
IP_info=$(hostname -i)

# create 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).tar.gz  ./var/html/www
tar zchf /$Backup_dir/$IP_info/www_log_backup_$(date +%F_week%w).tar.gz  ./app/logs

# del 7 day ago data
find $Backup_dir -type f -mtime +7|xargs rm 2>/dev/null

# create 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@172.16.1.41::backup --password-file=/etc/rsync.password

nfs01服务器备份脚本:
mkdir -p /server/scripts
vim /server/scripts/backup.sh

#!/bin/bash

Backup_dir="/backup"
IP_info=$(hostname -i)

# create 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 -mtime +7|xargs rm 2>/dev/null

# create 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@172.16.1.41::backup --password-file=/etc/rsync.password
2)服务端
mkdir -p /server/scripts
vim /server/scripts/backup_server.sh

#!/bin/bash
# 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)" 1781668237@qq.com </tmp/check.txt

sh -x backup_server.sh   --检测脚本

(三)配置邮件服务

1)服务端

第一步:浏览器登录163邮箱进行配置
打开163邮箱POP3/SMIP服务
复制授权密码

第二步:配置qq邮箱
打开qq邮箱POP3/SMIP服务

第三步:编写邮件服务配置文件(追加到最后面)
vim /etc/mail.rc

set from=yb1781668237@163.com smtp=smtp.163.com
set smtp-auth-user=yb1781668237@163.com smtp-auth-password=授权密码(163邮箱) smtp-auth=login

重启邮箱服务
systemctl restart postfix.service

第四步:发送邮件测试
echo "邮件内容"|mail -s "邮件主题" 1781668237@qq.com
mail -s "邮件测试" 1781668237@qq.com </dev/null

(四)定时任务(实现自动完成全网数据备份)

1)服务端
[root@backup ~]# crontab -e

# check backup data
0 5 * * *  /bin/sh /server/scripts/backup_server.sh &>/dev/null

ps:
crontab -l --查看已设定的定时任务
2)客户端(web01/02/03 nfs01)
crontab -e 
# backup data
0 0 * * *  /bin/sh /server/scripts/backup.sh &>/dev/null

二、NFS存储共享服务

服务端:nfs01

客户端:web01/02/03

1)服务端

第一步:下载安装软件
rpm -qa|grep -E "nfs|rpc"
yum install -y nfs-utils rpcbind

第二步:编写nfs服务配置文件
vim /etc/exports
/data 172.16.1.0/24(rw,sync)

第三步:创建一个存储目录
mkdir /data
chown nfsnobody.nfsnobody /data

第四步:先启动rpc服务
systemctl start rpcbind.service
systemctl enable rpcbind.service
systemctl status rpcbind.service
再启动nfs服务
systemctl start nfs
systemctl enable nfs
systemctl status nfs

2)客户端(web01/02/03)

第一步:安装nfs服务
yum install -y nfs-utils

第二步:实现远程挂载共享目录
mount -t nfs 172.16.1.31:/data /mnt

ps:卸载设备
umount -lf /mnt
-l 不退出挂载点目录进行卸载
-f 强制进行卸载操作


3)实现开机自动挂载

方法一:利用rc.local开机自动加载脚本文件
echo "mount -t nfs 172.16.1.31:/data /mnt" >>/etc/rc.local
chmod a+x /etc/rc.d/rc.local

方法二:利用fstab配置文件
vim /etc/fstab
172.16.1.31:/data /mnt nfs defaults 0 0

补充:

1.NFS配置参数权限
rw – 存储目录是否有读写权限
ro – 存储目录是否时只读权限
sync – 同步方式存储数据 直接将数据保存到磁盘(数据存储安全)
async – 异步方式存储数据 直接将数据保存到内存(提高数据存储效率)
no_root_squash – 不要将root用户身份进行转换
root_squash – 将root用户身份进行转换
all_squash – 将所有用户身份都进行转换
no_all_squash – 不要将普通用户身份进行转换

2.mount命令参数
rw — 实现挂载后挂载点目录可读可写 (默认)
ro — 实现挂载后挂载点目录可读可写
suid — 在共享目录中可以让setuid权限位生效 (默认)
nosuid — 在共享目录中可以让setuid权限位失效 提高共享目录的安全性
exec — 共享目录中的执行文件可以直接执行
noexec — 共享目录中的执行文件可以无法直接执行 提供共享目录的安全性
auto — 可以实现自动挂载 mount -a 实现加载fstab文件自动挂载
noauto — 不可以实现自动挂载
nouser — 禁止普通用户可以卸载挂载点
user — 允许普通用户可以卸载挂载点

3.NFS服务挂载不上排查方法:
服务端进行排查:
1. 检查nfs进程信息是否注册
rpcinfo -p localhost/172.16.1.31
问题原因:
服务启动顺序不对,没有启动nfs服务
2. 检查有没有可用存储目录
showmount -e 172.16.1.31
问题原因:
配置文件编写有问题,重启nfs服务
3. 在服务端进行挂载测试
是否能够在存储目录中创建或删除数据
客户端测试:
网络问题
ping 172.16.1.31
telnet 172.16.1.31 111

三、实时同步

服务端:backup

客户端:nfs01

(一)部署Rsync守护进程

1)服务端(backup)

第一步:下载安装Rsync
rpm -qa|grep rsync
yum install -y rsync
第二步:编写Rsync配置文件
[root@backup ~]# vim /etc/rsyncd.conf 
##created bu abin 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 abin"

第三步:创建rsync服务的虚拟用户
useradd rsync -M -s /sbin/nologin

第四步:创建备份服务认证密码文件
echo "rsync_backup:123456" >/etc/rsync.password
chmod 600 /etc/rsync.password

第五步:创建备份目录并修改属主属组信息
mkdir /backup
chown rsync.rsync /backup/

第六步:启动备份服务
systemctl start rsyncd
systemctl enable rsyncd
systemctl status rsyncd

2)客户端(nfs01)

第一步:创建密码认证文件
echo "123456" >/etc/rsync.password
chmod 600 /etc/rsync.password
第二步:进行交互式数据传输测试
rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

(二)部署inotify监控服务

客户端:nfs01

第一步:安装inotify-tools服务
yum install -y inotify-tools

(三)部署sersync实时同步服务

客户端:nfs01

第一步:下载sersync软件上传至nfs服务器
https://github.com/wsgzao/sersync

第二步:解压sersync软件包
unzip sersync_installdir_64bit.zip
mv sersync_installdir_64bit/* /usr/local/

第三步:修改配置文件
[root@nfs01 /usr/local/sersync]# vim conf/confxml.xml
24         <localpath watch="/data">
25             <remote ip="172.16.1.41" name="backup"/>
30             <commonParams params="-az"/>
31             <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/>
32             <userDefinedPort start="true" port="873"/><!-- port=874 -->

第四步:
[root@nfs01 bin]# export PATH="$PATH:/usr/local/sersync/bin"
[root@nfs01 bin]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/sersync/bin
[root@nfs01 /usr/local/sersync/bin]# chmod a+x sersync
[root@nfs01 ~]# mkdir /data
[root@nfs01 ~]# sersync -dro  /usr/local/sersync/conf/confxml.xml   启动实时同步服务          

第五步:实现开机自启
[root@nfs01 ~]# vim /etc/profile
export PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/sersync/bin'
[root@nfs01 ~]# vim /etc/rc.local 
/usr/local/sersync/bin/sersync -dro  /usr/local/sersync/conf/confxml.xml
[root@nfs01 ~]# chmod a+x /etc/rc.d/rc.local

ps:
[root@nfs01 ~]# yum install -y psmisc       
[root@nfs01 ~]# killall sersync                     停止实时同步服务  

四、web服务(LNMP架构)

(一)安装linux操作系统(略)

(二)安装配置Nginx服务

1)yum安装Nginx服务
第一个历程: 更新nginx官方yum源
vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
	
第二个历程: yum安装nginx软件
yum install -y nginx
 
第三个历程: 启动nginx服务,检查服务是否安装正确
systemctl start nginx
systemctl enable nginx
测试访问nginx服务

2)配置Nginx服务
vim /etc/nginx/nginx.conf      	 --- 主配置文件
第一个部分: 配置文件主区域配置
user  www;               	 --- 定义worker进程管理的用户
worker_processes  2;        ---定义有几个worker进程  == CPU核数 / 核数的2倍
error_log  /var/log/nginx/error.log warn;   --- 定义错误日志路径信息
pid        /var/run/nginx.pid;              --- 定义pid文件路径信息
	
第二个部分: 配置文件事件区域
events {                    
    worker_connections  1024;   --- 一个worker进程可以同时接收1024访问请求
}
	
第三个部分: 配置http区域
http {
   include       /etc/nginx/mime.types;      --- 加载一个配置文件
   default_type  application/octet-stream;   --- 指定默认识别文件类型
   log_format  oldboy  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';
		          --- 定义日志的格式		
   access_log  /var/log/nginx/access.log  oldboy;
		          --- 指定日志路径          
   sendfile        on;   ???
   #tcp_nopush     on;   ???
   keepalive_timeout  65;   --- 超时时间
   #gzip  on;
   include /etc/nginx/conf.d/*.conf;        --- 加载一个配置文件
}
 
补充: nginx的进程
master process:  主进程		---管理服务是否能够正常运行   boss
worker process:  工作进程	---处理用户的访问请求         员工  

(三)安装配置PHP服务

1.使用remi源安装php
yum remove -y epel-release.noarch     --(如果没有这个包可以不用卸载)
yum install -y epel-release
yum install -y https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm     
yum --enablerepo=remi-php71 install -y php php-cli php-common php-devel php-embedded php-gd php-mbstring php-pdo php-xml php-fpm php-mysqlnd php-opcache php-mcrypt php-pecl-memcached php-pecl-mongodb php-pecl-redis
2.编写配置文件(24/26行)
vim /etc/php-fpm.d/www.conf
user = www
group = www
PS:创建一个www用户
3.启动php服务
systemctl start php-fpm.service 
systemctl enable php-fpm.service
systemctl status php-fpm.service

(四)安装配置Mysql服务

安装数据库软件
[root@web01 ~]# yum install mariadb-server mariadb -y
启动数据库服务
[root@web01 ~]# systemctl start mariadb.service 
[root@web01 ~]# systemctl enable mariadb.service
创建数据库的密码信息
[root@web01 ~]# mysqladmin -u root  password '123456'
[root@web01 ~]# mysql -u root -p123456   --密码登录

(五)Nginx和PHP建立关系

1.编写nginx文件
[root@web01 /etc/nginx/conf.d]# vim www.conf 
server {
    listen        80;
    server_name   www.abins.cn;
    location   / {
    root  /html/www;
    index index.php index.html;
  }
    location ~ \.php$ {
    root /html/www;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass  127.0.0.1:9000;
    include fastcgi_params;
 
  }
}
[root@web01 /etc/nginx/conf.d]# systemctl restart nginx

2.编写动态资源文件
[root@web01 /html/www]# vim test_php.php 
<?php
phpinfo();
?>

3.配置本地DNS解析
在C:\Windows\System32\drivers\etc\hosts文件
后面追加
10.0.0.7            www.cxt.com

4.进行访问测试
www.cxt.com/test_php.php

(六)Nginx和Mysql建立关系

1.编写php代码文件
[root@web02 /html/www]# vim test_mysql.php
<?php
$servername = "localhost";
$username = "root";
$password = "123456";
//$link_id=mysql_connect('主机名','用户','密码');
//mysql -u用户 -p密码 -h 主机
$conn = mysqli_connect($servername, $username, $password);
if ($conn) {
     echo "mysql successful by root !\n";
  }else{
     die("Connection failed: " . mysqli_connect_error());
   }
?>
2.进行访问测试

(七)部署搭建网站页面(代码上线)

1)安装wordpress服务
第一个历程: 获取代码信息(git)---使用开源的网站代码
    www网站页面: http://www.dedecms.com/
    bbs网站页面: http://www.discuz.net/forum.php
    blog网站页面: https://cn.wordpress.org/
    wecenter网站页面: http://www.wecenter.com/?copyright

第二个历程: 将代码解压,将解压后信息放入到站点目录中
[root@web01 /html]# rz -E
rz waiting to receive.
[root@web01 /html]# ll
-rw-r--r-- 1 root root 11199196 Apr  7 20:40 wordpress-5.2.1.tar.gz
[root@web02 /html]# tar xf wordpress-5.2.1.tar.gz 
[root@web01 /html]# ll
drwxr-xr-x 5 nobody 65534     4096 May 22  2019 wordpress
-rw-r--r-- 1 root   root  11199196 Apr  7 20:40 wordpress-5.2.1.tar.gz
drwxr-xr-x 2 www    www         48 May 24 15:17 www
[root@web01 /html]# mv wordpress/* www/

第三个历程: 修改站点目录权限
chown -R www.www www

第四个历程: 进行网站页面初始化操作
www.cxt.com/index.php

2)创建数据库和登录用户
[root@web01 ~]# mysql -u root -p123456               --以root身份登录MySQL
MariaDB [(none)]> create database wordpress;         --创建wordpress数据库
Query OK, 1 row affected (0.09 sec)
 
MariaDB [(none)]> show databases;                    --检查wordpress数据库是否创建成功
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| wordpress          |
+--------------------+
5 rows in set (0.00 sec)
MariaDB [(none)]> grant all on wordpress.* to 'wordpress'@'localhost' identified by '123456';          --创建wordpress用户,密码为123456                                 
MariaDB [(none)]> select user,host from mysql.user;  --查看数据库user表的用户信息和主机信息
+-----------+-----------+
| user      | host      |
+-----------+-----------+
| root      | 127.0.0.1 |
| root      | ::1       |
|           | localhost |
| root      | localhost |
| wordpress | localhost |
|           | web02     |
| root      | web02     |
+-----------+-----------+
7 rows in set (0.10 sec)
MariaDB [(none)]> flush privileges;   --刷新数据库信息

看到这个界面,那么恭喜你网站搭建成功啦!

五、Nginx负载均衡(反向代理)

服务端:lb01

客户端:web01/02/03

(一)首先四台服务器预装Nginx服务(lb01 web01/02/03)

vim /etc/yum.repos.d/nginx.repo         ##更新nginx的官方yum源
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
yum install -y nginx                    ##安装nginx服务
systemctl start nginx                   ##启动nginx服务

(二)web服务器编写测试文件(web01/02/03)

[root@web01 /html/www]# vim fzjh.html
<html>  
<head>  
<title>Welcome to nginx!</title>  
</head>  
<body bgcolor="white" text="black">  
<center><h1>Welcome to nginx! 10.0.0.7</h1></center>    --注意3台web服务器均需编辑
</body>  
</html>

ps:注意这里有个坑
小编的web服务器站点目录是/html/www,所以需要修改web服务器的默认nginx配置文件站点目录
即:
[root@lb01 /etc/nginx/conf.d]# vim default.conf 
root /html/www;
否则会报404 not found错误

#当然如果你是默认站点目录/usr/share/nginx/html/时不需要修改

 

(三)配置负载均衡服务器

[root@lb01 /etc/nginx]# vim nginx.conf
user www;

[root@lb01 /etc/nginx/conf.d]# vim www.conf
upstream cxt {
        server 10.0.0.7:80;
        server 10.0.0.8:80;
        server 10.0.0.9:80;
    }


    server {
        listen       80;
        server_name  www.cxt.com;
        location / {
            proxy_pass        http://cxt;
            client_max_body_size  100m;
        }
}

    server {
        listen       80;
        server_name  bbs.cxt.com;
        location / {
            proxy_pass        http://cxt;
            client_max_body_size  100m;
        }
}

(四)测试

打开浏览器输入www.cxt.com/fzjh.html
不断刷新,10.0.0.7/10.0.0.8/10.0.0.9交替出现时说明负载均衡配置成功

下面时通过抓包工具抓取的http记录

六、keepalived高可用

(一)部署keepalived高可用服务(lb01/02)

第一个历程: 准备两台服务器并且均配置好负载均衡服务 (lb01 lb02)
第二个历程: 安装部署keepalived软件 (lb01 lb02)
    yum install -y keepalived
第三个历程: 编写keepalived配置文件(lb01 lb02) 
lb01配置信息:     --此处配置文件同ansible配置文件一样都需要注意格式,否则不会被执行
    [root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
    
    global_defs {
        router_id lb01
    }
   
    vrrp_instance yb {
        state MASTER
        interface eth0
        virtual_router_id 51
        priority 150
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            10.0.0.3/24
        }
    }
 
 
    lb02配置信息:   --此处配置文件同ansible配置文件一样都需要注意格式,否则不会被执行
! Configuration File for keepalived
    
    global_defs {
       router_id lb02
    }
    
    vrrp_instance yb {
        state BACKUP
        interface eth0
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            10.0.0.3/24
        }   
    }
 
第四个历程: 启动keepalived服务
    systemctl start keepalived
    systemctl enable keepalived
    systemctl status keepalived
 
第五个历程: 修改域名和IP地址解析关系
    windows修改hosts主机文件
    10.0.0.3  www.cxt.com    
 
第六个历程:测试
 
    当lb01的keepalived服务停止运行时,lb02收不到来自lb01的组播信息会夺取vip地址信息10.0.0.3成为新的主,保证负载均衡正常运作。

(二)keepalived脑裂问题(lb01/02)

1)脑裂问题产生的原因
**出现原因:**   
高可用备服务器接收不到主服务器发送的组播包,备服务器上会自动生成VIP地址

**物理原因:**  
高可用集群之间通讯线路出现问题  
**逻辑原因:**  
有安全策略阻止(防火墙等)
2)如何解决脑裂问题?
01. 进行监控,发出告警
    备服务器出现VIP地址的原因:
    a 主服务器出现故障
    b 出现脑裂问题
    监控脑裂的shell脚本:
    [root@lb02 ~]# vim /server/scripts/naolie.sh
#!/bin/bash
ip a s eth0|grep "10.0.0.3" >/dev/null
if [ $? -eq 0 ]
then
  echo "keepalived服务出现异常,请进行检查"|mail -s 异常告警-keepalived  1781668237@qq.com
fi
    
    加入定时任务每隔一分钟执行一次
    corntab -e
    补充:shell脚本进行比较判断
    -eq  等于
    -ne  不等于
    -lt  小于
    -gt  大于
    -le  小于等于
    -ge  大于等于
    
02. 直接关闭一台服务器的keepalived服务

(三)如何实现keepalived自动释放VIP地址资源(lb01/02)

第一个历程: 编写监控nginx服务状态监控
    vim /server/scripts/check_web.sh
#!/bin/bash
num=`ps -ef|grep -c [n]ginx`
if [ $num -lt 2 ]
then
   systemctl stop keepalived
fi
ps:别忘了给脚本x权限
第二个历程: 测试监控脚本
    [root@lb01 scripts]# cat /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
     global_defs {
       router_id lb01
    }
    
    vrrp_script check_web {
     script "/server/scripts/check_web.sh"  
     interval 3   
     weight 2
    }
    
    vrrp_instance yb {
        state MASTER
        interface eth0
        virtual_router_id 51
        priority 150
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
         10.0.0.3/24
        }
       track_script {
             check_web
       }
    }
 第三个历程: 测试
    停掉nginx服务的同时keepailved服务也会自动停掉
    这样vip地址资源会释放给备,备会成为新的主,保证用户可以正常访问  
    systemctl stop nginx
    systemctl status keepalived   

(四)keepalived服务双主配置(lb0/02)

第一个历程: 编写lb01服务器keepalived配置文件
    [root@lb01 ~]# cat /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
     global_defs {
       router_id lb01
    }
    
    vrrp_instance yb {
        state MASTER
        interface eth0
        virtual_router_id 51
        priority 150
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
         10.0.0.3/24
        }
    }
    vrrp_instance cxt {
        state BACKUP
        interface eth0
        virtual_router_id 52
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {             
         10.0.0.4/24
        }
    }
        
第二个历程: 编写lb02服务器keepalived配置文件 
    [root@lb02 ~]# cat /etc/keepalived/keepalived.conf   
    ! Configuration File for keepalived
    global_defs {
       router_id lb02
    }
    
    vrrp_instance yb {
        state BACKUP
        interface eth0
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            10.0.0.3/24
        }
    }
    vrrp_instance cxt {
        state MASTER
        interface eth0
        virtual_router_id 52
        priority 150
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            10.0.0.4/24
        }
    }
    
第三个历程: 进行抓包测试
    进行抓包查看:
    www.cxt.com/fzjh --- 10.0.0.3(10.0.0.5)
    10.0.0.1       --- 10.0.0.3
    10.0.0.5       --- 10.0.0.7
    10.0.0.7       --- 10.0.0.5
    10.0.0.3       --- 10.0.0.1
    
    bbs.test.com/fzjh --- 10.0.0.4(10.0.0.6)     --若访问bbs.cxt.com/fzjh.html出现404错误,可能是lb02的www.conf中没有配置bbs.cxt.com的负载均衡
    10.0.0.1       --- 10.0.0.4
    10.0.0.6       --- 10.0.0.7
    10.0.0.7       --- 10.0.0.6
    10.0.0.4       --- 10.0.0.1

(五)keepalived服务安全访问配置(lb0/02)

通过设置监听地址限制用户访问通道:
外网接口只开通10.0.0.3/10.0.0.4
第一个历程: 修改内核文件
    异常问题:
    01. 如何设置监听网卡上没有的地址
    解决: 需要修改内核信息
    echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf
    sysctl -p 
 
第二个历程: 修改nginx负载均衡文件
    lb01/lb02
    vim /etc/nginx/conf.d/lb.conf
    upstream cxt {
       server 10.0.0.7:80;
       server 10.0.0.8:80;
       server 10.0.0.9:80;
    }
    server {
        listen       10.0.0.3:80;
        server_name  www.cxt.com;
        location / {
           proxy_pass http://cxt;
           proxy_set_header Host $host;
           proxy_set_header X-Forwarded-For $remote_addr;
           proxy_next_upstream error timeout http_404 http_502 http_403;
        }
    }
    server {
        listen       10.0.0.4:80;
        server_name  bbs.cxt.com;
        location / {
           proxy_pass http://cxt;
           proxy_set_header Host $host;
           proxy_set_header X-Forwarded-For $remote_addr;
        }
    }
 
第三个历程: 重启nginx负载均衡服务
    systemctl restart nginx   --涉及到ip地址的修改要用restart重启
 

七、ansible自动化管理服务

服务端:m01

客户端:其他服务器

PS:selinux需要关闭,不然ansible连接管理主机会报错

(一)部署ansible批量管理服务

(1)部署SSH基于密钥对的连接(m01)
第一步:管理端创建密钥对信息
[root@m01 ~]# ssh-keygen -t dsa    --默认一直回车

第二步:管理端需要将公钥进行分发
[root@m01 /server/scripts]# yum install -y sshpass
[root@m01 /server/scripts]# vim fenfa_pub_key.sh     --注意脚本x权限
#!/bin/bash
for ip in  7 31 41   
do 
  echo "============ host 172.16.1.$ip pub-key start fenfa============="
  sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.$ip "-o StrictHostKeyChecking=no" &>/dev/null
  echo "host 172.16.1.$ip fenfa success."
  echo "============ host 172.16.1.$ip fenfa end============="
done
[root@m01 /server/scripts]# sh fenfa_pub_key.sh
============ host 172.16.1.5 pub-key start fenfa=============
host 172.16.1.5 fenfa success.
...

第三步:进行ssh远程连接测试
[root@m01 /server/scripts]# vim check_pub_key.sh      --注意脚本x权限
#!/bin/bash
CMD=$1    #--传参(执行脚本的时候后面可以写一些命令,不用去调整脚本)
for ip in {5,6,7,8,9,31,51}
do
  echo "==================== host 172.16.1.$ip check ==================== "
  ssh 172.16.1.$ip $CMD 
  echo ""
done
[root@m01 /server/scripts]# sh check_pub_key.sh "hostname"
==================== host 172.16.1.5 check ==================== 
lb01   
...
(2)部署安装ansible服务
第一步:安装ansible软件
[root@m01 ~]# yum install -y ansible     --- 需要依赖epel的yum源    

第二步:编写主机清单文件
[root@m01 ~]# vim /etc/ansible/hosts 
#定义可以管理的主机信息
172.16.1.5
172.16.1.6
172.16.1.7
172.16.1.8
172.16.1.9
172.16.1.31
172.16.1.51

第三步:测试是否可以管理多台主机
[root@m01 ~]# ansible all -a "hostname"
172.16.1.5 | CHANGED | rc=0 >>
lb01
...

ps:补充
/etc/ansible/ansible.cfg   --- ansible服务配置文件    
/etc/ansible/hosts         --- 主机清单文件   定义可以管理的主机信息    
/etc/ansible/roles         --- 角色目录

(二)ansible模块介绍

模块的应用语法格式:  
ansible 主机名称/主机组名称/主机地址信息/all  -m(指定应用的模块信息)  模块名称  -a(指定动作信息)  "执行什么动作"

ansible软件输出颜色说明:
01. 绿色信息: 查看主机信息/对主机未做改动
02. 黄色信息: 对主机数据信息做了修改
03. 红色信息: 命令执行出错了
04. 粉色信息: 忠告信息
05. 蓝色信息: 显示ansible命令执行的过程

(1)command默认模块
command – Executes a command on a remote node
	      在一个远程主机上执行一个命令

简单用法:
[root@m01 ~]# ansible 172.16.1.7 -m command -a "hostname"
172.16.1.7 | CHANGED | rc=0 >>
web01

扩展用法:
1)chdir     Change into this directory before running the command.
             在执行命令之前对目录进行切换
ansible 172.16.1.7 -m command -a "chdir=/tmp/ touch test.txt"
2)creates   If it already exists, this step won't be run.
             如果文件存在,不执行命令操作
ansible 172.16.1.7 -m command -a "creates=/tmp/ touch test.txt"
skipped, since /tmp/ exists   --跳过,因为/tmp/中存在
3)removes    If it already exists, this step will be run.
              如果文件存在,继续执行
ansible 172.16.1.7 -m command -a "removes=/tmp/ touch test.txt"
4) free_form(required)
The command module takes a free form command to run. 
There is no parameter actually named 'free form'. See the examples!
使用command模块的时候,-a参数后面必须写上一个合法linux命令信息

注意事项:
有些符号信息无法识别:  "<", ">", "|", ";" and "&"
(2)shell(万能模块)
shell   – Execute commands in nodes
	      在节点上执行操作

简单用法:
和command默认模块用法一致

实践应用:利用shell模块远程执行脚本
第一步:在管理主机编写脚本
[root@m01 /server/scripts]# vim yum.sh 
#!/bin/bash
##yum 
yum install -y htop

第二步:将脚本发送到远程主机
[root@m01 /server/scripts]# scp -rp ./yum.sh 172.16.1.7:/server/scripts
yum.sh                                      100%   39    37.0KB/s   00:00 

第三步:使用file模块为脚本增加可执行权限
[root@m01 ~]# ansible 172.16.1.7 -m file -a "dest=/server/scripts/yum.sh mode=777"

第四步:使用ansible命令执行脚本
[root@m01 ~]# ansible 172.16.1.7 -m shell -a "chdir=/server/scripts sh yum.sh"
(3)scripts模块(万能模块)

PS:scripts模块参数功能和command模块类似

第一个步骤: 编写一个脚本
第二个步骤: 运行ansible命令执行脚本
(4)copy文件类型模块
copy – Copies files to remote locations
	   将数据信息进行批量分发

基本用法:
ansible 172.16.1.7 -m copy -a "src=/etc/hosts dest=/etc/"
将管理主机/etc目录中的hosts文件分发到远程主机的/etc目录中

172.16.1.7 | CHANGED => {       --- 对哪台主机进行操作
        "changed": true,             --- 是否对主机信息进行改变
        "checksum": "6ed7f68a1d6b4b36c1418338b2001e421eeba270",    --- 生成一个文件校验码==MD5数值
        "dest": "/etc/hosts",        --- 显示目标路径信息  
        "gid": 0,                    --- 显示复制后文件gid信息
        "group": "root",             --- 显示复制后文件属组信息
        "md5sum": "7afd7b74854f0aaab646b3e932f427c0",              --- 生成一个文件校验码==MD5数值
        "mode": "0644",              --- 显示复制后文件权限信息
        "owner": "root",             --- 显示复制后文件属主信息
        "size": 401,                 --- 显示文件的大小信息
        "src": "/root/.ansible/tmp/ansible-tmp-1557804498.23-26487341925325/source", 
        "state": "file",             --- 显示文件的类型信息
        "uid": 0                     --- 显示复制后文件uid信息
    }

扩展用法:
01. 在传输文件时修改文件的属主和属组信息
ansible 172.16.1.7 -m copy -a "src=/etc/ansible/file/rsync/rsync.password dest=/etc/ owner=rsync group=rsync"
02. 在传输文件时修改文件的权限信息
ansible 172.16.1.7 -m copy -a "src=/etc/ansible/file/rsync/rsync.password dest=/etc/ mode=1777"
03. 在传输数据文件信息时对远程主机源文件进行备份 
ansible 172.16.1.7 -m copy -a "src=/etc/ansible/file/rsync/rsync.password dest=/etc/ backup=yes"
04. 创建一个文件并直接编辑文件的信息
ansible 172.16.1.7 -m copy -a "content='123456' dest=/etc/rsync.password"
content:文件内容
dest:远端文件路径

PS: ansible软件copy模块复制目录信息
ansible 172.16.1.7 -m copy -a "src=/tmp dest=/tmp"  
src后面目录没有/: 将目录本身以及目录下面的内容都进行远程传输复制
ansible 172.16.1.7 -m copy -a "src=/tmp/ dest=/tmp"  
src后面目录有/:   只将目录下面的内容都进行远程传输复制	

(5)file设置文件属性模块
file – Sets attributes of files
	   设置文件属性信息
	
基本用法:
-dest 远端文件或目录路径
-owner 属主
-group 属组
-mode  权限
ansible 172.16.1.7 -m file -a "dest=/etc/hosts owner=www group=www mode=666"

扩展用法:
1. 可以利用模块创建数据信息 (文件 目录 链接文件)
state  参数
=absent    --- 缺席/删除数据信息
=directory --- 创建一个目录信息
=file      --- 检查创建的数据信息是否存在 绿色存在 红色不存在
=hard      --- 创建一个硬链接文件
=link      --- 创建一个软链接文件
=touch     --- 创建一个文件信息
	
创建目录信息:
ansible 172.16.1.7 -m file -a "dest=/test/ state=directory"
ansible 172.16.1.7 -m file -a "dest=/test/test01/test02/ state=directory"
创建文件信息:
ansible 172.16.1.7 -m file -a "dest=/test/test.txt state=touch"
创建链接文件信息:
ansible 172.16.1.7 -m file -a "src=/test/test.txt dest=/test/test_hard.txt state=hard"
ansible 172.16.1.7 -m file -a "src=/test/test.txt dest=/test/test_link.txt state=link"

2. 可以利用模块删除数据信息
ansible 172.16.1.7 -m file -a "dest=/test/test.txt state=absent"
ansible 172.16.1.7 -m file -a "dest=/test/  state=absent"

补充: 
recurse	递归
Recursively set the specified file attributes on directory contents.
递归地对目录内容设置指定的文件属性。
This applies only when state is set to directory.
recurse=yes/no
仅当状态设置为“目录”时才适用。
[root@m01 ~]# ansible 172.16.1.41 -m file -a "dest=/backup owner=rsync recurse=yes"
(6)yum模块(批量安装和卸载软件包)
name  --- 指定安装软件名称
state --- 指定是否安装软件
	  installed   --- 安装软件
      present
      latest
      absent      --- 卸载软件
      removed
ansible 172.16.1.7 -m yum -a "name=iotop state=installed"	
(7)service模块(管理服务的运行状态)
name:   --- 指定管理的服务名称
state:  --- 指定服务状态
	    started   启动
	    restarted 重启
		stopped   停止
enabled=yes/no --- 指定服务是否开机自启动
ansible 172.16.1.31 -m service -a "name=nfs state=started enabled=yes"
(8)cron模块(批量设置多个主机的定时任务信息)
crontab -e 
	*   *  *  *  *  定时任务动作
	分 时 日 月 周
	
	minute:                # Minute when the job should run ( 0-59, *, */2, etc )
	                       设置分钟信息
	hour:                  # Hour when the job should run ( 0-23, *, */2, etc )
	                       设置小时信息
	day:                   # Day of the month the job should run ( 1-31, *, */2, etc )
                           设置日期信息
    month:                 # Month of the year the job should run ( 1-12, *, */2, etc )
	                       设置月份信息
	weekday:               # Day of the week that the job should run ( 0-6 for Sunday-Saturday, *, etc )
	                       设置周信息
	
	job                    用于定义定时任务需要干的事情
	
	基本用法:
	ansible 172.16.1.31 -m cron -a "minute=0 hour=2 job='/usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1'" 

	扩展用法:
	01. 给定时任务设置注释信息
	ansible 172.16.1.31 -m cron -a "name='time sync' minute=0 hour=2 job='/usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1'"
	
    02. 如何删除指定定时任务
	ansible 172.16.1.31 -m cron -a "name='time sync01' state=absent"
	PS: ansible可以删除的定时任务,只能是ansible设置好的定时任务
	
	03. 如何批量注释定时任务
	ansible 172.16.1.31 -m cron -a "name='time sync' job='/usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1' disabled=yes"
(9)mount模块(批量进行挂载操作)
mount: 批量进行挂载操作
	  src:  需要挂载的存储设备或文件信息
	  path: 指定目标挂载点目录
	  fstype: 指定挂载时的文件系统类型
	  state
	  present/mounted     --- 进行挂载
	  present: 不会实现立即挂载,修改fstab文件,实现开机自动挂载
	  mounted: 会实现立即挂载, 并且会修改fstab文件,实现开机自动挂载 *****
		   
	  absent/unmounted    --- 进行卸载
	  absent:     会实现立即卸载, 并且会删除fstab文件信息,禁止开机自动挂载
	  unmounted:  会实现立即卸载, 但是不会会删除fstab文件信息  *****
(10)user模块(批量创建用户并设置密码信息)
基本用法:
	ansible 172.16.1.31 -m user -a "name=www"
	
	扩展用法:
	1) 指定用户uid信息
	ansible 172.16.1.31 -m user -a "name=www uid=6666"
	
	2) 指定用户组信息
	ansible 172.16.1.31 -m user -a "name=www group=www"
	
	3) 批量创建虚拟用户
	ansible 172.16.1.31 -m user -a "name=rsync create_home=no  shell=/sbin/nologin"
	
	4) 给指定用户创建密码
	PS: 利用ansible程序user模块设置用户密码信息,需要将密码明文信息转换为密文信息进行设置
	生成密文密码信息方法:
	方法一:
    ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512', 'www') }}"
    localhost | SUCCESS => {
      "msg": "$6$oldboy$MVd3DevkLcimrBLdMICrBY8HF82Wtau5cI8D2w4Zs6P1cCfMTcnnyAmmJc7mQaE9zuHxk8JFTRgYMGv9uKW7j1"
    }
	
	方法二:(忽略)
	mkpasswd --method=sha-512
	
	方法三:
    yum install -y python-pip
    pip install passlib
    python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
    Password: 
    $6$rJJeiIerQ8p2eR82$uE2701X7vY44voF4j4tIQuUawmTNHEZhs26nKOL0z39LWyvIvZrHPM52Ivu9FgExlTFgz1VTOCSG7KhxJ9Tqk.
	
	ansible 172.16.1.31 -m user -a 'name=oldboy08 password=$6$oldboy$MVd3DevkLcimrBLdMICrBY8HF82Wtau5cI8D2w4Zs6P1cCfMTcnnyAmmJc7mQaE9zuHxk8JFTRgYMGv9uKW7j1'

(三)剧本

(1)剧本的实现步骤
第一步:配置主机清单
    如何配置主机清单
    第一种方式: 分组配置主机信息
	[web]
    172.16.1.7
    172.16.1.8
    172.16.1.9
    
    [data]
    172.16.1.31
    172.16.1.41
	操作过程
    [root@m01 ansible-playbook]# ansible data -a "hostname"
    172.16.1.31 | CHANGED | rc=0 >>
    nfs01
    
    172.16.1.41 | CHANGED | rc=0 >>
    backup
    
    [root@m01 ansible-playbook]# ansible web -a "hostname"
    172.16.1.7 | CHANGED | rc=0 >>
    web01
	
	第二种方式: 主机名符号匹配配置
	[web]
    172.16.1.[7:9]
	[web]
    web[01:03]
	
	第三种方式: 跟上非标准远程端口
	[web]
    web01:52113
    172.16.1.7:52113
	
	第四种方式: 主机使用特殊的变量
    [web]
    172.16.1.7 ansible_ssh_port=52113 ansible_ssh_user=root ansible_ssh_pass=123456
    [web]
    web01 ansible_ssh_host=172.16.1.7 ansible_ssh_port=52113 ansible_ssh_user=root ansible_ssh_pass=123456

    第五种方式: 主机组名嵌入配置
	[rsync:children]    --- 嵌入子组信息
    rsync_server
    rsync_client
    
    [rsync_server]
    172.16.1.41
    
    [rsync_client]
    172.16.1.31
    172.16.1.7
	
	[root@m01 /etc/ansible]# ansible rsync -a "hostname"
    172.16.1.7 | CHANGED | rc=0 >>
    web01.com
    172.16.1.41 | CHANGED | rc=0 >>
    backup
    172.16.1.31 | CHANGED | rc=0 >>
    nfs01

	
	[web:vars]         --- 嵌入式变量信息
    ansible_ssh_host=172.16.1.7
    ansible_ssh_port=52113
    ansible_ssh_user=root
    ansible_ssh_pass=123456
    [web]
    web01

第二步:编写剧本
    剧本编写规范: pyyaml -- 三点要求
	1. 合理的信息缩进  两个空格表示一个缩进关系
	   标题一
	     标题二
	       标题三
	PS: 在ansible中一定不能用tab进行缩进
 
    2. 冒号的使用方法
	   hosts: 172.16.1.41
	   tasks:
	   yum: name=xx
	PS: 使用冒号时后面要有空格信息
	    以冒号结尾,冒号信息出现在注释说明中,后面不需要加上空格
		
    3. 短横线应用 -(列表功能)
	   - 张三
	     男
	       - 打游戏
		   - 运动
		      
	   - 李四
	     女
	       学习
	          湖南
	   - 王五
	     男
	       运动
	          深圳
	PS: 使用短横线构成列表信息,短横线后面需要有空格  	

    剧本编写常见错误:
	01. 剧本语法规范是否符合(空格 冒号 短横线)
	02. 剧本中模块使用是否正确
	03. 剧本中一个name标识下面只能写一个模块任务信息
	04. 剧本中尽量不要大量使用shell模块


第三步:执行剧本
    如何执行剧本:
	第一个步骤: 检查剧本的语法格式
	ansible-playbook --syntax-check  rsync_server.yaml
    第二个步骤: 模拟执行剧本
	ansible-playbook -C rsync_server.yaml
	第三个步骤: 直接执行剧本   
	ansible-playbook rsync_server.yaml   
(2)一键化部署Rsync服务

1.命令实现

服务端的操作
	第一个历程安装软件:
	ansible 172.16.1.41 -m yum -a "name=rsync state=installed"
	
	第二个历程编写文件:
	ansible 172.16.1.41 -m copy -a "src=/etc/rsyncd.conf dest=/etc/"
	
	第三个历程创建用户
	ansible 172.16.1.41 -m user -a "name=rsync create_home=no shell=/sbin/nologin"
	
	第四个历程创建目录
	ansible 172.16.1.41 -m file -a "dest=/backup state=directory owner=rsync group=rsync"
	
	第五个历程创建密码文件
	ansible 172.16.1.41 -m copy -a "content='rsync_backup:123456' dest=/etc/rsync.password mode=600"
	
	第六个历程启动服务
	ansible 172.16.1.41 -m service -a "name=rsyncd state=started enabled=yes"
	
客户端的操作:
	第一个历程: 创建密码文件
	ansible 客户端地址 -m copy -a "content='rsync_backup:123456' dest=/etc/rsync.password mode=600"

2.剧本实现

[root@m01 ansible-playbook]# vim rsync_server.yaml 
- hosts: rsync_server
  tasks:
    - name: 01-install rsync  
      yum: name=rsync state=installed
    - name: 02-push conf file    
      copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
    - name: 03-create user
      user: name=rsync create_home=no shell=/sbin/nologin
      #shell: useradd rsync -M -s /sbin/nologin 
    - name: 04-create backup dir
      file: path=/backup state=directory owner=rsync group=rsync
    - name: 05-create password file
      copy: content=rsync_backup:123456 dest=/etc/rsync.password mode=600
    - name: 06-start rsync server
      service: name=rsyncd state=started enabled=yes

- hosts: rsync_clients
  tasks:
    - name: 01-install rsync
      yum: name=rsync state=installed
    - name: 02-create password file
      copy: content=123456 dest=/etc/rsync.password mode=600
    - name: 03-create test file
      file: dest=/tmp/test.txt  state=touch
    - name: 04-check test
      shell: rsync -avz /tmp/test.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
(3) 一键化部署全网备份项目

(4) 一键化部署NFS服务
(5) 一键化部署实时同步服务

八、网站监控服务zabbix

服务端:zabbix

客户端:其他服务器

(一)部署安装zabbix服务

(1)服务端(zabbix)
第一步:配置zabbix仓库
[root@m01 ~]# rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm
[root@m01 ~]# sed -i 's#repo.zabbix.com#mirrors.tuna.tsinghua.edu.cn/zabbix#g' /etc/yum.repos.d/zabbix.repo

第二步: 下载安装zabbix服务端相关软件
zabbix服务程序软件: zabbix-server-mysql
zabbix服务web软件: zabbix-web-mysql httpd php
数据库服务软件: mariadb-server
[root@m01 ~]# yum install -y zabbix-server-mysql zabbix-web-mysql httpd php mariadb-server
[root@m01 ~]# systemctl start mariadb.service && systemctl enable mariadb.service

第三步:软件配置
vim /etc/zabbix/zabbix_server.conf
126 DBPassword=zabbix
vim /etc/httpd/conf.d/zabbix.conf
21         php_value date.timezone Asia/Shanghai

第四步:编写配置数据库服务
systemctl start mariadb.service 
systemctl status mariadb.service
mysql
create database zabbix character set utf8 collate utf8_bin;    --创建zabbix数据库--zabbix
grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';    --创建数据库管理用户
zcat /usr/share/doc/zabbix-server-mysql-4.0.21/create.sql.gz|mysql -uzabbix -pzabbix zabbix      --在zabbix数据库中导入相应的表信息
chown -R apache /usr/share/zabbix/assets     --必须有

第五个里程: 启动zabbix程序相关服务
数据库服务 zabbix服务 httpd服务
systemctl start zabbix-server.service httpd mariadb.service
systemctl enable zabbix-server.service httpd mariadb.service
说明: 至此zabbix-server命令行操作结束
LNMP: nginx php mysql 
LAMP: apache(php模块) mysql
    
第六个里程: 登录zabbix服务端web界面, 进行初始化配置
http://10.0.0.71/zabbix/setup.php
    
10051  zabbix-server 服务端端口号
10050  zabbix-agent  客户端端口号
/etc/zabbix/web/zabbix.conf.php   -- 记录web页面初始化信息
    
第七个里程: 登录zabbix服务web页面
http://10.0.0.71/zabbix/
用户名Admin 密码zabbix

(2)客户端(其他服务器)
    第一个里程: 下载安装zabbix yum 源文件
    LTS long time support
    1) aliyun zabbix yum 源 
    2) 清华源
    rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm
    
    第二个里程: 下载安装zabbix客户端软件
    yum install -y zabbix-agent
    或者
    rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.0-2.el7.x86_64.rpm
    
    第三个里程: 编写zabbix客户端配置文件
    vim /etc/zabbix/zabbix_agentd.conf
    98 Server=172.16.1.71
    
    第四个里程: 启动zabbix-agent服务
    [root@web01 ~]# systemctl start zabbix-agent
    [root@web01 ~]# netstat -lntup|grep 10050
    tcp      0     0 0.0.0.0:10050           0.0.0.0:*            LISTEN      4509/zabbix_agentd  
    tcp      0     0 :::10050                :::*                 LISTEN      4509/zabbix_agentd

(二)实现zabbix自定义监控

(1)需求:监控Nginx服务是否启动
1) 在zabbix-agent进行配置文件编写
第一步: 编写自定义监控命令
ps -ef|grep -c [n]ginx
	
第二步: 编写zabbix-agent配置文件
第一种方法: 直接修改zabbix-agent配置文件参数
UserParameter=
第二种方法: 在/etc/zabbix/zabbix_agentd.d/目录中编写自定义监控文件
vim web_server.conf
UserParameter=键(变量名),值(变量信息)
UserParameter=web_state,ps -ef|grep -c [n]ginx
	
第三步: 重启zabbix-agent服务
systemctl restart zabbix-agent
	
2) 在zabbix-server命令行进行操作
第一步: 检测自定义监控信息是否正确
yum install -y zabbix-get
zabbix_get  -s 172.16.1.7 -k 'web_state'
ps:
-s  表示要监控的主机IP  与zabbix-agent配置文件里的信息一致
-k  key即键信息
	
3) 在zabbix-server网站页面进行配置(如下图所示)
第一步: 进入到创建监控项页面:
配置---主机---选择相应主机的监控项
第二步: 监控项页面如何配置
名称 键值 更新间隔时间 应用集
第三步: 检查是否收集到监控信息

(2)复杂的自定义监控配置(多个服务状态)
1) 在zabbix-agent端编写配置文件
vim server_state.conf 
UserParameter=server_state[*],netstat -lntup|grep -c $1

2) 在zabbix-server命令测试
zabbix_get  -s 172.16.1.7 -k 'server_state[22]'
	
3) 修改配置页面
键值: server_state[22]
(3)报警(邮件报警、微信报警、短信和电话)
1.邮件信息报警
第一个历程: 创建触发器
配置---主机---选择相应监控主机触发器---创建触发器 
设置好表达式
{web01:server_state[nginx].last()}<=2
{监控主机名称:键值名称.调用的表达式函数}<=2 

第二个历程: 修改动作配置
配置---动作---将默认动作进行开启    
    
第三个历程: 建立和163邮箱服务关系
管理---报警媒介类型---创建报警媒介
    
第四个历程: 定义接收报警的邮件地址
小人头--报警媒介--设置收件人信息
       
2.微信报警
第一个历程: 需要注册企业微信,并进行配置
我的企业: 
01. 获取企业id: ww32d68104ab5f51b0
02. 获取企业二维码: 允许员工加入
管理工具:
01. 成员加入---进行审核通过
应用小程序:
01. 进行创建
02. 收集程序信息
    AgentId: 1000006
    Secret: RvQYpaCjWbYMCcwhnPqg1ZYcEGB9cOQCvvlkn-ft6j4
        
第二个历程: 编写脚本(python)
cat /etc/zabbix/zabbix-server.conf 
AlertScriptsPath=/usr/lib/zabbix/alertscripts  --- 放置告警脚本
    
执行脚本报错问题解决:
01. 问题: No module named requests
yum install -y python-pip
pip install requests
02. 问题: 脚本执行语法
    
第三个历程: 修改添加报警媒介---定义了发微信配置
    
第四个历程: 配置接收微信的人员
    
3.短信和电话:
利用第三方短信电话报警平台
01. 利用阿里大鱼(收费)
    https://yq.aliyun.com/articles/658524?spm=a2c4e.11155472.0.0.d821153fAjrH3q  --- 自行研究
02. 利用onealert发送告警
    
第一个历程: 配置报警平台
01. 配置--应用--选择zabbix报警
02. 配置--通知策略
03. 配置--分派策略

这两年,IT行业面临经济周期波动与AI产业结构调整的双重压力,确实有很多运维与网络工程师因企业缩编或技术迭代而暂时失业。

很多人都在提运维网工失业后就只能去跑滴滴送外卖了,但我想分享的是,对于运维人员来说,即便失业以后仍然有很多副业可以尝试。

运维副业方向

运维,千万不要再错过这些副业机会!

第一个是知识付费类副业:输出经验打造个人IP

在线教育平台讲师

操作路径:在慕课网、极客时间等平台开设《CCNA实战》《Linux运维从入门到精通》等课程,或与培训机构合作录制专题课。
收益模式:课程销售分成、企业内训。

技术博客与公众号运营

操作路径:撰写网络协议解析、故障排查案例、设备评测等深度文章,通过公众号广告、付费专栏及企业合作变现。
收益关键:每周更新2-3篇原创,结合SEO优化与社群运营。

第二个是技术类副业:深耕专业领域变现

企业网络设备配置与优化服务

操作路径:为中小型企业提供路由器、交换机、防火墙等设备的配置调试、性能优化及故障排查服务。可通过本地IT服务公司合作或自建线上接单平台获客。
收益模式:按项目收费或签订年度维护合同。

远程IT基础设施代维

操作路径:通过承接服务器监控、日志分析、备份恢复等远程代维任务。适合熟悉Zabbix、ELK等技术栈的工程师。
收益模式:按工时计费或包月服务。

网络安全顾问与渗透测试

操作路径:利用OWASP Top 10漏洞分析、Nmap/BurpSuite等工具,为企业提供漏洞扫描、渗透测试及安全加固方案。需考取CISP等认证提升资质。
收益模式:单次渗透测试报告收费;长期安全顾问年费。

比如不久前跟我一起聊天的一个粉丝,他自己之前是大四实习的时候做的运维,发现运维7*24小时待命受不了,就准备转网安,学了差不多2个月,然后开始挖漏洞,光是补天的漏洞奖励也有个四五千,他说自己每个月的房租和饭钱就够了。

为什么我会推荐你网安是运维人员的绝佳副业&转型方向?

1.你的经验是巨大优势: 你比任何人都懂系统、网络和架构。漏洞挖掘、内网渗透、应急响应,这些核心安全能力本质上是“攻击视角下的运维”。你的运维背景不是从零开始,而是降维打击。

2.越老越吃香,规避年龄危机: 安全行业极度依赖经验。你的排查思路、风险意识和对复杂系统的理解能力,会随着项目积累而愈发珍贵,真正做到“姜还是老的辣”。

3.职业选择极其灵活: 你可以加入企业成为安全专家,可以兼职“挖洞“获取丰厚奖金,甚至可以成为自由顾问。这种多样性为你提供了前所未有的抗风险能力。

4.市场需求爆发,前景广阔: 在国家级政策的推动下,从一线城市到二三线地区,安全人才缺口正在急剧扩大。现在布局,正是抢占未来先机的黄金时刻。

运维转行学习路线

在这里插入图片描述

(一)第一阶段:网络安全筑基

1. 阶段目标

你已经有运维经验了,所以操作系统、网络协议这些你不是零基础。但要学安全,得重新过一遍——只不过这次我们是带着“安全视角”去学。

2. 学习内容

**操作系统强化:**你需要重点学习 Windows、Linux 操作系统安全配置,对比运维工作中常规配置与安全配置的差异,深化系统安全认知(比如说日志审计配置,为应急响应日志分析打基础)。

**网络协议深化:**结合过往网络协议应用经验,聚焦 TCP/IP 协议簇中的安全漏洞及防护机制,如 ARP 欺骗、TCP 三次握手漏洞等(为 SRC 漏扫中协议层漏洞识别铺垫)。

**Web 与数据库基础:**补充 Web 架构、HTTP 协议及 MySQL、SQL Server 等数据库安全相关知识,了解 Web 应用与数据库在网安中的作用。

**编程语言入门:**学习 Python 基础语法,掌握简单脚本编写,为后续 SRC 漏扫自动化脚本开发及应急响应工具使用打基础。

**工具实战:**集中训练抓包工具(Wireshark)、渗透测试工具(Nmap)、漏洞扫描工具(Nessus 基础版)的使用,结合模拟场景练习工具应用(掌握基础扫描逻辑,为 SRC 漏扫工具进阶做准备)。

(二)第二阶段:漏洞挖掘与 SRC 漏扫实战

1. 阶段目标

这阶段是真正开始“动手”了。信息收集、漏洞分析、工具联动,一样不能少。

熟练运用漏洞挖掘及 SRC 漏扫工具,具备独立挖掘常见漏洞及 SRC 平台漏扫实战能力,尝试通过 SRC 挖洞搞钱,不管是低危漏洞还是高危漏洞,先挖到一个。

2. 学习内容

信息收集实战:结合运维中对网络拓扑、设备信息的了解,强化基本信息收集、网络空间搜索引擎(Shodan、ZoomEye)、域名及端口信息收集技巧,针对企业级网络场景开展信息收集练习(为 SRC 漏扫目标筛选提供支撑)。

漏洞原理与分析:深入学习 SQL 注入、CSRF、文件上传等常见漏洞的原理、危害及利用方法,结合运维工作中遇到的类似问题进行关联分析(明确 SRC 漏扫重点漏洞类型)。

工具进阶与 SRC 漏扫应用:

  • 系统学习 SQLMap、BurpSuite、AWVS 等工具的高级功能,开展工具联用实战训练;

  • 专项学习 SRC 漏扫流程:包括 SRC 平台规则解读(如漏洞提交规范、奖励机制)、漏扫目标范围界定、漏扫策略制定(全量扫描 vs 定向扫描)、漏扫结果验证与复现;

  • 实战训练:使用 AWVS+BurpSuite 组合开展 SRC 平台目标漏扫,练习 “扫描 - 验证 - 漏洞报告撰写 - 平台提交” 全流程。
    SRC 实战演练:选择合适的 SRC 平台(如补天、CNVD)进行漏洞挖掘与漏扫实战,积累实战经验,尝试获取挖洞收益。

恭喜你,如果学到这里,你基本可以下班搞搞副业创收了,并且具备渗透测试工程师必备的「渗透技巧」、「溯源能力」,让你在黑客盛行的年代别背锅,工作实现升职加薪的同时也能开创副业创收!

如果你想要入坑黑客&网络安全,笔者给大家准备了一份:全网最全的网络安全资料包需要保存下方图片,微信扫码即可前往获取!

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

(三)第三阶段:渗透测试技能学习

1. 阶段目标

全面掌握渗透测试理论与实战技能,能够独立完成渗透测试项目,编写规范的渗透测试报告,具备渗透测试工程师岗位能力,为护网红蓝对抗及应急响应提供技术支撑。

2. 学习内容

渗透测试核心理论:系统学习渗透测试流程、方法论及法律法规知识,明确渗透测试边界与规范(与红蓝对抗攻击边界要求一致)。

实战技能训练:开展漏洞扫描、漏洞利用、电商系统渗透测试、内网渗透、权限提升(Windows、Linux)、代码审计等实战训练,结合运维中熟悉的系统环境设计测试场景(强化红蓝对抗攻击端技术能力)。

工具开发实践:基于 Python 编程基础,学习渗透测试工具开发技巧,开发简单的自动化测试脚本(可拓展用于 SRC 漏扫自动化及应急响应辅助工具)。

报告编写指导:学习渗透测试报告的结构与编写规范,完成多个不同场景的渗透测试报告撰写练习(与 SRC 漏洞报告、应急响应报告撰写逻辑互通)。

(四)第四阶段:企业级安全攻防(含红蓝对抗)、应急响应

1. 阶段目标

掌握企业级安全攻防、护网红蓝对抗及应急响应核心技能,考取网安行业相关证书。

2. 学习内容

护网红蓝对抗专项:

  • 红蓝对抗基础:学习护网行动背景、红蓝对抗规则(攻击范围、禁止行为)、红蓝双方角色职责(红队:模拟攻击;蓝队:防御检测与应急处置);

  • 红队实战技能:强化内网渗透、横向移动、权限维持、免杀攻击等高级技巧,模拟护网中常见攻击场景;

  • 蓝队实战技能:学习安全设备(防火墙、IDS/IPS、WAF)联动防御配置、安全监控平台(SOC)使用、攻击行为研判与溯源方法;

  • 模拟护网演练:参与团队式红蓝对抗演练,完整体验 “攻击 - 检测 - 防御 - 处置” 全流程。
    应急响应专项:

  • 应急响应流程:学习应急响应 6 步流程(准备 - 检测 - 遏制 - 根除 - 恢复 - 总结),掌握各环节核心任务;

  • 实战技能:开展操作系统入侵响应(如病毒木马清除、异常进程终止)、数据泄露应急处置、漏洞应急修补等实战训练;

  • 工具应用:学习应急响应工具(如 Autoruns、Process Monitor、病毒分析工具)的使用,提升处置效率;

  • 案例复盘:分析真实网络安全事件应急响应案例(如勒索病毒事件),总结处置经验。
    其他企业级攻防技能:学习社工与钓鱼、CTF 夺旗赛解析等内容,结合运维中企业安全防护需求深化理解。

证书备考:针对网安行业相关证书考试内容(含红蓝对抗、应急响应考点)进行专项复习,参加模拟考试,查漏补缺。

运维转行网络攻防知识库分享

网络安全这行,不是会几个工具就能搞定的。你得有体系,懂原理,能实战。尤其是从运维转过来的,别浪费你原来的经验——你比纯新人强多了。

但也要沉得住气,别学了两天Web安全就觉得自己是黑客了。内网、域渗透、代码审计、应急响应,要学的还多着呢。

如果你真的想转,按这个路子一步步走,没问题。如果你只是好奇,我劝你再想想——这行要持续学习,挺累的,但也是真有意思。

关于如何学习网络安全,笔者也给大家整理好了全套网络安全知识库,需要的可以扫码获取!

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

1、网络安全意识
在这里插入图片描述

2、Linux操作系统
在这里插入图片描述

3、WEB架构基础与HTTP协议
图片

4、Web渗透测试
在这里插入图片描述

5、渗透测试案例分享
图片

6、渗透测试实战技巧
图片

7、攻防对战实战
图片

8、CTF之MISC实战讲解
图片

关于如何学习网络安全,笔者也给大家整理好了全套网络安全知识库,需要的可以扫码获取!

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

Logo

更多推荐