最近痛感在集群里逐台部署ganglia, cacti这些监控的东西很麻烦,就写了个小程序去批量自动部署。原理是通过Python的pexpect用ssh去复制文件和执行系统命令,我用它来部署ganglia等,但是其他的东西也可以通过这个脚本来批量部署,只要自己编写部署脚本就可以了。主要是提出一个解决思路,看对大家是否有所帮助。

先约定一个概念,我们把放置python和脚本的服务器叫做主控节点或者server,把需要安装的节点叫做受控节点或者client。以下均以server和client代称。

首先是配置文件,我需要先定义一个配置文件,来约定server的一些路径,和client具体信息。

#-*-coding:UTF-8 -*-

log_dir = './logs/'#定义日志路径,不过我还没写,打算用log4py来做

client_tmp_dir = '/tmp/'#定义client端存放脚本路径

ssh_port = '22'#SSH端口

script_dir = './shells/'#server端脚本存放路径

node_list = [

{'ip':'192.168.1.1', 'user':'root', 'passwd':'123456', 'cmd':'sh /tmp/dpkg_client_Ubuntu_x.x86_64.sh'},

#cmd为在client端执行的命令,别的不解释

{'ip':'192.168.1.2', 'user':'root', 'passwd':'123456', 'cmd':'sh /tmp/dpkg_client_ubuntu_x.x86_64.sh'},

]

接下来是主程序

#!/usr/bin/env python

#-*-coding:UTF-8 -*-

import os

import sys

import platform

#用import方式引入conf.py

import conf

import subprocess

'''

判断server(本机)操作系统类型和版本的类

'''

class System:

def GetBranch(self):

Branch = platform.dist()[0]

return Branch

def GetRelease(self):

Release = platform.dist()[1]

return Release

def GetInstaller(self):

if self.GetBranch() in ['Ubuntu', 'debian']:

installer = 'apt-get'

elif self.GetBranch() in ['RedHat', 'Fedora', 'CentOS']:

installer = 'yum'

elif self.GetBranch() in ['SUSE']:

installer = 'zypper'

else:

installer = 'unknown'

return installer

'''

以操作系统版本为依据获取相应的pexpect包并尝试引入,因pexpect非默认操作系统安装,这部分支持RH,Ubuntu,Debian,SuSE

'''

try:

import pexpect

except ImportError:

installer = System()

inst = install.GetInstaller()

if (inst == 'apt-get') or (inst == 'zypper'):

cmd = '%s install python-pexpect' % (inst)

elif inst == 'yum':

cmd = '$s install pexpect' % (inst)

else:

cmd = 'echo "Not support yet:)"';

try:

fd = subprocess.Popen( cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE )

out = fd.stdout.readlines()

err = fd.stderr.readlines()

all = out+err

all = "".join(all)

except OSError,e:

all = "Cannot run command, Exception:"+e+os.linesep

import pexpect

#print all

'''

pexpect执行类,分两个方法,ssh和scp,自动判断是否首次连接,并自动完成yes或输入密码的应答。

'''

class Expect:

#定义ssh方法,入口变量包括ip, port,username,password,执行命令

def ssh(self, ip, port, user, passwd, cmd):

#创建连接子进程对象

ssh = pexpect.spawn('ssh -p %s %s@%s "%s"' % (port, user, ip, cmd))

r = ''

try:

#判断是否首次连接,如果是首次,则回答yes并输入密码,否则直接输入密码

i = ssh.expect(['password:', 'continue connecting (yes/no)?'], timeout=5)

if i == 0 :

ssh.sendline(passwd)

elif i == 1:

ssh.sendline('yes')

ssh.expect('password:')

ssh.sendline(passwd)

except pexpect.EOF:

ssh.close()

else:

r = ssh.read()

ssh.expect(pexpect.EOF)

ssh.close()

return r

#定义scp方法,入口变量包括ip,port,username,password,需要复制到client的文件名,复制到client的路径

def scp(self, ip, port, user, passwd, srcfile = "index.html", distpath):

#创建连接子进程对象

ssh = pexpect.spawn('scp -P %s %s %s@%s:%s ' % (port, file, user, ip, distpath))

r= ''

try:

#判断是否首次连接,如果是首次,则回答yes并输入密码,否则直接输入密码

i = ssh.expect(['password:', 'continue connecting (yes/no)?'], timeout=5)

if i == 0:

ssh.sendline(passwd)

elif i == 1:

ssh.senline('yes')

ssh.expect('password:')

ssh.sendline(passwd)

except pexpect.EOF:

ssh.close()

else:

r = ssh.read()

ssh.expect(pexpect.EOF)

ssh.close()

return r

#创建conf中的对象,只是为了写起来方便。不创建直接用也行

packages = conf.package_dir

logs = conf.log_dir

c_tmp = conf.client_tmp_dir

port = conf.ssh_port

scripts = conf.script_dir

nodes = conf.node_list

expect = Expect()

#在本机执行server端脚本。该脚本会安装Ganglia gmetad,gmond,cacti,nagios,gangliaweb,mysql,apache等等

os.system("sh " + scripts + "dpkg_server_ubuntu_x.x86_64.sh")

#循环列出conf的列表中配置的主机,用户名,密码,执行命令

for i in range(len(nodes)):

ip = nodes[i]['ip']

user = nodes[i]['user']

passwd = nodes[i]['passwd']

cmd = nodes[i]['cmd']

#将本机的client执行脚本复制到client端的conf.py中定义的路径client_tmp_dir

r = expect.scp(ip, port, user, passwd, scripts+'dpkg_client_ubuntu_x.x86_64.sh', c_tmp)

print r

#在client端执行刚复制过去的脚本,脚本中包含gmond,nagios-client,snmpd等等

