集群架构

01. 了解集群架构服务器组成

基本架构组成:(用于让用户进行访问)

前端服务部分:

1)顾客-用户

   是一个访问者,请求访问网站页面

2)保安-防火墙设备

   对访问架构用户进行策略控制,正常访问网站用户,可以放行进入;非法人员(黑客)访问网站,禁止进入

3)对讲机-交换机(外网)

   提供架构中服务器相互通讯交流的需求(提供外部人员访问)

4)迎宾人员-负载均衡服务器

   对用户的访问请求进行调度处理  

5)服务员-网站web服务器

   对用户的请求进行响应处理

后端服务部分:

1)对讲机-交换机(内网)

   提供架构中服务器相互通讯交流的需求(提供内部局域网服务器通讯交流)

2)厨师-数据库服务器

   主要用于存储用户提交文字(字符串)数据信息 

3)厨师-存储服务器

   主要用于存储用户上传视频 音频 图片 附件等数据资料 

4)厨师-备份服务器

   主要用于对用户存储(上传)数据信息进行统一备份管理  

5)厨师-缓存服务器

   主要用于存储用户经常访问的数据信息,提升请求数据信息的响应效率

扩展架构组成:(用于让运维人员远程管理架构中的服务器)

1)员工-运维人员

   可以远程管理架构中服务器(通过特殊通道-VPN隧道) 

2)审计-跳板机服务器

   用于监管内部运维人员操作记录信息,一旦出现架构问题,可以快速定位问题原因,进行相应人员失误问责

3)经理-批量管理服务器

   通过批量管理服务器可以批量管理架构中多台服务器,提升工作效率  

4)监控-监控服务器

   用于监控管理架构中的服务器运行情况,一旦出现问题进行发送告警给相关运维管理人员 

02. 集群架构环境统一规划说明

    ①. 服务器及服务规划说明(图片在上面)

    ②. 主机地址及主机名规划(图片在上面)

    ③. 安装及配置路径等规划(图片在上面)

03. 虚拟软件主机虚拟网络配置

第一步:在虚拟软件中配置虚拟局域网

配置虚拟网段信息,以及虚拟网关信息

1、找到编辑---虚拟网络编辑器---选择VMnet8(统一选择这个,如果没有就添加)---配置以下设置

2、先不要点确定,点击NAT设置,将网关IP设置10.0.0.254,然后点击确定---确定

3、检查一下是不是设置完成,在win主机中,找到网络与共享中心---更改适配器设置---找到VMnet8---右键属性---双击Internet 协议版本 4,做如下修改后,确定,关闭。为保证生效,可以先右键禁用网卡,再开启。

注:可能会出现下面的情况,出现两个ipv4地址,

解决方法是,在ipv4地址设置里面有一个高级,点进去删除错误的IP,只留下10.0.0.253

第二步:在虚拟软件中虚拟机添加网卡

1、选中我们创建好的虚拟机,右键---设置---点击右下方的添加---选择网络适配器---点击下一步直到完成。

2、选中我们创建好的虚拟网卡,做如下设置。

3、设备状态选择启动时连接,网络连接选择LAN区段,第一次选择是灰色的,需要手动添加区段,区段只是一个名称起标识作用,用来模拟LAN

 

此时,虚拟主机中设置了两块网卡:

eth0nat模式网卡

eth1LAN区段网卡(区段名称为 172.16.1.0/24

第三步:在虚拟软件中虚拟机网卡配置

1、打开虚拟主机

2、Xshell软件中新建文件夹,新建连接

3、通过setup图形化界面设置

Default gateway IP 要和虚拟机软件设置的网关IP一样

controlled by NetworkManager 建议取消,避免影响网速

4、新建一个网卡,选择Ethernet

5、网卡设置

6、保存后,重启网络服务

[root@luffy-001 ~]# /etc/init.d/network restart
Shutting down interface eth0:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:  Determining if ip address 10.0.0.200 is already in use for device eth0...
                                                           [  OK  ]
Bringing up interface eth1:  Determining if ip address 172.16.1.200 is already in use for device eth1...
                                                           [  OK  ]

查看一下IP信息

[root@luffy-001 ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:4B:3D:A9  
          inet addr:10.0.0.200  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe4b:3da9/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:398 errors:0 dropped:0 overruns:0 frame:0
          TX packets:356 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:39058 (38.1 KiB)  TX bytes:66339 (64.7 KiB)

eth1      Link encap:Ethernet  HWaddr 00:0C:29:4B:3D:B3  
          inet addr:172.16.1.200  Bcast:172.16.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe4b:3db3/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 b)  TX bytes:828 (828.0 b)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:720 (720.0 b)  TX bytes:720 (720.0 b)

看到这些信息,证明设置已经生效

第四步:在虚拟软件中虚拟机系统优化

. 模板机优化配置---hosts文件配置

因为我们每台主机都要设置主机名称,每台主机设置名称的时候分为3个步骤

1、hostname命令修改主机名称

2、修改/etc/sysconfig/network

3、修改/etc/host文件,主机名和主机的解析关系

4、因为每一台都要优化,所以我们做一个统一的完整的,架构里面都有的主机名和IP地址对应的表

直接执行以下命令就可以了

\cp /etc/hosts{,.bak}
cat >/etc/hosts<<EOF
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.5      lb01
172.16.1.6      lb02
172.16.1.7      web01
172.16.1.8      web02
172.16.1.9      web03
172.16.1.51     db01
172.16.1.31     nfs01
172.16.1.41     backup
172.16.1.61     m01
EOF

. 模板机优化配置---更改yum

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

更改好了,检查一下

[root@luffy-001 ~]# cd /etc/yum.repos.d/
[root@luffy-001 yum.repos.d]# ll
total 28
-rw-r--r--. 1 root root 2523 Jun 16  2018 CentOS-Base.repo
-rw-r--r--. 1 root root  647 Mar 28  2017 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root  289 Mar 28  2017 CentOS-fasttrack.repo
-rw-r--r--. 1 root root  630 Mar 28  2017 CentOS-Media.repo
-rw-r--r--. 1 root root 7989 Mar 28  2017 CentOS-Vault.repo
-rw-r--r--  1 root root  664 May 11  2018 epel.repo
[root@luffy-001 yum.repos.d]# cat CentOS-Base.repo 
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the 
# remarked out baseurl= line instead.
#
#
 
[base]
name=CentOS-$releasever - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/  
        http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-6
 
#released updates 
[updates]
name=CentOS-$releasever - Updates - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/updates/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-6
 
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/extras/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-6
 
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/centosplus/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-6
 
#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/contrib/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/contrib/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-6
[root@luffy-001 yum.repos.d]# cat epel.repo 
[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
baseurl=http://mirrors.aliyun.com/epel/6/$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
 
[epel-debuginfo]
name=Extra Packages for Enterprise Linux 6 - $basearch - Debug
baseurl=http://mirrors.aliyun.com/epel/6/$basearch/debug
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
gpgcheck=0
 
[epel-source]
name=Extra Packages for Enterprise Linux 6 - $basearch - Source
baseurl=http://mirrors.aliyun.com/epel/6/SRPMS
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
gpgcheck=0
[root@luffy-001 yum.repos.d]# 

. 模板机优化配置---关闭selinux

 

sed -i.bak 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
grep SELINUX=disabled /etc/selinux/config
setenforce 0
getenforce 

 

. 模板机优化配置---关闭iptables

/etc/init.d/iptables stop
/etc/init.d/iptables stop
/etc/init.d/iptables status
chkconfig iptables off

. 模板机优化配置---精简开机自启动服务

export LANG=en
chkconfig|egrep -v "crond|sshd|network|rsyslog|sysstat"|awk '{print "chkconfig",$1,"off"}'|bash
chkconfig --list|grep 3:on

. 模板机优化配置---提权oldboy可以sudo(可选配置)

useradd oldboy
echo 123456|passwd --stdin oldboy
\cp /etc/sudoers /etc/sudoers.ori
echo "oldboy  ALL=(ALL) NOPASSWD: ALL " >>/etc/sudoers
tail -1 /etc/sudoers
visudo -c

. 模板机优化配置---英文字符集

cp /etc/sysconfig/i18n /etc/sysconfig/i18n.ori
echo 'LANG="en_US.UTF-8"'  >/etc/sysconfig/i18n
source /etc/sysconfig/i18n
echo $LANG

. 模板机优化配置---时间同步

echo '#time sync by lidao at 2017-03-08' >>/var/spool/cron/root
echo '*/5 * * * * /usr/sbin/ntpdate pool.ntp.org >/dev/null 2>&1' >>/var/spool/cron/root
crontab -l

. 模板机优化配置---加大文件描述

#加载一个服务后,会打开一个文件读取相应的配置文件,在进程里面就叫做打开了一个文件描述符

#所以,尽量让可以打开的文件描述符的数量大一些,以保证服务的运转正常

echo '*               -       nofile          65535 ' >>/etc/security/limits.conf
tail -1 /etc/security/limits.conf

. 模板机优化配置---内核优化

cat >>/etc/sysctl.conf<<EOF
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000    65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384

#以下参数是对iptables防火墙的优化,防火墙不开会提示,可以忽略不理。
net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
EOF

#不要忘记执行下面的命令

sysctl -p

. 模板机优化配置---安装其他小软件

yum install lrzsz nmap tree dos2unix nc telnet sl -y

. 模板机优化配置---ssh连接速度慢优化

sed -i.bak 's@#UseDNS yes@UseDNS no@g;s@^GSSAPIAuthentication yes@GSSAPIAuthentication no@g'  /etc/ssh/sshd_config
/etc/init.d/sshd reload

优化一定要做完

04. 虚拟主机克隆操作

第一步:调整虚拟主机网络配置信息

记住:一清空 两删除

两删除:删除网卡(eth0 eth1)中,UUID(硬件标识信息)和HWADDR(网络mac地址)进行删除

sed -ri '/UUID|HWADDR/d'  /etc/sysconfig/network-scripts/ifcfg-eth[01]

一清空:清空网络规则配置文件

echo '>/etc/udev/rules.d/70-persistent-net.rules' >>/etc/rc.local

第二步:关闭虚拟模板机

 shutdown -h now

第三步:进行模板机的克隆操作

链接克隆:

 优势:节省系统资源  克隆效率较高

 劣势:模板主机不能出现问题,一旦模板主机失效,所有克隆主机也无法正常工作

完整克隆:

 优势:模板主机和克隆主机相互独立,模板主机出现问题,克隆主机依旧可以正常使用

 劣势:浪费系统资源  克隆效率较低

第四步:开启克隆后虚拟主机(一台一台开启,确认模板主机关闭),设置虚拟主机地址和网卡

因为克隆机的IP地址和模板机是一样的,那么,我们就可以用xshell直接连接模板机的会话就能连接

# 修改主机名称

hostname backup
sed -i "s#主机名称#backup#g" /etc/sysconfig/network

说明:主机名称需要填写为当前系统主机名,然后进行一下替换即可

# 修改主机IP地址信息

sed -i "s#200#41#g" /etc/sysconfig/network-scripts/ifcfg-eth[01]
cat /etc/sysconfig/network-scripts/ifcfg-eth[01]

# 重启网络服务,重新连接虚拟主机

 

/etc/init.d/network restart

将架构中其余虚拟主机也进行一下克隆操作练习!!!

#############Rsync 备份服务器     10.0.0.41/24      172.16.1.41/24     backup
hostname backup
sed -i "s#oldboy-01#backup#g" /etc/sysconfig/network

sed -i "s#200#41#g" /etc/sysconfig/network-scripts/ifcfg-eth[01]
cat /etc/sysconfig/network-scripts/ifcfg-eth[01]

/etc/init.d/network restart

#############NFS 存储服务器     10.0.0.31/24      172.16.1.31/24     nfs01
hostname nfs01
sed -i "s#oldboy-01#nfs01#g" /etc/sysconfig/network

sed -i "s#200#31#g" /etc/sysconfig/network-scripts/ifcfg-eth[01]
cat /etc/sysconfig/network-scripts/ifcfg-eth[01]

/etc/init.d/network restart

#############MySQL数据库服务器     10.0.0.51/24      172.16.1.51/24     db01
hostname db01
sed -i "s#oldboy-01#db01#g" /etc/sysconfig/network

sed -i "s#200#51#g" /etc/sysconfig/network-scripts/ifcfg-eth[01]
cat /etc/sysconfig/network-scripts/ifcfg-eth[01]

/etc/init.d/network restart

#############管理服务器     10.0.0.61/24      172.16.1.61/24     m01
hostname m01
sed -i "s#oldboy-01#m01#g" /etc/sysconfig/network

sed -i "s#200#61#g" /etc/sysconfig/network-scripts/ifcfg-eth[01]
cat /etc/sysconfig/network-scripts/ifcfg-eth[01]

/etc/init.d/network restart

#############nginx负载服务器01     10.0.0.5/24      172.16.1.5/24     lb01
hostname lb01
sed -i "s#oldboy-01#lb01#g" /etc/sysconfig/network

sed -i "s#200#5#g" /etc/sysconfig/network-scripts/ifcfg-eth[01]
cat /etc/sysconfig/network-scripts/ifcfg-eth[01]

/etc/init.d/network restart


#############nginx负载服务器02     10.0.0.6/24      172.16.1.6/24     lb02
hostname lb02
sed -i "s#oldboy-01#lb02#g" /etc/sysconfig/network

sed -i "s#200#6#g" /etc/sysconfig/network-scripts/ifcfg-eth[01]
cat /etc/sysconfig/network-scripts/ifcfg-eth[01]

/etc/init.d/network restart


#############web服务器01     10.0.0.7/24      172.16.1.7/24     web01
hostname web01
sed -i "s#oldboy-01#web01#g" /etc/sysconfig/network

sed -i "s#200#7#g" /etc/sysconfig/network-scripts/ifcfg-eth[01]
cat /etc/sysconfig/network-scripts/ifcfg-eth[01]

/etc/init.d/network restart


#############web服务器02     10.0.0.8/24      172.16.1.8/24     web02
hostname web02
sed -i "s#oldboy-01#web02#g" /etc/sysconfig/network

sed -i "s#200#8#g" /etc/sysconfig/network-scripts/ifcfg-eth[01]
cat /etc/sysconfig/network-scripts/ifcfg-eth[01]

/etc/init.d/network restart



#############web服务器03     10.0.0.9/24      172.16.1.9/24     web03
hostname web03
sed -i "s#oldboy-01#web03#g" /etc/sysconfig/network

sed -i "s#200#9#g" /etc/sysconfig/network-scripts/ifcfg-eth[01]
cat /etc/sysconfig/network-scripts/ifcfg-eth[01]

/etc/init.d/network restart
克隆

05.集群架构图以及架构流程

备份服务PPT

06.备份服务笔记

01.rsync服务介绍

属于一款实现全量及增量复制同步的软件工具,什么是全量和增量?见上图介绍

Rsync是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程数据同步备份的优秀工具。并且可以不进行改变原有数据的属性信息,实现数据的备份迁移特性。Rsync软件适用于unix/linux/windows等多种操作系统平台。
Rsync是一个快速和非常通用的文件复制工具。它能本地复制,远程复制,或者远程守护进程方式复制。它提供了大量的参数来控制其行为的各个方面,并且允许非常灵活的方式来实现文件的传输复制。它以其delta-transfer算法闻名。减少通过网络数据发送数量,利用只发送源文件和目标文件之间的差异信息,从而实现数据的增量同步复制。

02. rsync服务命令简单应用(1v4的应用效果)

. rsync == cp

[root@backup ~]# # rsync == cp效果
[root@backup ~]# cp -a /etc/hosts /tmp/
[root@backup ~]# ll /tmp/
total 4
-rw-r--r--. 1 root root 352 Jan 27 01:15 hosts
[root@backup ~]# rsync -a /etc/sysconfig/network /tmp/
[root@backup ~]# ll /tmp/
total 8
-rw-r--r--. 1 root root 352 Jan 27 01:15 hosts
-rw-r--r--  1 root root  31 Jan 26 18:16 network

. rsync == scp

[root@backup ~]# scp -rp /tmp/ 172.16.1.31:/tmp/
The authenticity of host '172.16.1.31 (172.16.1.31)' can't be established.
RSA key fingerprint is 5b:9b:e6:79:a9:95:4f:be:06:41:e3:bb:7a:12:ee:b4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.1.31' (RSA) to the list of known hosts.
root@172.16.1.31's password:
network                                                                                                                              100%   31     0.0KB/s   00:00    
hosts                                                                                                                                100%  352     0.3KB/s   00:00    
[root@backup ~]# ll /tmp/
total 8
-rw-r--r--. 1 root root 352 Jan 27 01:15 hosts
-rw-r--r--  1 root root  31 Jan 26 18:16 network
[root@backup ~]# rsync -rp /tmp/ 172.16.1.31:/tmp/
root@172.16.1.31's password:
[root@backup ~]#

说明:同步数据时,/tmp/目录后/信息,表示将目录下面的数据内容进行备份同步

          同步数据时,/tmp目录后没有/信息,表示将目录及目录下面的数据内容进行备份同步  

rsync == rm

说明rsync实现删除目录中数据内容过程,就将一个空目录和一个有数据的目录进行同步

最终,会将有数据的目录中的文件进行清空

[root@backup ~]# mkdir /null
[root@backup ~]# rsync --delete  /null/  /tmp/
rsync: --delete does not work without -r or -d.
rsync error: syntax or usage error (code 1) at main.c(1422) [client=3.0.6]
[root@backup ~]#
[root@backup ~]# rsync  -r  --delete  /null/  /tmp/
[root@backup ~]# ll /tmp/
total 0

rsync == ls

[root@backup ~]# ls /etc/hosts
/etc/hosts
[root@backup ~]# ls -l /etc/hosts
-rw-r--r--. 2 root root 352 Jan 27 01:15 /etc/hosts
[root@backup ~]# rsync /etc/hosts
-rw-r--r--         352 2018/01/27 01:15:59 hosts 

03. rsync软件工作方式

. 本地数据备份方式

   Local:  rsync [OPTION...] SRC... [DEST]

   rsync     --- 数据备份传输命令

   option   --- 可以输入一下和rsync传输数据有关的参数

   src        --- 要进行备份的数据(文件/目录)

   dest      --- 将数据信息备份到什么位置(相应路径中) 

实践练习:

[root@backup ~]# rsync -a /etc/hosts /tmp/ok.txt
[root@backup ~]# ll /tmp/ok.txt
-rw-r--r-- 1 root root 352 Jan 27 01:15 /tmp/ok.txt

. 远程数据备份方式

   Access via remote shell:

         Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]

         Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

 

   pull方式语法说明:

   rsync    --- 数据备份传输命令

   option   --- 可以输入一下和rsync传输数据有关的参数

   [USER@]HOST:     --- 需要指定以什么用户身份登录到远程主机,

                        如果省略USER信息,表示以当前用户身份进行登录

登录主机地址或域名信息

   SRC      --- 指定远程主机要传输过来到本地的数据信息

   dest      --- 将数据保存到本地的什么路径中

   

   push方式语法说明:

   rsync    --- 数据备份传输命令

   option   --- 可以输入一下和rsync传输数据有关的参数

   [USER@]HOST:     --- 需要指定以什么用户身份登录到远程主机,

                        如果省略USER信息,表示以当前用户身份进行登录

登录主机地址或域名信息

   SRC      --- 指定本地主机要传输到远程主机的数据

   dest      --- 将本地数据保存到远端的什么路径中

. 守护进程传输模式

Access via rsync daemon:

     Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
           rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]

     Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
           rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

