1、ssh服务中如何管理100多台机器?
需求分析:
使用python/shell获取对方服务器上的cpu使用率,内存使用情况,磁盘分区的使用情况,网络带宽的使用情况。
假如有一台控制服务器和100台服务器,控制服务器上需要管理这100中的web、db、file等,然后需要在这100台服务器上进行安装软件、备份文件、升级软件等操作,如何能有效的进行管理呢:
1、首先先建立免密通道
使用脚本(monitor脚本)去实现与其他机器之间建立通信。
2、编写脚本。psutil(脚本信息在下面)
top,free,df,dstat,iftop等
python/go编写monitor.py monitor.go:
① 连接到对方的服务器上
paramiko模块,ssh模块--->密码认证或者密钥认证
实现ssh远程连接的功能。
3、然后将脚本(psutil)上传到这100台服务器上。
脚本中实现获取系统信息,需要使用scp上传到100台机器上
通过scp:远程拷贝 底层通过ssh协议远程连接到其他机器上,复制文件。
scp -r root@主机名
查看系统资源、内存、网络状态:top,free,df,dstat,iftop等
② psutil 或者 gopsutil (需要go语言编写,但是还没实现)获取需要监控的cpu,内存,磁盘,网络带宽等信息
yum install gcc gcc-devel python3-devel -y pip3 install psutil
4、在本机执行远程调用执行脚本(psutil.py)命令,通过ssh服务指令。
ssh root@192.168.1.1 bash /tmp/psutil.py
/tmp/psutil.py:这个是被管理的机器存放监控系统资源的脚本
使用Python脚本:获取需要监控的cpu,内存,磁盘,网络带宽等信息。
两个脚本:
monitor脚本:是进行与其他机器之间进行通信的脚本文件,需要在本地执行。
psutil.py(监控系统资源的脚本,需要上传到需要被管理的机器上)
psutil是python中的一个第三方模块,需要下载。它能够轻松的实现获取系统运行的进程和系统利用率(CPU、内存、磁盘、网络等)信息,主要应用于系统监控。实现了同等命令命令行实现的功能:ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。能够跨平台运行。
psutil的主要功能包括:CPU、磁盘、内存、网络、进程等。
[root@syq ~]# cat psutil.py #!/usr/bin/python3 import psutil import datetime def linux_monitor(): # cpu的使用率 cup_per = psutil.cpu_percent() # 内存使用率 mem_per = psutil.virtual_memory().percent # 磁盘使用率 disk_per = psutil.disk_usage('/').percent # 网络使用情况 收发多少数据 net.bytes_recv、net.bytes_sent net = psutil.net_io_counters() # 获取当前系统时间 current_time = datetime.datetime.now().strftime("%F %T") # 拼接显示 str = "" str+= "|---------time--------|---cpu---|----memory----|----disk----|--------------net-------------|\n" str+= "| %s | %s%% | %s%% | %s%% | recv:%.2fMB sent:%.2fMB |\n" \ % (current_time, cup_per, mem_per, disk_per, net.bytes_recv/1024/1024, net.bytes_sent/1024/1024) print(str) linux_monitor()
编写脚本:monitor.py(建立连接的脚本-Paramiko模块)。在本机执行脚本,使用到的是paramiko,Paramiko是用python语言写的一个模块,远程连接到Linux服务器,查看上面的日志状态,批量配置远程服务器,文件上传,文件下载等。
[root@syq ~]# cat monitor.py #!/usr/bin/python3 import paramiko # 指定本地的RSA私钥文件 key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa') # 建立连接 trans = paramiko.Transport((' 192.168.2.127', 22)) trans.connect(username='root', pkey=key) # 创建ssh对象,将_transport指定为上面的trans ssh = paramiko.SSHClient() ssh._transport = trans # 创建sftp对象,指定连接的通道 sftp = paramiko.SFTPClient.from_transport(trans) # 上传 psut.py文件 sftp.put(localpath='/root/psut.py', remotepath='/root/p.py') # 添加可执行权限,运行脚本 ssh.exec_command('chmod +x p.py') stdin, stdout, stderr = ssh.exec_command('./p.py') print(stdout.read().decode())
2、跳板机:安全加固
1、不能密码登录
2、不能使用root登录
3、修改默认端口
4、添加防火墙配置 iptables设置
5、使用跳板机登录
1、加入跳板机(堡垒机)的工作流程:
客服端(client)要通过跳板机(A)、堡垒机去连接B C D。
客户端将私钥交给xshell管理,跳到A到时直接调动xshell,A然后登录到B上面时直接输入客户端的公钥,A上面就不需要生成公私钥。跳转到其他机子上面都只需要管理客户端的公私钥。
登录上还是在windows上面,只是发送数据包,返回数据包结果,结果以界面的形式展示出来()比如在xshell界面里面输入ls命令。
jumpserver:开源的跳板机软件,基于Python的django。也可以自己制作。
2、#######################ssh tcp wrappers#########
SSH使用TCP Wrappers实现访问控制;类似于防火墙访问。
主要配置文件
/etc/hosts.allow 白名单
/etc/hosts.deny 黑名单
3、TCP Wrappers可以控制哪些服务
① 受super daemon(xinetd)管理的服务
② 支持libwrap.so模块的服务
③ TCP Wrappers的访问控制原则
首先检查 hosts.allow 文件,若找到相匹配的策略,则允许访问
否则继续检查 hosts.deny (sshd:all)文件,若找到相匹配的策略,则拒绝访问
如果两个文件中都没有相匹配的策略,则允许访问。
3、#######临时修改主机名
[sanchuang@a ~]$ sudo hostname wy
4、########修改客户端配置##############
配置文件: ~/.ssh/config
在A机器上vim config
ssh B 测试是否连接成功
(修改A机器的)
##############################
ForwardAgent yes StrictHostKeyChecking no ServerAliveInterval 60 IdentityFile ~/.ssh/id_rsa ############################# Host B(跳板机) HostName 192.168.119.141(表示连接B机器网址) User sanchuang Port 22
(如果B机器的用户没有公私钥,可以用root用户尝试),或者在B机器的sanchuang用户下面加入A机子的公钥(cat id_rsa.pub )在A机子的authorized_keys文件里面。
[sanchuang@localhost .ssh]$ vim authorized_keys Host 10.* User sanchuang Port 22 ProxyCommand ssh 192.168.0.39 -W %h:%p -l sanchuang -p 22 [sanchuang@localhost .ssh]$ chmod 600 authorized_keys chmod 755 .ssh
scp aa B:/tmp
1、scp 命令:传输文件
#传输文件
[sanchuang@a ~]$ scp ahost B:/tmp
B后面要加:以及路径。
ahost 100% 0 0.0KB/s 00:00 [sanchuang@a ~]$ scp B:/tmp/bhost ./ bhost scp B:/tmp/aa ./两台机器之前拷贝
[root@scmysql ~]# scp -P 22 onekey_install_mysql_binary_v3.sh root@192.168.77.132:/opt scp B:/tmp/aa ./两台机器之前拷贝
2、sftp 命令:用于在连接的机器上传下载文件
sftp 用户名@主机名
[sanchuang@a ~]$ sftp B Connected to B. sftp> ls 2q aa adir bb bdir testdir testdir2 testhost sftp> get bdir Fetching /home/sanchuang/bdir/ to bdir Cannot download non-regular file: /home/sanchuang/bdir/ sftp> mget bdir Fetching /home/sanchuang/bdir/ to bdir Cannot download non-regular file: /home/sanchuang/bdir/ sftp> get 2q Fetching /home/sanchuang/2q to 2q /home/sanchuang/2q 100% 226 107.5KB/s 00:00 sftp> quit() Invalid command. sftp> exit() Invalid command. sftp> exit
3、pssh pscp命令:批量处理命令
####批量处理
pssh
-h 指定主机文件列表,内容格式"[user@]host[:port]"
-i 指定每个服务器的处理信息
[sanchuang@a ~]$ pssh -h ip.txt -i "/usr/sbin/ip a"
#批量传输文件
pscp.pssh
#把当前目录下的pscptest文件传送到目标主机的/tmp目录下
[sanchuang@a ~]$ pscp.pssh -h ip.txt pscptest /tmp [1] 17:37:21 [SUCCESS] sanchuang@192.168.0.48:2233 [2] 17:37:22 [SUCCESS] sanchuang@192.168.0.39:2233
4、批量ping 使用fping命令
#根据文件指定ip去ping
[sanchuang@a ~]$ fping -f ip-2.txt 192.168.0.39 is alive 192.168.0.48 is alive [sanchuang@a ~]$ cat ip-2.txt 192.168.0.39 192.168.0.48
#根据网段去ping。
[sanchuang@a ~]$ fping -g 192.168.0.0/24