r = expect.ssh(ip, port, user, passwd, cmd)

print r

我还没写按自动判断client端操作系统安装不同脚本的逻辑,有兴趣的可以自己改改,其实本身脚本并不难,核心都是在pexpect,我主要是不想用puppet,不想用puppet的主要原因是不想学ruby和他那复杂的配置文件。不光是部署监控,自己写shell脚本,随便部署什么都可以。nginx,php,反正能用脚本完成的事都可以干。

python快速部署一个服务器_Python加Shell快速部署集群相关推荐

  1. 部署一个 Containerd 容器运行时的 Kubernetes 集群

    前面我们介绍了 containerd 的基本使用,也了解了如何将现有 docker 容器运行时的 Kubernetes 集群切换成 containerd,接下来我们使用 kubeadm 从头搭建一个使 ...

  2. 【一篇入魂】redis快速入门—部署、数据类型、持久化、事务、集群

    Redis简介 简单介绍 Redis:开源.免费.非关系型数据库.K-V数据库.内存数据库,支持持久化.事务和备份,集群(支持16个库)等高可用功能.并且性能极高(可以达到100000+的QPS),易 ...

  3. RKE部署Rancher v2.5.8 HA高可用集群 以及常见错误解决

    此博客,是根据Rancher官网文档,使用RKE测试部署最新发布版 Rancher v2.5.8 高可用集群的总结文档.Rancher文档 | K8S文档 | Rancher | Rancher文档 ...

  4. 使用RKE部署Rancher v2.5.8 HA高可用集群

    文章目录 一 了解 Rancher 1 关于Helm 2 关于RKE 3 关于K3S 4 Rancher 名词解释 4.1 仪表盘 4.2 项目 4.3 多集群应用 4.4 应用商店 4.5 Ranc ...

  5. 部署基于tomcat 8 的solrCloud 5.5集群

    部署基于tomcat 8 的solrCloud 5.5集群 @(OTHERS)[solr] 部署基于tomcat 8 的solrCloud 55集群 一版本及准备工作 二准备solr相关webapp内 ...

  6. K8S集群部署kube-Prometheus监控Ceph(版本octopus)集群、并实现告警。

    K8S集群部署kube-Prometheus监控Ceph(版本octopus)集群.并实现告警. 一.背景描述 公司K8S集群后端存储采用的是cephfs,测试环境经常性出现存储故障,虽然最后都解决了 ...

  7. 饱受ddos/cc攻击的站长朋友们,选高防服务器该选单机防御还是集群防御呢?

    4年前锤子科技CEO罗永浩在开发布会的时候遭遇DDOS攻击,导致部分内容展示不了.3年前,大名鼎鼎的程序员圣地github遭受高达2T的DDOS攻击,当时是历史上有史以来遭受的最大攻击,不过Githu ...

  8. 浪潮发布新型水冷服务器 可以快装移动式液冷集群

    浪潮发布新型水冷服务器 可以快装移动式液冷集群 浪潮近日发布新一代板上液冷的2U4节点高密度服务器i24M5-LC,可支持构建PUE<1.2的大规模水冷服务器数据中心.同时浪潮推出可移动的机架式 ...

  9. 普元 EOS Platform 7.6 集群部署在BES9.5.2.4692,重启集群节点偶发报错:java.util.ConcurrentModificationException

    [问题描述] 普元EOS Platform 7.6 集群部署在BES9.5.2.4692,重启集群节点偶发报错: [com.primeton.runtime.resource.impl.Contrib ...

最新文章

  1. 批量探测工具fpingping常用命令集合大学霸IT达人
  2. catia齿轮宏程序_Catia宏程序
  3. 【SDL】SDL简介
  4. ucloud对象存储装宝塔_使用UCloud优刻得云主机和宝塔面板快速搭建WP个人博客网站教程...
  5. 实时检测input的长度_目标检测——TinyYOLOv3
  6. ​深度学习基础 | Seq2seq+Attention
  7. 【TSP】基于matlab改进的人工鱼群算法求解旅行商问题【含Matlab源码 1479期】
  8. 内蒙古自治区高分二号卫星影像获取/高分一号卫星影像
  9. 如何使用JMeter自身代理录制测试脚本
  10. tkinter电子木鱼
  11. ZCMU--5066: 黑暗长廊
  12. (原創) 如何破解ModelSim 6.1f? (IC Design) (ModelSim)
  13. Java学习笔记01—Java概述、数据类型、变量、标识符、类型转换
  14. 复杂网络分析(5)----共引和文献耦合
  15. 学习表——受任于败军之际,奉命于危难之间(12.5-12.11)
  16. SBM模型测算代码,matlab,可算 sbm,超效率sbm,非期望sbm,非期望超效率sbm
  17. CruiseControl.NET/CCNET安装包下载
  18. 四大流派瓜分家居物流,但仍有两难选择与三大困扰
  19. 抖音直播间如何运营?
  20. jxse2.6连接外网rdv一直连接不上,而相同的代码用jxse2.7却能连上

热门文章

  1. jQuery的HTML与CSS方法
  2. cmd命令快速启动、暂停和关闭sql server服务
  3. 联想n308 android 一体机,附文:N308设计回顾_联想 N308_一体电脑评测-中关村在线...
  4. Mybatis一级缓存,二级缓存的实现就是这么简单
  5. 推荐几个华为、字节跳动、蚂蚁金服的大佬公号
  6. 安装和使用Oracle Instant Client 和 SQLPlus
  7. Java设计模式-适配器模式Adapter
  8. Python3算法基础练习:编程100例( 21~ 25)
  9. 算法:程序设计之并查集
  10. Android Material Design之在RecyclerView中嵌套CardView实现