pull:rsync [OPTION...] [USER@]HOST::SRC... [DEST]
[USER@]HOST::       --- 指定远程连接的认证用户
SRC                 --- 指定相应的模块信息
[DEST]             --- 将远程数据保存到本地的路径信息


Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
[USER@]HOST::       --- 指定远程连接的认证用户
SRC                 --- 指定本地要进行推送的数据信息
[DEST]             --- 远程进行保存数据的模块信息

数据传输参数说明
见上面图片中

04. rsync守护进程部署流程

1)服务端部署流程

第一里程:检查软件是否安装

[root@backup ~]# rpm -qa rsync
rsync-3.0.6-12.el6.x86_64

第二里程:编写配置文件

 vim /etc/rsyncd.conf

#rsync_config
#created by HQ at 2017
##rsyncd.conf start##

uid = rsync
gid = rsync
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

写在模块之上的是全局配置

写在模块内的是局部配置

第三个里程:创建备份目录管理用户

useradd rsync -M -s /sbin/nologin

第四个里程:创建备份目录

mkdir /backup
chown -R rsync.rsync /backup

第五个里程:创建认证文件

#因为有密码信息,所以要更改权限,只有root用户能看

echo "rsync_backup:oldboy123"  >>/etc/rsync.password
chmod 600 /etc/rsync.password 

第六个里程:启动rsync服务

rsync --daemon

启动后查看一下,记住端口号是873

[root@backup ~]# rsync --daemon
[root@backup ~]# ps -ef |grep rsync
root       1844      1  0 13:10 ?        00:00:00 rsync --daemon
root       1846   1274  0 13:11 pts/0    00:00:00 grep --color=auto rsync
[root@backup ~]# netstat -lntup|grep rsync
tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      1844/rsync          
tcp        0      0 :::873                      :::*                        LISTEN      1844/rsync   

Rsync守护进程模式配置文件信息

见上图篇

#rsync_config
#created by HQ at 2017
##rsyncd.conf start##

uid = rsync    指定rsync服务运行的时候,向磁盘进行读取和写入操作的操作者                             
gid = rsync
use chroot = no   进行数据同步存储时,安全相关参数,默认内网进行数据同步,可以关闭
max connections = 200   定义向备份服务器进行数据存储的并发连接数
timeout = 300   定义与备份服务器建立的网络连接,在多长时间没有数据传输时,就释放连接
pid file = /var/run/rsyncd.pid   服务程序运行时,会将进程的pid信息存储到一个指定的pid文件中
lock file = /var/run/rsync.lock  定义锁文件,主要用于配合max connections 参数,当达到最大连接就禁止继续访问
log file = /var/log/rsyncd.log   定义服务的日志文件保存路径信息
ignore errors   在进行数据备份传输过程过程中,忽略一些I/O产生的传输错误
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@nfs01 ~]# rpm -qa rsync
rsync-3.0.6-12.el6.x86_64

第二个里程:创建认证密码文件

#密码要和服务端一样,创建的位置无所谓,最好跟服务端保持一致

[root@nfs01 ~]# echo "oldboy123" >>/etc/rsync.password   
[root@nfs01 ~]# chmod 600 /etc/rsync.password

第三个里程:进行数据备份测试

[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
sending incremental file list
hosts
sent 189 bytes  received 27 bytes  432.00 bytes/sec
total size is 352  speedup is 1.63

 3)数据传输过程原理分析

1、客户端:我要备份数据(输入命令)

2、服务端:你是谁(读取配置文件,和命令中的参数进行比对)

3、口令通过,允许传输

4、变换指定身份

5、存储

05 rsync服务错误排查方法

   1)检查错误日志

  配置中的日志文件log file = /var/log/rsyncd.log

   2)可以在模拟环境下。模拟练习一些错误

