Windows服务器Pyton辅助运维--02.远程重启IIS服务器

Windows服务器Pyton辅助运维

02.远程重启IIS服务器

开发环境:

Web服务器:

Windows Server 2008 R2 SP1

IIS 7.5

运维服务器:

Python 2.7.8

组件:pywin32(219)  wmi(1.4.9)

工作内容说明:

每次排除故障的时候开发人员都会要求重启Web服务器上的IIS,有很多台IIS服务器需要重启,当然Google知道bat可以搞定这件事,但是本文用python来搞定。

实现过程:

先准备以下几个问题

使用Windows自带命令行工具如何远程重启IIS?

  1. WMI服务

需要远程服务器安装并启动WMI服务

如何写命令?

2. Psexesc工具

首先去微软网站上下载这个工具

然后执行下面这个命令

psexec \\192.168.1.X -u administrator -p ***** iisreset

然后会输出如下

Python代码的设计思路?

  1. 去搜个WMI的Python库(本文所采用
  2. 去搜个Psexec的Python库(搜到了不会用Corelabs的Impacket
  3. 直接import os 执行psexec远程命令(有问题无法看到返回信息)

整一个配置文件记录基本信息AppConfig.ini

 1 [DepolyFiles]
 2
 3 LocalDir=C:\Deploy
 4
 5 RemoteDir=E:\Deploy
 6
 7 Servers=192.168.1.2-23|192.168.1.37
 8
 9 UserId=administrator
10
11 Password=*******
12
13 UseIISRestart= false

Servers配置节中“|”是分隔符,可以填写多个IP,“-”符号表示连续IP。

然后去搜一个WMI的Python实现代码如下RemoteCommands.py

  1 __author__="*****"
  2 __date__ ="*****"
  3
  4 import os
  5 import wmi
  6 import shutil
  7 import win32wnet
  8 import ConfigParser
  9
 10 REMOTE_PATH = ‘c:\\‘
 11
 12 def main():
 13     pIniFileName = "AppConfig.ini";
 14
 15     config = ConfigParser.ConfigParser()
 16     config.readfp(open(pIniFileName,"rb"))
 17
 18     LocalDir = config.get("DepolyFiles","LocalDir").strip()
 19     RemoteDir = config.get("DepolyFiles","RemoteDir").strip()
 20     Servers = config.get("DepolyFiles","Servers").strip()
 21     UserId = config.get("DepolyFiles","UserId").strip()
 22     Password = config.get("DepolyFiles","Password").strip()
 23     UseIISRestart = config.get("DepolyFiles","UseIISRestart").strip()
 24
 25     print "LocalDir : "+LocalDir
 26     print "RemoteDir : "+RemoteDir
 27     print "Servers : "+Servers
 28     print "UserId : "+UserId
 29     print "Password : "+Password
 30     print "UseIISRestart : "+UseIISRestart
 31
 32     pServerSplit = Servers.split(‘|‘);
 33     pServerList = list();
 34     for itemServer in pServerSplit:
 35         sServerString = itemServer.strip();
 36         if(sServerString.find(‘-‘)>0):
 37             tempList = sServerString.split(‘-‘);
 38             iStartValue = int(tempList[0].split(‘.‘)[3]);
 39             iEndValue = int(tempList[1]);
 40             sFrontString = tempList[0].split(‘.‘)[0]+"."+tempList[0].split(‘.‘)[1]+"."+tempList[0].split(‘.‘)[2]+".";
 41             while iStartValue<=iEndValue:
 42                 pServerList.append(sFrontString+str(iStartValue));
 43                 iStartValue=iStartValue+1;
 44         else:
 45             pServerList.append(sServerString);
 46
 47     for webServer in pServerList:
 48         ip = webServer
 49         username = UserId
 50         password = Password
 51         print ‘‘;
 52
 53         server = WindowsMachine(ip, username, password)
 54         resultlist = server.run_remote(‘iisreset‘,async=True, output=True);
 55         for linestring in resultlist:
 56             print linestring
 57
 58 def create_file(filename, file_text):
 59     f = open(filename, "w")
 60     f.write(file_text)
 61     f.close()
 62
 63 class WindowsMachine:
 64     def __init__(self, ip, username, password, remote_path=REMOTE_PATH):
 65         self.ip = ip
 66         self.username = username
 67         self.password = password
 68         self.remote_path = remote_path
 69         try:
 70             print "Establishing connection to %s" %self.ip
 71             self.connection = wmi.WMI(self.ip, user=self.username, password=self.password)
 72             print "Connection established"
 73         except wmi.x_wmi:
 74             print "Could not connect to machine"
 75             raise
 76
 77     def run_remote(self, cmd, async=False, minimized=True, output=False):
 78         """
 79         this function runs cmd on remote machine, using wmi. the function create a .bat file,
 80         copies it to the remote machine, and runs the .bat file
 81         inputs: cmd - command to run
 82                 async - False, waits for command to finish, True, return immidiatly
 83                 mimimized - window state
 84                 output - True, returns the command‘s output
 85         output: return value of the command
 86                 output of the command if true
 87         """
 88         output_data = None
 89         pwd = os.getcwd()
 90         bat_local_path = os.path.join(pwd, ‘output_{0}.bat‘.format(self.ip))
 91         bat_remote_path = os.path.join(self.remote_path, ‘output_{0}.bat‘.format(self.ip))
 92         output_remote_path = os.path.join(self.remote_path, ‘output_{0}.out‘.format(self.ip))
 93         output_local_path = os.path.join(pwd, ‘output_{0}.out‘.format(self.ip))
 94         text = cmd + " > " + output_remote_path
 95         create_file(bat_local_path, text)
 96         self.net_copy(bat_local_path, self.remote_path)
 97         batcmd = bat_remote_path
 98
 99         SW_SHOWMINIMIZED = 0
100         if not minimized:
101             SW_SHOWMINIMIZED = 1
102         print "Executing %s" %cmd
103         startup = self.connection.Win32_ProcessStartup.new (ShowWindow=SW_SHOWMINIMIZED)
104         process_id, return_value = self.connection.Win32_Process.Create (CommandLine=batcmd, ProcessStartupInformation=startup)
105         if async:
106             watcher = self.connection.watch_for (
107                                   notification_type="Deletion",
108                                   wmi_class="Win32_Process",
109                                   delay_secs=1,
110                                   )
111             watcher ()
112
113         if output:
114             print ‘copying back ‘ + output_remote_path
115             self.net_copy_back(output_remote_path, output_local_path)
116             output_data = open(output_local_path, ‘r‘)
117             output_data = "".join(output_data.readlines())
118             self.net_delete(output_remote_path)
119         self.net_delete(bat_remote_path)
120         return return_value, output_data
121
122     def net_copy(self, source, dest_dir, move=False):
123         """ Copies files or directories to a remote computer. """
124         print "Start copying files to " + self.ip
125         if self.username == ‘‘:
126             if not os.path.exists(dest_dir):
127                 os.makedirs(dest_dir)
128             else:
129                 # Create a directory anyway if file exists so as to raise an error.
130                  if not os.path.isdir(dest_dir):
131                      os.makedirs(dest_dir)
132             shutil.copy(source, dest_dir)
133
134         else:
135             self._wnet_connect()
136
137             dest_dir = self._covert_unc(dest_dir)
138
139             # Pad a backslash to the destination directory if not provided.
140             if not dest_dir[len(dest_dir) - 1] == ‘\\‘:
141                 dest_dir = ‘‘.join([dest_dir, ‘\\‘])
142
143             # Create the destination dir if its not there.
144             if not os.path.exists(dest_dir):
145                 os.makedirs(dest_dir)
146             else:
147                 # Create a directory anyway if file exists so as to raise an error.
148                  if not os.path.isdir(dest_dir):
149                      os.makedirs(dest_dir)
150
151             if move:
152                 shutil.move(source, dest_dir)
153             else:
154                 shutil.copy(source, dest_dir)
155
156     def net_copy_back(self, source_file, dest_file):
157         """ Copies files or directories to a remote computer. """
158         print "Start copying files " + source_file +  " back from " + self.ip
159         if self.username == ‘‘:
160             shutil.copy(source_file, dest_file)
161         else:
162             self._wnet_connect()
163             source_unc =  self._covert_unc(source_file)
164             shutil.copyfile(source_unc, dest_file)
165
166     def _wnet_connect(self):
167         unc = ‘‘.join([‘\\\\‘, self.ip])
168         try:
169             win32wnet.WNetAddConnection2(0, None, unc, None, self.username, self.password)
170         except Exception, err:
171             if isinstance(err, win32wnet.error):
172                 # Disconnect previous connections if detected, and reconnect.
173                 if err[0] == 1219:
174                     win32wnet.WNetCancelConnection2(unc, 0, 0)
175                     return self._wnet_connect(self)
176             raise err
177
178     def _covert_unc(self, path):
179         """ Convert a file path on a host to a UNC path."""
180         return ‘‘.join([‘\\\\‘, self.ip, ‘\\‘, path.replace(‘:‘, ‘$‘)])
181
182     def copy_folder(self, local_source_folder, remote_dest_folder):
183         files_to_copy = os.listdir(local_source_folder)
184         for file in files_to_copy:
185             file_path = os.path.join(local_source_folder, file)
186             print "Copying " + file
187             if(os.path.isdir(file_path)):
188                 self.copy_folder(file_path,remote_dest_folder+"\\"+file);
189             else:
190                 try:
191                     self.net_copy(file_path, remote_dest_folder)
192                 except WindowsError:
193                     print ‘could not connect to ‘, self.ip
194                 except IOError:
195                     print ‘One of the files is being used on ‘, self.ip, ‘, skipping the copy procedure‘
196
197     def net_delete(self, path):
198         """ Deletes files or directories on a remote computer. """
199         try:
200             if self.username == ‘‘:
201                 os.remove(path)
202
203             else:
204                 self._wnet_connect()
205
206                 path = self._covert_unc(path)
207                 if os.path.exists(path):
208                     # Delete directory tree if object is a directory.
209                     if os.path.isfile(path):
210                         os.remove(path)
211                     else:
212                         shutil.rmtree(path)
213                 else:
214                     # Remove anyway if non-existent so as to raise an error.
215                     os.remove(path)
216         except:
217             print ‘could not delete ‘, path
218
219 if __name__ == "__main__":
220     main()

备注:请确保在一个运维机器和Web服务器在同一个局域网中.请确保远程服务器WMI服务开启.

Windows服务器Pyton辅助运维--02.远程重启IIS服务器,布布扣,bubuko.com

时间: 2024-12-14 09:05:05

Windows服务器Pyton辅助运维--02.远程重启IIS服务器的相关文章

Windows服务器Pyton辅助运维--01.自动Copy文件(文件夹)到远程服务器所在目录

Windows服务器Pyton辅助运维 01.自动Copy文件(文件夹)到远程服务器所在目录 开发环境: u  Web服务器: Windows Server 2008 R2 SP1 IIS 7.5 u  运维服务器: Python 2.7.8 组件:pywin32(219)  wmi(1.4.9) 工作内容说明: 生产环境中有很多台Web服务器,均为IIS环境,每次开发人员都提供站点补丁包给我进行系统升级,我需要将这些补丁包更新到所有Web服务器的指定目录下以完成系统更新的工作. 实现过程: 整

Windows服务器Pyton辅助运维--03.安装Visual Studio 的 Python 开发插件 PTVS

PTVS (Python Tools for Visual Studio) http://pytools.codeplex.com/ 当前版本:2.1 RC PTVS (Python Tools for Visual Studio) 是一个开源项目,采用Apache 2.0许可发布.PTVS的主要特性包括:CPython.IronPython.Jython和PyPy:高级编辑功能如IntelliSense:多重构:内置REPL(read-eval-print loop)窗口:调试和分析功能,等等

大型企业服务器的自动化运维(转载)

企业主机服务器日常运维工作中,经常需要登录并以 root 方式执行系统操作,如果在主机数量少的情况下,手工方式登录并执行效率尚可,但如果主机数量庞大(如笔者运维的国外客户服务器数量达 2000+),依次对一台台服务器进行手工操作工作量巨大且出错概率与主机数量成线性增大. 本文分析了在大数量企业服务器情况下,利用 shell 管道,Java SSHD 开源包,Expect 脚本三种方式实现自动登录并执行系统运维操作,三种方式分别适用于不同的场景,可以满足绝大多数企业主机服务器自动化运维的工作内容,

linux运维好书《高性能Linux服务器构建实战Ⅱ》已出版发售,附封面照!

经过近2年的酝酿,几个月的修正,<高性能Linux服务器构建实战Ⅱ----系统安全.故障排查.自动化运维与集群架构>一书出版在即,马上就要与读者见面了. <高性能Linux服务器构建实战Ⅱ----系统安全.故障排查.自动化运维与集群架构>仍 然沿用了<高性能Linux服务器构建实战---运维监控.性能调优.集群应用>的写作特点:实战.实用.通俗.易懂的特点,而在内容上更加实战化,从运 维的多个方面以近似真实的环境介绍运维工作中的各个方方面面,与第一本书不同的是,此书新增

Linux服务器集群运维经验

公司大概有5000+以上的服务器节点,包括各种应用,我和同事共同维护大约2500+的服务器,主要包括一些视频cdn,直播视频cdn,webcdn和p2p服务器. 以下是自己在运维工作中的一点经验和看法,希望对大家有所帮助 1.       服务器型号的区分,为以后的统一化和标准化作硬件上的准备,很多人忽视这一点,其实如果这一点做得好会使后面的运维工作轻松很多,根据应用我们主要把服务器分为3中,cpu密集型,主要用于大量计算应用,比如p2p;内存密集型,用于cache类应用,比如squid,var

网站运维技术与实践之服务器监测常用命令

一.监测的意义 不论是网站运维还是系统管理,服务器本身的运行状况都是我们需要掌控的基础资料.在<打造FaceBook>一书中,王淮介绍FaceBook的工程师文化中有一句"Move Fast and Monitor Closely".这个"Closely"有两层意义,其一是"即时"的,要从系统开发初期,就有意识地设计好配套的监测,并逐步改善:其二是"深入",监控不能仅仅停留在监测主机负载.网卡流量的表面层次,而要尽

运维人员春节放假如何管理服务器?

放假啦,过年啦,收红包啦......从现在起我要回家养膘啦~ 可是作为一位服务器运维工程师,我最害怕放假都不能好好安心的大吃大喝,害怕被报警电话和邮件吵醒的日子,不想在家还抱着电脑解决服务器安全为题,不想打开微博看到某个明星八卦话题后面跟着一个"爆"........ 如果在放假期间这些情况你都没有遇到过,那么,恭喜你,你可以安心过个快乐年了.尽管你取得了阶段性的胜利度过了一个清净的假期,但现在可还不是掉以轻心的时候! 节日期间,因为无人值守,我们通常会选择运维管理面板来进行系统实时监控

windows and linux游戏运维方法

做了多年游戏运维工作,现在想整理下自己的工作,也顺便和大家分享下,可能不是最好的,但目前对我们来讲够用:由于开发平台的关系一直从事着WINDOWS2003,2008,CENTOS这二种系统的运维工作 在这里我主要想说下关于游戏运维中的批量操作的内容,先说下WINDOWS的吧 明天继续..................

linux运维技术(查看linux服务器状态常用命令)

最近发现大数据技术的一些部署,高可用,集群等和网站的负载均衡,自动化运维,灾备等其实有很多知识都是重合的,要学好linux运维相关,在大数据的研究上也会有所提高.既然工作需要去系统的去学习linux运维的技术,那就去好好的去学习它~~,况且我还很喜欢捣鼓这个. :) 先总结了解一台服务器状态的常用命令的总结:(以下是两台服务器测试的结果) (1)查看linux版本: [[email protected] home]# lsb_release -a LSB Version: :core-4.1-a