Rsync服务常见问题汇总讲解:
==================================
1. rsy    nc服务端开启的iptables防火墙
  【客户端的错误】
   No route to host
  【错误演示过程】
   [root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
   rsync: failed to connect to 172.16.1.41: No route to host (113)
   rsync error: error in socket IO (code 10) at clientserver.c(124) [sender=3.0.6]
  【异常问题解决】
   关闭rsync服务端的防火墙服务(iptables)
   [root@backup mnt]# /etc/init.d/iptables stop
   iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
   iptables: Flushing firewall rules:                         [  OK  ]
   iptables: Unloading modules:                               [  OK  ]
   [root@backup mnt]# /etc/init.d/iptables status
   iptables: Firewall is not running.

2. rsync客户端执行rsync命令错误
  【客户端的错误】
   The remote path must start with a module name not a / 
  【错误演示过程】
   [root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::/backup
   ERROR: The remote path must start with a module name not a /
   rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
  【异常问题解决】
   rsync命令语法理解错误,::/backup是错误的语法,应该为::backup(rsync模块)

3. rsync服务认证用户失败*****
  【客户端的错误】
   auth failed on module oldboy
  【错误演示过程】
   [root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
   Password: 
   @ERROR: auth failed on module backup
   rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
  【异常问题解决】
   1. 密码真的输入错误,用户名真的错误
   2. secrets file = /etc/rsync.password指定的密码文件和实际密码文件名称不一致
   3. /etc/rsync.password文件权限不是600
   4. rsync_backup:123456密码配置文件后面注意不要有空格
   5. rsync客户端密码文件中只输入密码信息即可,不要输入虚拟认证用户名称

4. rsync服务位置模块错误
  【客户端的错误】
   Unknown module 'backup'   
  【错误演示过程】  
   [root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
   @ERROR: Unknown module 'backup'
   rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
  【异常问题解决】
   1. /etc/rsyncd.conf配置文件模块名称书写错误
   
5. rsync服务权限阻止问题
  【客户端的错误】
   Permission denied
  【错误演示过程】 
   [root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
   Password: 
   sending incremental file list
   hosts
   rsync: mkstemp ".hosts.5z3AOA" (in backup) failed: Permission denied (13) 
   sent 196 bytes  received 27 bytes  63.71 bytes/sec
   total size is 349  speedup is 1.57
   rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1039) [sender=3.0.6]   
  【异常问题解决】
   1. 备份目录的属主和属组不正确,不是rsync
   2. 备份目录的权限不正确,不是755
   
6. rsync服务备份目录异常
  【客户端的错误】
   chdir failed   
  【错误演示过程】   
   [root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
   Password: 
   @ERROR: chdir failed
   rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
  【异常问题解决】  
   1. 备份存储目录没有建立
   2. 建立的备份存储目录和配置文件定义不一致
   说明:如果没有备份存储目录

7. rsync服务无效用户信息
  【客户端的错误】
   invalid uid rsync
  【错误演示过程】    
   [root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
   Password: 
   @ERROR: invalid uid rsync
   rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]
  【异常问题解决】  
   rsync服务对应rsync虚拟用户不存在了
    
8. 客户端已经配置了密码文件,但免秘钥登录方式,依旧需要输入密码
  【客户端的错误】
   password file must not be other-accessible
  【错误演示过程】 
   [root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
   password file must not be other-accessible
   continuing without password file
   Password: 
   sending incremental file list
   sent 26 bytes  received 8 bytes  5.23 bytes/sec
   total size is 349  speedup is 10.26
  【异常问题解决】  
   rsync客户端的秘钥文件也必须是600权限

9. rsync客户端连接慢问题
   IP   ===  域名    反向DNS解析
  【错误日志信息】 
   错误日志输出
   2017/03/08 20:14:43 [3422] params.c:Parameter() - Ignoring badly formed line in configuration file: ignore errors
   2017/03/08 20:14:43 [3422] name lookup failed for 172.16.1.31: Name or service not known
   2017/03/08 20:14:43 [3422] connect from UNKNOWN (172.16.1.31)
   2017/03/08 20:14:43 [3422] rsync to backup/ from rsync_backup@unknown (172.16.1.31)
   2017/03/08 20:14:43 [3422] receiving file list
   2017/03/08 20:14:43 [3422] sent 76 bytes  received 83 bytes  total size 349
   正确日志输出
   2017/03/08 20:16:45 [3443] params.c:Parameter() - Ignoring badly formed line in configuration file: ignore errors
   2017/03/08 20:16:45 [3443] connect from nfs02 (172.16.1.31)
   2017/03/08 20:16:45 [3443] rsync to backup/ from rsync_backup@nfs02 (172.16.1.31)
   2017/03/08 20:16:45 [3443] receiving file list
   2017/03/08 20:16:45 [3443] sent 76 bytes  received 83 bytes  total size 349
  【异常问题解决】
   查看日志进行分析,编写rsync服务端hosts解析文件(之前编写的有全部IP和主机名对应关系的那个文件)
  
10 rsync服务没有正确启动,没有开机自启动,或者被其他程序占用了端口 【错误日志信息】 Connection refused (111) 【错误演示过程】 [root@oldboy-muban ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup rsync: failed to connect to 172.16.1.41: Connection refused (111) rsync error: error in socket IO (code 10) at clientserver.c(124) [sender=3.0.6] 【异常问题解决】 [root@oldboy-muban ~]# rsync --daemon [root@oldboy-muban ~]# ss -lntup |grep rsync tcp LISTEN 0 5 :::873 :::* users:(("rsync",1434,5)) tcp LISTEN 0 5 *:873 *:* users:(("rsync",1434,4)) [root@oldboy-muban ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup Password: sending incremental file list hosts sent 196 bytes received 27 bytes 49.56 bytes/sec total size is 349 speedup is 1.57

   扩展说明:rsync启动服务扩展参数

 killall  rsync  停止所有进程

   --port         指定rsync服务端口号信息,默认是873

   --config=xxx   指定识别的rsync服务配置文件信息  

06 rsync服务扩展应用

① 守护进程多模块功能配置

第一步:修改配置文件

vim /etc/rsyncd.conf

[backup01]
comment = "backup dir by oldboy"
path = /backup

[backup02]
comment = "backup dir by oldboy"
path = /backup02

第二步:创建多模块目录

mkdir /backup02
chown -R rsync.rsync /backup02

第三步:重启服务程序

killall rsync
rsync --daemon

第四步:进行测试检查

[root@nfs01 tmp]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup01 --password-file=/etc/rsync.password

② 守护进程的排除功能实践

第一种数据备份排除方式:--exclude
rsync -avz /test_dir/ --exclude=b --exclude=d rsync_backup@172.16.1.41::backup01 --password-file=/etc/rsync.password
rsync -avz /test_dir/ --exclude={b,d} rsync_backup@172.16.1.41::backup01 --password-file=/etc/rsync.password  
rsync -avz /test_dir/ --exclude={b..d} rsync_backup@172.16.1.41::backup01 --password-file=/etc/rsync.password    #连续的文件

第二种数据备份排除方式:--exclude-from=file
rsync -avz /test_dir/ --exclude-from=./exclude_file.txt rsync_backup@172.16.1.41::backup01 --password-file=/etc/rsync.password

注意:文件中的文件路径是相对路径,比如上面就是相对/test_dir/的路径,一行一个
注意:文件的路径也是相对与/test_dir/的路径 

③ 守护进程来创建备份目录

对于我们的备份服务器来说,不管是运维,开发或者是其让人员,都会使用备份,我们可以加以区分,也不需要修改配置,或者增加模块,直接在命令行中就可以区别开来

直接在模块后面加上一个路径/xx/
rsync -avz /etc/hosts --exclude-from=./exclude_file.txt rsync_backup@172.16.1.41::backup01/sa/ --password-file=/etc/rsync.password
rsync -avz /etc/hosts --exclude-from=./exclude_file.txt rsync_backup@172.16.1.41::backup01/dev/ --password-file=/etc/rsync.password
rsync -avz /etc/hosts --exclude-from=./exclude_file.txt rsync_backup@172.16.1.41::backup01/dba/ --password-file=/etc/rsync.password

④ 守护进程的访问控制配置(白黑名单)

我们只希望我们自己的服务器或者部分服务器被分到我们的备份服务器中,而不希望其他服务器备份。

三种情况:

 1. 只有白名单,白名单网段或主机信息允许。其余阻止

 2. 只有黑名单,黑名单网段或主机信息阻止,其余允许

 3. 有黑名单也有白名单,白名单网段或主机信息允许,黑名单网段或主机信息阻止,其余允许

  并且,白名单优先黑名单

 建议只选择前两种方式配置

     hosts allow = 172.16.1.0/24

     hosts deny = 0.0.0./32

⑤ 守护进程无差异同步配置

当存储服务器中有不良数据后,在没有删除之前也是会同步到备份服务器的,但是,在发现之后,我们在存储服务器中删除了这个不良数据 。

如果遇到存储服务器坏掉了,这个时候,就需要备份服务器可以临时顶上去,但是我们不能把不良数据也顶上去,这个时候,就用上了无差异同步。

这种情况也叫作数据信息不一致

 无差异同步:我有的,你也有;我没有的,你也不能有

 rsync -avz /test_dir/ --delete rsync_backup@172.16.1.41::backup01 --password-file=/etc/rsync.password

 这是一个pull操作,那么push操作会如何呢?

 说明:一定要谨慎使用,否则可能会清空备份目录;

           如果要快速清空目录数据,也可以使用无差异同步清空,这个是最好用的,用于删除原有不好删除的大文件 

⑥ 守护进程的列表功能配置

list = false

说明:表示是否列表显示rsync服务端所有模块信息

[root@backup ~]# vim /etc/rsyncd.conf
list = true

[root@nfs01 test_dir]# rsync rsync_backup@172.16.1.41::
backup01        "backup dir by oldboy"
backup02        "backup dir by oldboy"

那么这么做,肯定是不好的,一下就看到你的模块信息了,就能做些坏事了,比如说根据查到的模块信息进行无差异化同步

07.NFS存储服务笔记

01. 课程回顾

备份服务概念介绍(rsync备份服务利用相应算法,实现增量数据同步)

备份服务工作方式说明:

  1. 本地数据备份同步方式(类似cp命令)

  2. 远程数据备份同步方式(类似scp命令)

  3. 守护进程方式备份同步

备份服务器守护进程部署

  1. 服务端部署流程

  2. 客户端部署流程

备份服务配置文件与命令参数说明(man rsyncd.conf man rsync)

备份服务扩展应用实践

  1. 实现rsync服务多个模块配置

  2. 实现rsync服务数据同步过滤功能

  3. 实现rsync服务访问策略控制

  4. 实现rsync服务无差异同步功能(--delete

  5. 实现rsync服务客户端创建备份目录信息

  6. 实现rsync模块信息列表显示(list=true

02. NFS共享存储服务开篇介绍

共享存储服务是什么

NFSNetwork File System的缩写,中文意思是网络文件系统,

 它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。

 

NFS共享存储服务的应用:

 将数据存储到一台服务器上,实现数据统一一致,共享访问

 图片演示没有NFS和有NFS的区别,如果没有NFS服务器,我们的网络服务器之间就要不断的用网络进行同步,

 

NFS存储服务器中主要存储哪些信息:用户上传的图片 音频 视频 附件等信息

NFS服务是分为服务端和客户端

存储服务器:NFS服务端   

网站web服务器:NFS客户端

实现共享存储好处

  01. 实现数据统一一致

  02. 节省网站磁盘资源

  03. 节省网站访问带宽

 

NFS共享存储服务的原理

    ①. nfs服务端创建共享存储目录

    ②. nfs客户端创建远程挂载点目录

    ③. nfs客户端进行远程挂载

    ④. 实现客户端数据信息统一一致

共享文件系统的工作原理

(服务端3步 客户端3步)

服务端做了三件事:

1. 启动rpcbind服务,创建中介

2. 启动nfs服务,创建房源信息

3. 将房源信息向中介进行注册,在nfs服务稳定运行过程中,房源信息只注册一次(只有在服务重启后,才重新注册)

 

客户端做了三件事:

1. 启动rpcbind服务(可选,如果出现了一些网络问题,可以启动一下)

2. 确保客户端和服务端网络连接建立成功

3. 执行mount命令进行网络存储挂载

03. NFS服务重要概念说明

NFS共享文件系统RPC服务介绍

 通过下图和中介租房的比喻的来理解

NFS共享文件系统RPC服务由来

NFS已启动就会有多个进程,多个端口,而且重新启动之后,是会变化的 

04. NFS服务部署实践过程

NFS服务端部署流程:

第一个里程:检查服务软件是否安装

rpm -qa|egrep "nfs-utils|rpcbind"

第二个里程:进行软件服务安装

yum install -y nfs-utils rpcbind

补充说明:nfs-utils rpcbind两个软件大礼包里面都安装了什么

rpm -ql nfs-utils  查看nfs-utils安装了什么

重要的:

/etc/rc.d/init.d/nfs     <-- nfs服务启动脚本文件

/usr/sbin/showmount      <-- 检查nfs服务共享目录信息

 

rpm -ql rpcbind 查看rpc安装了什么

重要的:

/etc/rc.d/init.d/rpcbind   <-- rpcbind服务启动脚本文件

/usr/sbin/rpcinfo          <-- 检查nfs服务向rpc服务注册信息

 

第三个里程:编写nfs服务配置文件

[root@nfs01 ~]# ll /etc/exports
-rw-r--r-- 1 root root 30 2018-02-25 13:30 /etc/exports   <-- nfs服务配置文件,默认已经存在
[root@nfs01 ~]# vim /etc/exports
/data  172.16.1.0/24(rw,sync)   rw --可读写   sync--同步

说明:配置文件信息格式:

  指定共享目录   指定共享目录访问控制网段或主机信息/24(共享目录参数信息)

 

第四个里程:创建nfs服务共享目录,并且进行授权

mkdir /data
chown -R nfsnobody.nfsnobody /data

第五个里程:启动nfsrpc服务

/etc/init.d/rpcbind start       <- 首先启动rpcbind服务

/etc/init.d/nfs start           <- 其次启动nfs服务

 

第六个里程:进行服务配置检查

先检查房源信息是否注册

rpcinfo -p 172.16.1.31

[root@nfs01 ~]# rpcinfo -p 172.16.1.31
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100011    1   udp    875  rquotad
    100011    2   udp    875  rquotad
    100011    1   tcp    875  rquotad
    100011    2   tcp    875  rquotad
    100005    1   udp  30262  mountd
    100005    1   tcp  55410  mountd
    100005    2   udp  26625  mountd
    100005    2   tcp  11742  mountd
    100005    3   udp  32578  mountd
    100005    3   tcp   5204  mountd
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    2   tcp   2049  nfs_acl
    100227    3   tcp   2049  nfs_acl
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    2   udp   2049  nfs_acl
    100227    3   udp   2049  nfs_acl
    100021    1   udp  35481  nlockmgr
    100021    3   udp  35481  nlockmgr
    100021    4   udp  35481  nlockmgr
    100021    1   tcp  16000  nlockmgr
    100021    3   tcp  16000  nlockmgr
    100021    4   tcp  16000  nlockmgr

检查是否存在可用的共享目录

[root@nfs01 ~]# showmount -e 10.0.0.31
Export list for 10.0.0.31:
/data 172.16.1.0/24

NFS客户端部署流程:

第一个里程:检查服务软件是否安装

rpm -qa|egrep "nfs-utils|rpcbind"

第二个里程:进行软件服务安装

yum install -y nfs-utils rpcbind

第三个里程:进行共享目录挂载

[root@web02 ~]# mount -t nfs 172.16.1.31:/data /mnt
[root@web02 ~]# df -h
Filesystem         Size  Used Avail Use% Mounted on
172.16.1.31:/data  8.6G  1.9G  6.4G  23% /mnt

第四个里程:进行共享存储测试

[root@web01 mnt]# touch test.txt
[root@web01 mnt]# ls
test.txt


[root@nfs01 ~]# cd /data/
[root@nfs01 data]# ls
test.txt


[root@web02 ~]# ls /mnt
test.txt

说明:在web01mnt目录中创建的数据,在nfsweb02服务器上都可以看到,即已经实现数据共享存储

05. NFS服务部署进程信息详述

 

[root@nfs01 ~]# ps -ef|egrep "rpc|nfs"
rpc        1564      1  0 09:32 ?        00:00:00 rpcbind
rpc        1065      1  0 09:32 ?        00:00:00 rpc statd <- 检查数据存储一致性
root       4736      2  0 21:31 ?        00:00:00 [rpciod/0]
root       5363      1  0 21:47 ?        00:00:00 rpc.rquotad <- 磁盘配额进程(remote quote server)
root       5368      1  0 21:47 ?        00:00:00 rpc.mountd <- 权限管理验证等(NFS mount daemon)
root       5375      2  0 21:47 ?        00:00:00 [nfsd4]
root       5376      2  0 21:47 ?        00:00:00 [nfsd4_callbacks]
root       5377      2  0 21:47 ?        00:00:00 [nfsd] <- NFS主进程
root       5378      2  0 21:47 ?        00:00:00 [nfsd] <- NFS主进程
root       5379      2  0 21:47 ?        00:00:00 [nfsd] <- NFS主进程,管理登入,ID身份判别等。
root       5380      2  0 21:47 ?        00:00:00 [nfsd]
root       5381      2  0 21:47 ?        00:00:00 [nfsd]
root       5382      2  0 21:47 ?        00:00:00 [nfsd]
root       5383      2  0 21:47 ?        00:00:00 [nfsd]
root       5384      2  0 21:47 ?        00:00:00 [nfsd] <- NFS主进程
root       5415      1  0 21:47 ?        00:00:00 rpc.idmapd <- name mapping daemon 用户压缩/用户映射(记录)
root       5512   4670  0 22:02 pts/0    00:00:00 egrep rpc|nfs

 

 idmapd进程详解图示

06. NFS共享文件系统用户映射过程说明

07. NFS共享文件系统配置文件格式说明

NFS服务访问同步异步知识讲解示意图

通过 man exports 语法查看帮助文件,查看文件格式的帮助

NFS共享目录:

    NFS服务器端要共享的实际目录,要用绝对路径,如(/data)。

 注意共享目录的本地权限,如果需要读写共享,一定要让本地目录可以被NFS客户端的用户(nfsnobody)读写。

NFS客户端地址:

    NFS服务器端授权的可访问共享目录的NFS客户端地址,可以为单独的IP地址或主机名、域名等,也可以为整个网段地址。

 还可以用*”来匹配所有客户端服务器,这里所谓的客户端一般来说是前端的业务的业务服务器,例如:web服务。具体说明见表10-3

权限参数集

    对授权的NFS客户端的访问权限设置。参数具体说明见后文。

 nfs权限(共享目录【借给你手机】) nfs配置的/etc/exports /data 172.16.1.0/24(rw)

 本地文件系统权限(【手机密码不告诉你】) 挂载目录的权限rwxr-xr-x root root /data

   手机要给人家,密码也要给,才能用

注:使用域名的时候,一定要做好域名的解析

08. NFS共享文件系统配置文件案例说明

配置例一 /data 10.0.0.0/24rw,sync

    说明:允许客户端读写,并且数据同步写入到服务器端的磁盘里

    注意:24和“(”之间不能有空格  

配置例二 /data 10.0.0.0/24rw,sync,all_squash,anonuid=2000,anongid=2000

    说明:允许客户端读写,并且数据同步写到服务器端的磁盘里,并且指定客户端的用户UIDGID

      早期生产环境的一种配置,适合多客户端共享一个NFS服务单目录,

      如果所有服务器的nfsnobody账户UID都是65534,则本例没什么必要了。

     早期centos5.5的系统默认情况下nfsnobodyUID不一定是65534,此时如果这些服务器共享一个NFS目录,

     就会出现访问权限问题。

配置例三 /home/oldboy 10.0.0.0/24ro)   <-- 是为开发人员想查看线上数据准备配置方式

    说明:只读共享

    用途:例如在生产环境中,开发人员有查看生产服务器日志的需求,但又不希望给开发生产服务器的权限,

      那么就可以给开发提供从某个测试服务器NFS客户端上查看某个生产服务器的日志目录(NFS共享)的权限,

  当然这不是唯一的方法,

  例如可以把程序记录的日志发送到测试服务器供开发查看或者通过收集日志等其它方式展现

09. NFS共享文件系统配置文件参数设置

    参见表格说明

/data 172.16.1.0/24(rw,sync,no_all_squash,root_squash) #只有root用户可以使用,只有root转换成匿名用户nfsnobody
/data 172.16.1.0/24(rw,sync,all_squash) #都可以使用,都转换成匿名用户nfsnobody

/data 172.16.1.0/24(rw,sync,all_squash,anonuid=501,anongid=501) #都可以使用,都映射成指定用户(客户端和用户端的uid和gid保持一致,
服务端的data目录权限也得是指定用户 chown -R oldboy.oldboy /data)

很多公司忌讳使用默认的nfsnobody,要配置自己的用户。使用anonuid和anongid

在更换用户uid和gid的时候,要保证服务端和客户端都有这个用户,而且uid和gid相同

/data 172.16.1.0/24(rw,sync,all_squash,anonuid=501,anongid=501)
~                                                                                                                                
~                                                                                                                                
~                                                                                                                                
                                                                                                                                                                                                                                                 
"/etc/exports" 1L, 65C written                                                                                 
[root@nfs01 ~]# /etc/init.d/nfs reload
#重启后没在web服务器中创建文件
[root@web01 ~]# touch /mnt/oldboy.txt 
touch: cannot touch `/mnt/oldboy.txt': Permission denied
#失败
#因为存储服务器中的权限还是nfsnobody的
[root@nfs01 ~]# ll /data/ -d
drwxr-xr-x. 2 nfsnobody nfsnobody 4096 Feb 24 09:34 /data/
# 所以我们需要给/data目录更改权限
[root@nfs01 ~]# chown -R oldboy.oldboy /data

#重新测试
# 有时候修改了配置之后,会出现卡顿的情况,我们可以先卸载设备,再重新挂载
[root@web01 ~]# touch /mnt/oldboy.txt 
[root@nfs01 ~]# ll /data/ 
total 0
-rw-r--r-- 1 oldboy oldboy 0 Feb 24 11:10 oldboy.txt

重新配置文件后,需要重启NFS服务:

  /etc/init.d/nfs  reload

  reload 属于平滑重启

  restart 属于立刻重启,太强硬

10. NFS共享文件系统权限参数设置梳理

  1NFS服务器/etc/exports设置需要开放可写入的权限,即服务器端的共享权限。

  2NFS服务器实际要共享的NFS目录权限具有可写入w的权限,即服务器端本地目录的安全权限。

  3)每台机器对应存在和NFS默认配置UID的相同UID 65534nfsnobody用户

     (确保所有客户端的访问权限统一,否则每个机器需要同时建立相同UID的用户,并覆盖NFS的默认用户配置)

11. NFS共享文件系统相关重要文件说明

/etc/exports            nfs服务主配置文件

/usr/sbin/showmount     查看nfs服务共享目录信息

/usr/sbin/rpcinfo       查看rpc服务中是否有房源注册信息

/var/lib/nfs/etab       用于查看nfs服务默认配置信息   

/proc/mounts            nfs客户端mount挂载参数(可以查看默认挂载参数信息)

08.同步服务知识梳理

01. 课程概念介绍

01. 为什么要用实时同步服务

我们使用同步软件备份的时候有一个问题

1、单点

2、时间周期的限制,最短的同步时间是1分钟

因为定时任务有缺陷,一分钟以内的数据无法进行同步,容易造成数据丢失

用户上传的数据信息需要实时备份保存

02. 实时同步工作原理

    a 创建要存储数据的目录

    b 利用实时同步的软件监控我们进行备份的数据目录

    c 利用rsync服务进行数据推送传输备份

02. 实时同步服务软件部署

实时同步软件介绍

inotify软件
Inotify是一种强大的,细粒度的。异步的文件系统事件监控机制,linux内核从2.6.13起,
加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种事件,
利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,
而inotify-tools正是实施这样监控的软件
软件参考链接:https://github.com/rvoicilas/inotify-tools/wiki

sersync软件
Sersync项目利用inotify与rsync技术实现对服务器数据实时同步的解决方案,
其中inotify用于监控sersync所在服务器上文件系统的事件变化,
rsync是目前广泛使用的本地及异地数据同步工具,
其优点是只对变化的目录数据操作,甚至是一个文件不同的部分进行同步,
所以其优势大大超过使用挂接文件系统或scp等方式进行镜像同步。
软件参考链接:https://github.com/wsgzao/sersync

inotify+rsync实现实时同步备份

第一个里程:将inotify软件安装成功

[root@nfs01 ~]# yum install -y inotify-tools

说明:操作系统的yum源文件中,是否存在epel

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

需要重点了解的命令:

[root@nfs01 ~]# rpm -ql inotify-tools 
/usr/bin/inotifywait                  <--- 实现对数据目录信息变化监控(重点了解的命令)
/usr/bin/inotifywatch                 <--- 监控数据信息变化,对变化的数据进行统计

为什么只能在linux内核版本为2.6.13以上使用本软件呢?

[root@nfs01 ~]# uname -a
Linux nfs01 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

因为一个目录

[root@nfs01 ~]# cd /proc/sys/fs/inotify/
[root@nfs01 inotify]# # 只有2.6.13开始才有这个目录,有了里面这三个文件,我们的软件才能使用
[root@nfs01 inotify]# ll
total 0
-rw-r--r-- 1 root root 0 Feb 24 15:19 max_queued_events
-rw-r--r-- 1 root root 0 Feb 24 15:19 max_user_instances
-rw-r--r-- 1 root root 0 Feb 24 15:19 max_user_watches

可以通过man proc 可以找到这个目录的帮助信息

man inotify 可以找到 这个目的帮助信息:

max_user_watches: 设置inotifywaitinotifywatch命令可以监视的文件数量(单进程),默认只能监控8192 (通过cat查看)个文件

max_user_instances: 设置每个用户可以运行的inotifywaitinotifywatch命令的进程数,默认每个用户可以开启inotify服务 128个进程

max_queued_events: 设置inotify实例事件(event)队列可容纳的事件数量,默认监控事件队列长度为16384

注意:man man 可以查看级别,如
/proc/sys/fs/epoll (since Linux 2.6.28)
              This directory contains the file max_user_watches, which can be used to limit  the  amount  of  kernel
              memory consumed by the epoll interface.  For further details, see inotify(7).
# 括号中的7就是级别数字
       The standard sections of the manual include:

       1      User Commands   

       2      System Calls

       3      C Library Functions

       4      Devices and Special Files

       5      File Formats and Conventions

       6      Games et. Al.

       7      Miscellanea

       8      System Administration tools and Daemons

       Distributions customize the manual section to their specifics, which often include additional sections.

所以我们可以使用 man 7 inotify 查看命令的帮助信息

 

第二个里程:将rsync守护进程模式部署完毕

rsync服务端部署

a 检查rsync软件是否已经安装

b 编写rsync软件主配置文件

c 创建备份目录管理用户

d 创建备份目录,并进行授权

e 创建认证文件,编写认证用户和密码信息,设置文件权限为600

f 启动rsync守护进程服务

 

rsync客户端部署

a 检查rsync软件是否已经安装

b 创建认证文件,编写认证用户密码信息即可,设置文件权限为600

c 利用客户端进行数据同步测试

 

第三个里程:要让inotify软件和rsync软件服务建立连接(shell脚本)

rsync软件应用命令:

[root@nfs01 ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

inotify软件应用命令:

inotifywait
-m|--monitor       # 始终保持事件监听状态
-r                 # 进行递归监控
-q|--quiet         # 将无用的输出信息,不进行显示
--timefmt <fmt>    # 设定日期的格式,  
man strftime 获取更多时间参数信息
--format <fmt> # 命令执行过程中,输出的信息格式 -e # 指定监控的事件信息 man inotifywait 查看所有参数说明和所有可以监控的事件信息

inotifywait 参数

监控的事件信息

总结主要用到的事件信息:

create创建、delete删除、moved_to移入、close_write修改

 

注意:inotifywait命令默认只监控一次,如下图,所以要使用 m 参数

注意:当我们在目录下新建了文件夹之后,文件夹下面的动作将不再监控了,所以要使用-r参数,进行递归监控

下面可以继续加入时间信息,监控事件....

相对完整的命令

inotifywait -mrq --timefmt "%F" --format "%T %w%f 事件信息:%e" /data  <-- 相对完整的命令应用

inotifywait -mrq --timefmt "%F" --format "%T %w%f 事件信息:%e" -e create /data   <-- 指定监控什么事件信息

inotifywait -mrq --timefmt "%F" --format "%T %w%f" -e create,delete,moved_to,close_write /data   <-- 常用

相对完整的命令图示

常用时间参数信息表介绍

监控多个命令

inotifywait -mrq --format "%w%f" -e create,delete,moved_to,close_write  /data   

以上为实现实时同步过程,所需要的重要监控命令

 

编写脚本:实现inotifyrsync软件结合

cd /server/scripts

vim inotify.sh

#!/bin/bash
####################    
inotifywait -mrq --format "%w%f" -e create,delete,moved_to,close_write  /data |\
while read line
do
rsync -az --delete /data/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
done

--delete是为了在做删除操作的时候,也可以同步。如果不加这个,在删除的时候,会有错误,并且在备份服务器中也不会被删除

shell循环语法总结:

for循环       for xx in 循环条件内容信息;do xxx;done

while循环      while 循环条件;do xx done    <-- 只要条件满足,就一直循环

                                while truedo xx done              <-- 死循环

 

运维工作中编写自动化脚本规范:

1. 先完成基本功能需求

2. 优化完善脚本内容

3. 写上一些注释说明信息

4. 进行反复测试,防止出现异常

 

第四个里程:最终的测试

sh -x inotify.sh

x  作用是显示命令都干了什么

使用 sh inotify.sh  & 将命令交给后台执行,

 

inotify的效率比较低

sersync+rsync实现实时同步备份

sersync软件
Sersync项目利用inotify与rsync技术实现对服务器数据实时同步的解决方案,
其中inotify用于监控sersync所在服务器上文件系统的事件变化,
rsync是目前广泛使用的本地及异地数据同步工具,
其优点是只对变化的目录数据操作,甚至是一个文件不同的部分进行同步,
所以其优势大大超过使用挂接文件系统或scp等方式进行镜像同步。
软件参考链接:https://github.com/wsgzao/sersync

第一个里程:下载安装sersync软件,在github中(上面的网址)下载

先进行软件下载,把软件包上传到系统中

unzip sersync_installdir_64bit.zip

cd到目录,然后直接把文件拖进去,如果失败了,可以使用rz -y重新上传

上传完毕后,解压。这是一个zip类型的文件,要使用unzip

[root@nfs01 tools]# unzip sersync_installdir_64bit.zip 
Archive:  sersync_installdir_64bit.zip
   creating: sersync_installdir_64bit/
   creating: sersync_installdir_64bit/sersync/
   creating: sersync_installdir_64bit/sersync/bin/
  inflating: sersync_installdir_64bit/sersync/bin/sersync  
   creating: sersync_installdir_64bit/sersync/conf/
  inflating: sersync_installdir_64bit/sersync/conf/confxml.xml  
   creating: sersync_installdir_64bit/sersync/logs/

解压后相当于win中的绿色软件,直接就用,不用再安装。而且这个是规范过的目录,不是官网下载的那个,以后再下载了绿色软件之后,最好也要规范一下。

cd sersync_installdir_64bit

mv sersync /usr/local/

tree

[root@web01 sersync_installdir_64bit]# tree 
.
└── sersync
    ├── bin
    │   └── sersync
    ├── conf
    │   └── confxml.xml
    └── logs
[root@nfs01 sersync_installdir_64bit]# mv sersync/  /usr/local/
[root@nfs01 sersync_installdir_64bit]# cd /usr/local/
[root@nfs01 local]# cd sersync/
[root@nfs01 sersync]# tree
.
├── bin
│   └── sersync
├── conf
│   └── confxml.xml
└── logs

3 directories, 2 files

第二个里程:编写sersync配置文件

[root@nfs01 sersync]# cd /usr/local/sersync/conf/
[root@nfs01 conf]# ll
total 4
-rw-r--r-- 1 root root 2214 Oct 26  2011 confxml.xml
[root@nfs01 conf]# cat confxml.xml 
  1 <?xml version="1.0" encoding="ISO-8859-1"?>
  2 <head version="2.5">
  3     <host hostip="localhost" port="8008"></host>
  4     <debug start="false"/>
  5     <fileSystem xfs="false"/>
  6     <filter start="false">
  7         <exclude expression="(.*)\.svn"></exclude>
  8         <exclude expression="(.*)\.gz"></exclude>
  9         <exclude expression="^info/*"></exclude>
 10         <exclude expression="^static/*"></exclude>
 11     </filter>
 12     <inotify>
 13         <delete start="true"/>
 14         <createFolder start="true"/>
 15         <createFile start="false"/>
 16         <closeWrite start="true"/>
 17         <moveFrom start="true"/>
 18         <moveTo start="true"/>
 19         <attrib start="false"/>
 20         <modify start="false"/>
 21     </inotify>
 22
 23     <sersync>
 24         <localpath watch="/opt/tongbu">
 25             <remote ip="127.0.0.1" name="tongbu1"/>
 26             <!--<remote ip="192.168.8.39" name="tongbu"/>-->
 27             <!--<remote ip="192.168.8.40" name="tongbu"/>-->
 28         </localpath>
 29         <rsync>
 30             <commonParams params="-artuz"/>
 31             <auth start="false" users="root" passwordfile="/etc/rsync.pas"/>
 32             <userDefinedPort start="false" port="874"/><!-- port=874 -->
 33             <timeout start="false" time="100"/><!-- timeout=100 -->
 34             <ssh start="false"/>
 35         </rsync>
 36         <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
 37         <crontab start="false" schedule="600"><!--600mins-->
 38             <crontabfilter start="false">
 39                 <exclude expression="*.php"></exclude>
 40                 <exclude expression="info/*"></exclude>
 41             </crontabfilter>
 42         </crontab>
 43         <plugin start="false" name="command"/>
 44     </sersync>
 45
 46     <plugin name="command">
 47         <param prefix="/bin/sh" suffix="" ignoreError="true"/>  <!--prefix /opt/tongbu/mmm.sh suffix-->
 48         <filter start="false">
 49             <include expression="(.*)\.php"/>
 50             <include expression="(.*)\.sh"/>
 51         </filter>
 52     </plugin>
 53
 54     <plugin name="socket">
 55         <localpath watch="/opt/tongbu">
 56             <deshost ip="192.168.138.20" port="8009"/>
 57         </localpath>
 58     </plugin>
 59     <plugin name="refreshCDN">
 60         <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
 61             <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
 62             <sendurl base="http://pic.xoyo.com/cms"/>
 63             <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
 64         </localpath>
 65     </plugin>
 66 </head>

[root@nfs01 conf]
#

下面只看比较重要的:

说明:实现同步数据过滤排除功能
6     <filter start="false">
7         <exclude expression="(.*)\.svn"></exclude>
8         <exclude expression="(.*)\.gz"></exclude>
9         <exclude expression="^info/*"></exclude>
10         <exclude expression="^static/*"></exclude>
11     </filter>

说明:类似于inotify的-e参数功能,指定监控的事件信息
12     <inotify>
13         <delete start="true"/>
14         <createFolder start="true"/>
15         <createFile start="false"/>
16         <closeWrite start="true"/>
17         <moveFrom start="true"/>
18         <moveTo start="true"/>
19         <attrib start="false"/>
20         <modify start="false"/>
21     </inotify>

下面是修改后的信息 : 24-35行

        <localpath watch="/data">
            <remote ip="172.16.1.41" name="backup"/>
            <!--<remote ip="192.168.8.39" name="tongbu"/>-->
            <!--<remote ip="192.168.8.40" name="tongbu"/>-->
        </localpath>
        <rsync>
            <commonParams params="-az"/>
            <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"
/>
            <userDefinedPort start="false" port="874"/><!-- port=874 -->
            <timeout start="false" time="100"/><!-- timeout=100 -->
            <ssh start="false"/>
        </rsync>

说明:以上内容是数据相关的配置信息,是必须进行修改调整配置

 

第三个里程(A):应用sersync软件,实现实时同步

[root@nfs01 sersync]# ll
total 12
drwxr-xr-x 2 root root 4096 Dec 23  2012 bin
drwxr-xr-x 2 root root 4096 Feb 24 19:20 conf
drwxr-xr-x 2 root root 4096 Dec 23  2012 logs
[root@nfs01 sersync]# cd bin/
[root@nfs01 bin]# ll
total 1768
-rw-r--r-- 1 root root 1810128 Oct 26  2011 sersyn
# 此时的文件不具有执行权限,
# 1、我们可以使用sh
# 2、我们可以加上执行权限
[root@nfs01 bin]# chmod +x sersync 
[root@nfs01 bin]# ll
total 1768
-rwxr-xr-x 1 root root 1810128 Oct 26  2011 sersync
[root@nfs01 bin]# ./sersync -h
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
_______________________________________________________
参数-d:启用守护进程模式
参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍(用于测试)
c参数-n: 指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用confxml.xml文件
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序
_______________________________________________________
[root@nfs01 bin]# 

 

第三个里程(B):测试之前看一下有没有其他同步软件在运行,如果有的话,就终止掉

[root@nfs01 bin]# ps -ef |grep inotify
[root@nfs01 bin]# killall sh
# 终止sh命令,还要终止所有相关的服务
# 或者使用 kill 进程号

第三个里程(C):我们最终的命令./sersync -dro /usr/local/sersync/conf/confxml.xml

[root@nfs01 bin]# ./sersync -dro /usr/local/sersync/conf/confxml.xml 
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
option: -d     run as a daemon
option: -r     rsync all the local files to the remote servers before the sersync work
option: -o     config xml name:  /usr/local/sersync/conf/confxml.xml
daemon thread num: 10
parse xml config file
host ip : localhost    host port: 8008
daemon start,sersync run behind the console 
use rsync password-file :
user is    rsync_backup
passwordfile is     /etc/rsync.password
config xml parse success
please set /etc/rsyncd.conf max connections=0 Manually
sersync working thread 12  = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads) 
Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads)
please according your cpu ,use -n param to adjust the cpu rate
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /data && rsync -az -R --delete ./ rsync_backup@172.168.8.39::backup --password-file=/etc/rsync.password >/dev/null 2>&1run the sersync: 
watch path is: /data

测试,如果发现有文件没有完全同步,重启一下网络

09.SSH远程管理服务

01. 远程管理服务知识介绍

1SSH远程登录服务介绍说明

        SSHSecure Shell Protocol(安全的shell协议)的简写,由 IETF 网络工作小组(Network Working Group)制定;

在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后在进行数据传输。

确保了传递的数据安全。

        SSH是专为远程登录会话和其他网络服务提供的安全性协议。

利用SSH协议可以有效的防止远程管理过程中的信息泄露问题,在当前的生产环境运维工作中,

绝大多数企业普遍采用SSH协议服务来代替传统的不安全的远程联机服务软件,如telnet(23端口,非加密的)等。

在默认状态下,SSH服务主要提供两个服务功能:

2SSH远程登录服务功能作用

一是提供类似telnet远程联机服务器的服务,即上面提到的SSH服务;

另一个是类似FTP服务的sftp-server,借助SSH协议来传输数据的,提供更安全的SFTP服务(vsftp,proftp)

3SSH远程登录服务排错思路

01. 检查链路是否通畅---ping(icmp)/tracert/traceroute

  ping不是万能的,只能作为一个参考。ping是基于ICMP协议的

02. 检查链路是否阻断---将防火墙功能关闭(防火墙在所有的都部署完成之后再配置,测试中不要配置)

03. 检查服务是否开启---ss/netstat -lntup(服务端检查)    /telnet/nmap/nc(客户端检查)

  nmap需要单独安装,系统默认是没有的

[D:\~]$ telnet 10.0.0.31 22


Connecting to 10.0.0.31:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
SSH-2.0-OpenSSH_5.3

02. Telnet远程登录服务功能作用

SSH远程登录服务特点说明

01、SSH服务端口号为22

02、SSH服务采用密文方式传输数据

03、SSH服务默认支持root用户进行远程登录

[root@backup ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1227/sshd  

Telnet远程登录服务功能作用

01、SSH服务端口号为23

02、SSH服务采用明文方式传输数据

03、SSH服务默认不支持root用户进行远程登录

Telnet需要单独安装,

[root@backup ~]# yum install -y telnet-server telnet
...
...
# xinetd相当于一个超级守护进程服务,用xinetd服务为那些小进程,小服务提供管理
# 首先小进程telnet要允许被管理,即disable=no,默认是yes
[root@backup ~]# vim /etc/xinetd.d/telnet 
  
# default: on
# description: The telnet server serves telnet sessions; it uses \
#       unencrypted username/password pairs for authentication.
service telnet
{
        flags           = REUSE
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/sbin/in.telnetd
        log_on_failure  += USERID
        disable         = no
}

# 重启一下,xinetd(因为之前没有启动过,所以用的start)
[root@backup ~]# /etc/init.d/xinetd start
Starting xinetd:                                           [  OK  ]

[root@backup ~]# netstat -lntup|grep 23
tcp        0      0 :::23                       :::*                        LISTEN      1340/xinetd 
# 已经有了
#现在可以测试了,使用telnet连接服务器(刚才是在backup主机上安装的)
[D:\~]$ telnet 10.0.0.41


Connecting to 10.0.0.41:23...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
CentOS release 6.9 (Final)
Kernel 2.6.32-696.el6.x86_64 on an x86_64
backup login: root
Password: 
Login incorrect

backup login: 
# 因为telnet默认不支持root
backup login: oldboy
Password: 
[oldboy@backup ~]$  # 连上了
# 对于没有安装 telnet的主机,就连不上了
[D:\~]$ telnet 10.0.0.31


Connecting to 10.0.0.31:23...
Could not connect to '10.0.0.31' (port 23): Connection failed.
# 使用ssh连接
[D:\~]$ ssh 10.0.0.41


Connecting to 10.0.0.41:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

WARNING! The remote SSH server rejected X11 forwarding request.
Last login: Mon Feb 25 09:18:02 2019 from 10.0.0.253
[root@backup ~]# 

为什么一个是明文,一个是密文

使用wireshark(抓包)软件工具

03. 远程管理服务概念详解

1SSH远程管理服务加密技术

01.采用公钥和私钥进行算法加密,口令登录

ssh连接登录过程

①. ssh客户端发出连接请求

>/root/.ssh/known_hosts 清空文件

②. ssh服务端会发出确认信息,询问客户端你是否真的要连接我
ssh 10.0.0.41 ③. ssh客户端输入完成yes,会等到一个公钥信息 cat
/root/.ssh/known_hosts ④. ssh服务端将公钥信息发送给ssh客户端 ⑤. ssh客户端利用密码进行登录
[root@web01 ~]# cat .ssh/known_hosts 
10.0.0.41 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA47PsJW7rLbHv7mREm2juOVznW7dJamrWQSSHyprcvfQvMQjg6f7P9XLEfLfqx67kQvpUdZ65S52DMpcDlEmiiX8hseiM/8zIMBw3XH/F3BHPxlP54067QaRFRFPsZ4nFH4LCF6u4uST1YBJfIvyKKpQb6s+ZplDIMwfZxeWTK9QSREKijQzf7CvLN+Ekt9rYWqKFHrhv//Ae5Lxro0jKasgF3tIsvnq75cqYN57or+mZux5vjnrs/PkRsLLNnAkIJfDMbUoG3WfAjJD18UPL3glmyzuMNfj5YHT4VjQKC9Eq+WmOsDKl/Q501xpCDXx/dunCXDy+MRXgs/hpRtInjw==
# 上面是客户端公钥

[root@web01 ~]# cd /etc/ssh/ [root@web01 ssh]# ll total 160 -rw-------. 1 root root 125811 Mar 22 2017 moduli -rw-r--r--. 1 root root 2047 Mar 22 2017 ssh_config -rw------- 1 root root 3876 Feb 22 19:36 sshd_config -rw------- 1 root root 3876 Feb 22 17:22 sshd_config.bak -rw-------. 1 root root 672 Jan 10 14:54 ssh_host_dsa_key -rw-r--r--. 1 root root 590 Jan 10 14:54 ssh_host_dsa_key.pub -rw-------. 1 root root 963 Jan 10 14:54 ssh_host_key -rw-r--r--. 1 root root 627 Jan 10 14:54 ssh_host_key.pub -rw-------. 1 root root 1675 Jan 10 14:54 ssh_host_rsa_key -rw-r--r--. 1 root root 382 Jan 10 14:54 ssh_host_rsa_key.pub # ssh

[root@backup ssh]# cat ssh_host_rsa_key.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA47PsJW7rLbHv7mREm2juOVznW7dJamrWQSSHyprcvfQvMQjg6f7P9XLEfLfqx67kQvpUdZ65S52DMpcDlEmiiX8hseiM/8zIMBw3XH/F3BHPxlP54067QaRFRFPsZ4nFH4LCF6u4uST1YBJfIvyKKpQb6s+ZplDIMwfZxeWTK9QSREKijQzf7CvLN+Ekt9rYWqKFHrhv//Ae5Lxro0jKasgF3tIsvnq75cqYN57or+mZux5vjnrs/PkRsLLNnAkIJfDMbUoG3WfAjJD18UPL3glmyzuMNfj5YHT4VjQKC9Eq+WmOsDKl/Q501xpCDXx/dunCXDy+MRXgs/hpRtInjw==

# 客户端有锁头(公钥),服务端有钥匙和锁头,每次客户端要连接的时候就带着锁头,如果在服务端能用钥匙打开这个锁,就连接成功

02.加密技术分为v1v2两个版本    

  sshv1版本不会经常更换锁头和钥匙,因此会有安全隐患

  sshv2版本会经常更换锁头和钥匙,因此提高了远程连接安全性

2SSH远程管理服务认证类型

   基于密钥方式实现远程登录

   ①. ssh管理服务器上创建密钥对信息(公钥 私钥)

   ②. ssh管理服务器上将公钥发送给被管理服务器

   ③. ssh管理服务器向被管理服务器发送连接请求

   ④. ssh被管理服务器向管理服务器发送公钥质询

   ⑤. ssh管理服务器处理公钥质询请求,将公钥质询结果发送给被管理主机

   ⑥. ssh被管理服务器接收公钥质询响应信息,从而确认认证成功

   ⑦. ssh管理服务端可以和被管理服务端建立基于密钥连接登录

04. 基于密钥登录方式部署流程

第一个里程:在管理主机上创建密钥对信息

[root@m01 ~]# ssh-keygen -t dsa           <-- 创建密钥对命令 -t dsa表示指定密钥对加密类型(加密类型还有rsa,算法不同)
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa):      <-- 确认私钥文件所保存的路径
/root/.ssh/id_dsa already exists.
Overwrite (y/n)? y                                            <-- 如果已经存在了密钥对信息,是否进行覆盖
Enter passphrase (empty for no passphrase):                   <-- 确认是否给私钥设置密码信息(一般为空)
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
fc:9b:1f:db:15:cf:9c:9c:1b:ba:4d:9d:a6:db:ed:5f root@m01
The key's randomart image is:
+--[ DSA 1024]----+
|                 |
|                 |
|                 |
|       .         |
|        S      . |
|         .    .oB|
|          . .  OE|
|           o +B.=|
|          o.o=+==|
+-----------------+
[root@m01 ~]# 
[root@m01 ~]# ll /root/.ssh/
total 8
-rw------- 1 root root 668 Feb 25 11:03 id_dsa
-rw-r--r-- 1 root root 598 Feb 25 11:03 id_dsa.pub

第二个里程:将管理主机上公钥信息发送给被管理主机

[root@m01 ~]# ssh-copy-id  -i  /root/.ssh/id_dsa.pub  172.16.1.31
root@172.16.1.31's password: 
Now try logging into the machine, with "ssh '172.16.1.31'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

[root@m01 ~]# ssh-copy-id  -i  /root/.ssh/id_dsa.pub  oldboy  172.16.1.31     <--或者可以加上管理用户
# 保存在了远程主机中用户的家目录下的.ssh目录下
[root@nfs01 ~]# cd /root/.ssh/
[root@nfs01 .ssh]# ll
total 4
-rw------- 1 root root 598 Feb 25 11:09 authorized_keys

第三个里程:进行远程管理测试(基于密钥的方式进行远程管理)

ssh 172.16.1.31             <-- 可以不用输入密码信息,就能登陆成功
ssh 172.16.1.31 uptime      <-- 可以不用登陆到远程主机,就可以直接查看远程主机信息

05. SSH服务端配置文件信息说明(/etc/ssh/sshd_config)

 

Port 52113                          <- 修改ssh服务端口号信息  (1-1024不要使用,这些是知名端口号,并且使用之前查看有没有冲突)
ListenAddress 0.0.0.0               <- 主要作用提升网络连接安全性  

PS:监听地址只能配置为服务器网卡上拥有的地址    
PermitRootLogin no                  <- 是否允许root用户远程登录
PermitEmptyPasswords no             <- 是否允许空密码

如果发现链接的速度慢,就可以看一下面这两个参数
UseDNS no                          <- 是否进行DNS反向解析(提升ssh远程连接效率)
GSSAPIAuthentication no            <- 是否进行远程GSSAPI认证(提升ssh远程连接效率)

 

# /etc/ssh/ssh_config 是客户端配置文件

监听地址的作用图示

修改之后/etc/init.d/sshd restart进行重启

 注意:为了防止更改完设置之后,需要重启,但是重启了之后我们的链接窗口就断开了,所以最好在连接之前多开2个窗口,一般也是能用的

SSH远程管理入侵防护案例说明

1、利用秘钥登录提高安全性

2、利用牤牛阵法提高安全性

  01.安全设备策略阻止访问,只开启少量服务端口

  02.开启SSH监听地址功能,只监听内网网卡地址

3、利用服务器不配置外网IP提高安全性

4、利用授权与系统安装最小化提高安全性

5、利用指纹信息对系统重要文件进行加密处理

  (用户管理配置文件,sudo授权配置文件,ssh服务配置文件,定时任务配置文件,启动程序的配置文件,防火墙的配置文件等...)

  做指纹监控,一旦发生变化就报警

6、利用系统重要文件加锁功能提高安全性

  将系统重要命令改成自定义的名字等

10. sftp常用操作命令总结

SSH远程连接功能

win:利用Xshell、SecureCRT、Putty软件连接

linux:ssh -p 22 oldboy@10.0.0.61

不登录服务器执行命令:ssh -p 22 oldboy@10.0.0.61 "free -m" 

SSH远程管理服务复制传输功能

远程复制scp:scp -P 22 -rp /tmp/oldboy oldboy@10.0.0.41:/tmp

属于远程全量复制

远程传输sftp:sftp -oPort=52113 oldboy@10.0.0.61

sftp常用命令

bye               Quit sftp                                             <-- 表示退出sftp传输模式

cd path         Change remote directory to 'path'     <-- 改变远程目录信息

pwd               Display remote working directory      <-- 显示远程主机当前目录信息

lcd path         Change local directory to 'path'        <-- 改变本地目录路径信息

lpwd              Print local working directory              <-- 输出本地目录路径信息

要点:要操作本地的信息,都是在前面加上l

get [-P] remote-path [local-path]                Download file                              <-- 下载文件命令

put [-P] local-path [remote-path]                 Upload file                                 <-- 上传文件命令

11、远程管理服务部署说明

一般系统给都部署好了,我们不需要再下载

服务端

软件包:openssh-server

有漏洞、有问题的话,跟新软件包就行

①. 服务启动脚本文件  /etc/rc.d/init.d/sshd
②. 服务程序配置文件  /etc/ssh/sshd_config
③. 服务守护进程命令  /usr/sbin/sshd

客户端

软件包:openssh-client

①. 安全拷贝命令  /usr/bin/scp   
②. 安全传输命令  /usr/bin/sftp   
③. 安全登录命令  /usr/bin/ssh
④. 创建私钥命令  /usr/bin/ssh-keygen
④. 传输公钥命令  /usr/bin/ssh-copy-id

12.ansible批量管理服务介绍

01. 批量管理服务知识介绍

a. ansible是一个基于Python开发的自动化运维工具

b. ansible是一个基于ssh协议实现远程管理的工具

c. ansible软件可以实现多种批量管理操作(批量系统配置、批量软件部署、批量文件拷贝、批量运行命令)

其他软件saltstack、puppet

02. 批量管理服务特征介绍

ansible软件服务端(管理端):不需要启动任何服务 默认服务端不需要任何的配置

ansible软件客户端(受控端):没有客户端软件安装

03. ansible软件安装部署

1、ansible软件自动化环境架构规划

管理主机1台:

  10.0.0.61   m01

受控主机3台:

  10.0.0.41   backup

  10.0.0.31   nfs01

  10.0.0.7    web01

  Linux系统 6.9

2、ansible软件自动化部署条件

建议基于ssh密钥方式建立远程连接

# 01.ssh密钥对创建(管理主机)

    ssh-keygen -t dsa

 影响免交互创建密钥对创建因素:

     1)需要指定私钥存放路径

       -f /root/.ssh/id_dsa

   2)需要进行私钥文件密码设定

       -N/-P  

       -N ""/-P ""

 

  免交互创建密钥对方法

    ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""

 

#02.分发公钥文件(管理主机进行分发)

    ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.31

 影响免交互批量分发密钥因素

  1)需要有确认连接过程,需要输入yes/no

     -o StrictHostKeyChecking=no

     sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.31"

 

  2)需要解决密码问题

    借鉴之前rsync的应用密码文件的经验,我们借用一个软件sshpass,需要安装

[root@m01 ~]# yum install -y sshpass
...     
...                                                             
Complete!
[root@m01 ~]# sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.31
Now try logging into the machine, with "ssh '172.16.1.31'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

免交互批量分发公钥脚本:(将脚本文件放到管理服务器的/server/scripts中)

vim fenfa.sh

#!/bin/bash

rm -f /root/.ssh/id_dsa* 
ssh-keygen -t dsa -f /root/.ssh/id_dsa -N "" 


for ip in 31 41 7
do
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.$ip"
done

改了端口:

sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.$ip -p53221"

rm  -f  /root/.ssh/id_dsa*     先删掉之前的秘钥,防止出现覆盖提示交互

ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""  免交互创建新的秘钥

 

#03.检查是否可以进行基于密钥远程管理

ssh 172.16.1.31 uptime

 

免交互批量检查测试脚本:

vim fenfa_check.sh

#!/bin/bash

if  [ $# -ne 1 ]
then echo "please input one agrs"
exit 1
fi

 
for ip in 31 41 7
do
echo ==== info 172.16.1.$ip =====
ssh 172.16.1.$ip $1
echo " "
done

具体使用测试脚本:

[root@m01 /server/scripts]# sh fenfa_check.sh
please input one agrs
[root@m01 /server/scripts]# 
[root@m01 /server/scripts]# 
[root@m01 /server/scripts]# 
[root@m01 /server/scripts]# sh fenfa_check.sh hostname
==== info 172.16.1.31 =====
nfs01
 
==== info 172.16.1.41 =====
backup
 
==== info 172.16.1.7 =====
web01
 
[root@m01 /server/scripts]# 

 #04.有一个问题:有时候我们的被管理主机的端口号不一致

[root@nfs01 .ssh]# netstat -lntup |grep sshd
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1553/sshd           
tcp        0      0 :::22                       :::*                        LISTEN      1553/sshd  
[root@nfs01 ~]# vim /etc/ssh/sshd_config
#我们将端口号修改成53221

[root@nfs01 ~]# /etc/init.d/sshd restart
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]
[root@nfs01 ~]# netstat -lntup |grep sshd
tcp        0      0 0.0.0.0:53221               0.0.0.0:*                   LISTEN      1855/sshd           
tcp        0      0 :::53221                    :::*                        LISTEN      1855/sshd 
#然后,我们发现已经无法执行命令
[root@m01 scripts]# sh fenfa_check.sh hostname
==== info 172.16.1.31 ====
ssh: connect to host 172.16.1.31 port 22: Connection refused
 
==== info 172.16.1.41 ====
backup
 
==== info 172.16.1.7 ====
web01
 
[root@m01 scripts]# 

# ssh-copy-id命令分发公钥原理

[root@m01 scripts]# which ssh-copy-id
/usr/bin/ssh-copy-id

[root@m01 scripts]# vim /usr/bin/ssh-copy-id 


...
{ eval "$GET_ID" ; } | ssh $1 "exec sh -c 'cd; umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/auth
orized_keys && (test -x /sbin/restorecon && /sbin/restorecon .ssh .ssh/authorized_keys >/dev/null 2>&1 
|| true)'" || exit 1

但是我们希望最好还是不要修改文件,我们看见命令中有一个$1

[root@m01 scripts]# ssh-copy-id -i /root/.ssh/id_dsa.pub "172.16.1.31 -p53221"

这跟我们之前学习的shell知识不一样啊,172.16.1.31 应该是$3的位置

这是因为shift参数,相当于给参数做排队,比如

  1 2 3 4 5     

  2 3 4 5   第一个走了

  3 4 5    2走了

这就是一个队列。shift就是让参数一个一个排列下去,做一个脚本试验一下

[root@m01 scripts]# vim shift_test.sh
  
#!/bin/bash
#until 循环,直到的意思
until [ $# -eq 0  ] 
do
  echo $*
  shift
done
~                                                                                                      
~                                                                                                      
~                                                                                                      
                                                                                                      
"shift_test.sh" [New] 7L, 91C written                                                
# 执行过程 
[root@m01 scripts]# sh shift_test.sh 1 2 3 4 5 
1 2 3 4 5
2 3 4 5
3 4 5
4 5
5
[root@m01 scripts]# shift 命令主要在脚本中应用时,会将传参的参数依次向前推进

基于ssh口令方式建立远程连接(172.16.1.31这台基于口令方式)

vim /etc/ansible/hosts

[oldboy]
172.16.1.7
172.16.1.31 ansible_user=root ansible_password=123456
172.16.1.41

 不想在vim /etc/ansible/hosts文件中显示密码:

vim /etc/ansible/hosts

[oldboy]
172.16.1.7
72.16.1.31 ansible_user=root
172.16.1.41

可以使用-k 参数 实现口令交互式远程管理

[root@m01 /etc/ansible]# ansible 172.16.1.31 -m command -a "hostname" -k
SSH password:
172.16.1.31 | SUCCESS | rc=0 >>
nfs01

[root@m01 /etc/ansible]# 

3、ansible软件下载安装

  ansible管理主机软件安装:

  yum install -y ansible

  ansible受控主机软件安装:(可选)

  yum install -y libselinux-python   为了解决管理和客户段之间开启了selinux服务的情况 

4、ansible软件受控主机添加配置

-rw-r--r-- 1 root root 19557 Nov 25 02:13 ansible.cfg  默认的配置文件

vim /etc/ansible/hosts

[oldboy]
172.16.1.7
172.16.1.31
172.16.1.41

04. ansible软件应用过程   

第一个批量管理命令

[root@m01 ansible]# ansible oldboy -m command -a "hostname"
172.16.1.7 | SUCCESS | rc=0 >>
web01

172.16.1.41 | SUCCESS | rc=0 >>
backup

172.16.1.31 | SUCCESS | rc=0 >>
nfs01

加入主机没有生成公钥

[root@nfs01 ~]# rm /root/.ssh/authorized_keys -f
[root@nfs01 ~]# 

[root@m01 ansible]# ssh 172.16.1.31
root@172.16.1.31's password: 
# 做ssh需要密码
[root@m01 ansible]# ansible oldboy -m command -a "hostname"
172.16.1.31 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,password).\r\n", 
    "unreachable": true
}
172.16.1.7 | SUCCESS | rc=0 >>
web01

172.16.1.41 | SUCCESS | rc=0 >>
backup

# 无法管理,
如果我们就要使用口令来管理呢? 那就使用上面说过的配置

ansible的灵活度很高,内容很多,我们主要先学习模块和剧本两个内容

我们如何通过官方文档快速学习自己需要的模块?点击进入官网首页

命令格式:

ansible 管理主机信息或者主机组信息  -m 模块名称 -a 相关模块参数

 

主机信息:远程主机IP地址  远程主机组名称  远程所有主机all

-m 指定相应模块

-a 利用模块中某些参数功能

ansible软件模块

找到Module Index 查看文档

ansible-doc -l|wc -l

1378 个 命令

命令类型模块:

第一个模块:command

官方参考链接:http://docs.ansible.com/ansible/latest/modules/command_module.html

参数:chdir---在执行莫个命令前,先切换目录

[root@m01 /etc/ansible]# ansible 172.16.1.31 -m shell -a "hostname;date"
172.16.1.31 | SUCCESS | rc=0 >>
nfs01
Sat Feb 29 18:07:02 CST 2020

[root@m01 /etc/ansible]# ansible 172.16.1.31 -m command -a "chdir=/tmp/ pwd"
172.16.1.31 | SUCCESS | rc=0 >>
/tmp

[root@m01 /etc/ansible]# ansible 172.16.1.31 -m command -a "chdir=/etc/ pwd"
172.16.1.31 | SUCCESS | rc=0 >>
/etc

[root@m01 /etc/ansible]# 

参数:creates---判断一个文件是否存在,如果已经存在了,后面的命令就不会执行

[root@m01 /etc/ansible]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.conf hostname"
172.16.1.41 | SUCCESS | rc=0 >>
skipped, since /etc/rsyncd.conf exists

[root@m01 /etc/ansible]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.conf.bak hostname"
172.16.1.41 | SUCCESS | rc=0 >>
backup

[root@m01 /etc/ansible]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.123456 hostname"
172.16.1.41 | SUCCESS | rc=0 >>
backup

[root@m01 /etc/ansible]# 

参数:removes---判断一个文件是否存在,如果不存在,后面的命令就不会执行

[root@m01 /etc/ansible]# ansible 172.16.1.41 -m command -a "removes=/etc/rsyncd.conf hostname"
172.16.1.41 | SUCCESS | rc=0 >>
backup

[root@m01 /etc/ansible]# ansible 172.16.1.41 -m command -a "removes=/etc/rsyncd.1212213123 hostname"
172.16.1.41 | SUCCESS | rc=0 >>
skipped, since /etc/rsyncd.1212213123 does not exist

[root@m01 /etc/ansible]# 

参数(必须要有的):free_form---表示执行command模块时,必须要有linux合法命令信息

[root@m01 /etc/ansible]# ansible 172.16.1.41 -m command -a "ls"
172.16.1.41 | SUCCESS | rc=0 >>
anaconda-ks.cfg
install.log
install.log.syslog

[root@m01 /etc/ansible]# 

第二个模块:shell模块(万能模块)

参数:chdir---在执行莫个命令前,先切换目录

参数:creates---判断一个文件是否存在,如果已经存在了,后面的命令就不会执行

参数:removes---判断一个文件是否存在,如果不存在,后面的命令就不会执行

参数(必须要有的):free_form---表示执行command模块时,必须要有linux合法命令信息

[root@m01 /etc/ansible]# ansible 172.16.1.41 -m shell -a "ls;pwd"
172.16.1.41 | SUCCESS | rc=0 >>
anaconda-ks.cfg
install.log
install.log.syslog
/root

[root@m01 /etc/ansible]# 

说明:shell模块可以满足command模块所有功能,并且可以支持识别特殊字符信息 < > | ;   

第三个模块:script---专门运行脚本模块

参数:chdir---在执行莫个命令前,先切换目录

参数:creates---判断一个文件是否存在,如果已经存在了,后面的命令就不会执行

参数:removes---判断一个文件是否存在,如果不存在,后面的命令就不会执行

参数(必须要有的):free_form---表示执行command模块时,必须要有linux合法命令信息

vim /server/scripts/yum.sh(管理端)

#!/bin/bash

yum install -y htop

(受控端)172.16.1.41 没有/server/scripts/yum.sh时:

[root@m01 /server/scripts]# ansible 172.16.1.41 -m shell -a "/server/scripts/yum.sh"
172.16.1.41 | FAILED | rc=127 >>
/bin/sh: /server/scripts/yum.sh: No such file or directorynon-zero return code

[root@m01 /server/scripts]# ansible 172.16.1.41 -m script -a "/server/scripts/yum.sh"
172.16.1.41 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 172.16.1.41 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to 172.16.1.41 closed."
    ], 
    "stdout": "Loaded plugins: fastestmirror, security\r\nSetting up Install Process\r\nLoading mirror speeds from cached hostfile\r\n * base: mirrors.aliyun.com\r\n * extras: mirrors.aliyun.com\r\n * updates: mirrors.aliyun.com\r\nPackage htop-1.0.3-1.el6.x86_64 already installed and latest version\r\nNothing to do\r\n", 
    "stdout_lines": [
        "Loaded plugins: fastestmirror, security", 
        "Setting up Install Process", 
        "Loading mirror speeds from cached hostfile", 
        " * base: mirrors.aliyun.com", 
        " * extras: mirrors.aliyun.com", 
        " * updates: mirrors.aliyun.com", 
        "Package htop-1.0.3-1.el6.x86_64 already installed and latest version", 
        "Nothing to do"
    ]
}
[root@m01 /server/scripts]# 

文件类型模块:

第一个模块:copy----复制模块

参数:src---定义要推送数据信息

参数:dest---定义将数据推送到远程主机什么目录中

[root@m01 ~]# touch /tmp/file01.txt
[root@m01 ~]# ansible 172.16.1.41 -m copy -a "src=/tmp/file01.txt dest=/tmp/"
172.16.1.41 | SUCCESS => {
    "changed": true, 
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
    "dest": "/tmp/file01.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e", 
    "mode": "0644", 
    "owner": "root", 
    "size": 0, 
    "src": "/root/.ansible/tmp/ansible-tmp-1582973157.62-80068872493298/source", 
    "state": "file", 
    "uid": 0
}
[root@m01 ~]# ansible 172.16.1.41 -m shell -a "ls -l /tmp/"
172.16.1.41 | SUCCESS | rc=0 >>
total 12
drwx------ 2 root root 4096 Feb 29 18:46 ansible_VojfpD
-rw-r--r-- 1 root root   11 Feb 16 09:06 date.log
-rw-r--r-- 1 root root    0 Feb 29 18:45 file01.txt
-rw-r--r-- 1 root root   31 Feb 25 01:43 network
-rw-r--r-- 1 root root    0 Feb 29 02:04 oldgirl.txt

[root@m01 ~]# 

参数:backup---对数据信息进行备份,防止原来一样的文件被覆盖

[root@m01 ~]# cat /tmp/file01.txt
[root@m01 ~]# echo 123456 >/tmp/file01.txt
[root@m01 ~]# cat /tmp/file01.txt
123456
[root@m01 ~]# ansible 172.16.1.41 -m copy -a "src=/tmp/file01.txt dest=/tmp/"
172.16.1.41 | SUCCESS => {
    "changed": true, 
    "checksum": "c4f9375f9834b4e7f0a528cc65c055702bf5f24a", 
    "dest": "/tmp/file01.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "f447b20a7fcbf53a5d5be013ea0b15af", 
    "mode": "0644", 
    "owner": "root", 
    "size": 7, 
    "src": "/root/.ansible/tmp/ansible-tmp-1582973415.34-116046685845019/source", 
    "state": "file", 
    "uid": 0
}
[root@m01 ~]# ansible 172.16.1.41 -m shell -a "cat /tmp/file01.txt"
172.16.1.41 | SUCCESS | rc=0 >>
123456

[root@m01 ~]# echo 54321 >/tmp/file01.txt
[root@m01 ~]# ansible 172.16.1.41 -m copy -a "src=/tmp/file01.txt dest=/tmp/ backup=yes"
172.16.1.41 | SUCCESS => {
    "backup_file": "/tmp/file01.txt.2538.2020-02-29@18:52:05~", 
    "changed": true, 
    "checksum": "029b054db136cc36d5605e3818305825ff4b8ffb", 
    "dest": "/tmp/file01.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "434660b5ad7deeba8815349f71409405", 
    "mode": "0644", 
    "owner": "root", 
    "size": 6, 
    "src": "/root/.ansible/tmp/ansible-tmp-1582973524.64-199300845245093/source", 
    "state": "file", 
    "uid": 0
}
[root@m01 ~]#



查看:
[root@backup ~]# ll /tmp/file01.txt*
-rw-r--r-- 1 root root 6 Feb 29 18:52 /tmp/file01.txt
-rw-r--r-- 1 root root 7 Feb 29 18:50 /tmp/file01.txt.2538.2020-02-29@18:52:05~
[root@backup ~]# cat /tmp/file01.txt
54321
[root@backup ~]# cat /tmp/file01.txt.2538.2020-02-29\@18\:52\:05~ 
123456
[root@backup ~]# 

参数:owner---设置复制后的文件属主权限

参数:group---设置复制后的文件属组权限

参数:mode---设置复制后的文件权限(600 755

第二个模块:file----文件属性修改/目录创建/文件创建

参数:owner---设置复制后的文件属主权限

参数:group---设置复制后的文件属组权限

参数:mode---设置复制后的文件权限(600 755

[root@m01 ~]# ansible 172.16.1.41 -m file -a "dest=/tmp/file01.txt owner=oldboy group=oldboy mode=600"
172.16.1.41 | SUCCESS => {
    "changed": true, 
    "gid": 500, 
    "group": "oldboy", 
    "mode": "0600", 
    "owner": "oldboy", 
    "path": "/tmp/file01.txt", 
    "size": 6, 
    "state": "file", 
    "uid": 500
}
[root@m01 ~]# 

参数:state---用于指定创建目录或文件

创建文件:

[root@backup /tmp]# rm ./* -rf
[root@backup /tmp]# ll
total 0
[root@backup /tmp]# 
[root@m01 ~]# ansible 172.16.1.41 -m file -a "dest=/tmp/file01.txt state=touch"
172.16.1.41 | SUCCESS => {
    "changed": true, 
    "dest": "/tmp/file01.txt", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "size": 0, 
    "state": "file", 
    "uid": 0
}
[root@m01 ~]# 


[root@backup /tmp]# ll
total 0
-rw-r--r-- 1 root root 0 Feb 29 19:12 file01.txt
[root@backup /tmp]# 

创建目录:

[root@m01 ~]# ansible 172.16.1.41 -m file -a "dest=/tmp/dir01 state=directory"
172.16.1.41 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/tmp/dir01", 
    "size": 4096, 
    "state": "directory", 
    "uid": 0
}
[root@m01 ~]# 



[root@backup /tmp]# ll
total 4
drwxr-xr-x 2 root root 4096 Feb 29 19:13 dir01
-rw-r--r-- 1 root root    0 Feb 29 19:12 file01.txt
[root@backup /tmp]# 

包管理模块类型

模块:yum---安装软件包模块

是并行的

name:执行要安装软件的名称,以及软件的版本

stateinstalled安装(present,latest)  absent卸载(removed)

ansible 172.16.1.41 -m yum -a "name=iftop state=installed"

ansible 172.16.1.41 -m yum -a "name=iftop state=absent"

 

list:指定软件名称,查看软件是否可以安装,以及是否已经安装过了

ansible 172.16.1.41 -m yum -a "list=iftop"

系统模块类型

模块:service---管理服务状态模块

name: 指定要管理的服务名称(管理的服务一定在chkconfig中可以看到)

statestopped started restarted reloaded

enabledyes表示服务开机自启动 no表示服务开机不要自动启动

ansible 172.16.1.41 -m service -a "name=crond state=started enabled=yes"

cron---定时任务模块

* * * * *  /bin/sh /server/scripts/test.sh &>/dev/null


minute=0-59 * */n , -   
hour  
day  
month
weekday  
job='/bin/sh /server/scripts/test.sh &>/dev/null'

 
添加定时任务
ansible 172.16.1.41 -m cron -a "minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'"

给定时任务添加一个name,保证在添加的时候,定时任务不会重复
ansible 172.16.1.41 -m cron -a "name=oldboy02 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'"

删除定时任务state=absent
ansible 172.16.1.41 -m cron -a "name=oldboy02 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null' state=absent"
ansible 172.16.1.41 -m cron -a "name=oldboy01 state=absent"    写的简单一点

注释定时任务disabled=yes
ansible 172.16.1.41 -m cron -a "name=oldboy01 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null' disabled=yes"
ansible 172.16.1.41 -m cron -a "name=oldboy01 job='/bin/sh /server/scripts/test.sh &>/dev/null' disabled=no"

总结ansible颜色信息:

绿色:查看远程主机信息,不会对远程主机系统做任何修改

红色:执行操作出现异常错误

黄色:对远程主机系统进行修改操作

粉色:警告或者忠告信息

ansible软件剧本

编写剧本规范:

http://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html

遵循pyyaml

①.  - 用法说明,表示列表显示的内容
水果信息:
  - 苹果
  - 香蕉
  - 西瓜

②.  : 用法说明:前者的值
姓名: 张三
性别: 男
人员信息:
  - 运维人员: sa
  - 开发人员: dev
  - 存储人员: dba

③.  空格 用法说明:
对内容进行分级时,需要有两个空格表示分级

软件安装步骤:
  - 服务端安装步骤:
    第一个里程碑: 检查软件是否安装
    第二个里程碑: 编写配置文件内容
  - 客户端安装步骤:

补充:必须使用空格分隔ansible剧本级别,一定不要使用tab键进行分割

ansible剧本项目编写-rsync服务

执行脚本方法:

脚本放在规范的目录中

ansible-playbook /etc/ansible/ansible-playbook/test.yaml

- C : 执行前模拟一下,检查问题

ansible-playbook -C /etc/ansible/ansible-playbook/test.yaml

下面是一键化部署rsync

# command play-book

- hosts: 172.16.1.41
  tasks:
    - name: step01:install rsync
      yum: name=rsync state=installed
    - name: step02:edit rsync conf file
      copy: src=/etc/ansible/conf/rsync_conf/rsyncd.conf dest=/etc/
    - name: step03:create rsync user
      user: name=rsync state=present createhome=no shell=/sbin/nologin
    - name: step04:create auth file
      copy: src=/etc/ansible/conf/rsync_conf/rsync.password dest=/etc/ mode=600
    - name: step05:create backup dir
      file: dest=/backup state=directory owner=rsync group=rsync
    - name: step06:boot rsync server
      shell: rsync --daemon creates=/var/run/rsyncd.pid

- hosts: 172.16.1.31
  tasks:
    - name: step01:create auth file
      copy: src=/etc/ansible/conf/rsync_conf/rsync_client.password dest=/etc/rsync.password mode=6
posted @ 2020-02-08 03:04  silencio。  阅读(549)  评论(0编辑  收藏  举报