我们的服务器和虚拟机的环境配置都由 puppet 管理,但有时候需要临时执行某些任务和操作,比如同时更换500台服务器的密码、同时更新或者重启500台虚拟机、在特定几台服务器上添加或者一个用户、上传一个特定文件/脚本到1000台服务器等等。这些任务用 Puppet 可以做,但是不是最简洁的办法。我们需要一种工具能完成大量服务器上的批量操作,并且要简单可编程,Fabric 就是这样一个基于 Python 的服务器批量管理库/工具,Fabric 使用 ssh(通过 paramiko 库)在多个服务器上批量执行任务,我们只需要用 Python 编写这些任务脚本并指定要执行这些任务的服务器就可以了。
Fabric 依赖 paramiko,所以需要安装这两个:
$ sudo pip install fabric $ sudo pip install paramiko
编写一个简单的 Fabric 例子,在1台服务器上打印系统信息(uname -s):
$ vi fabfile.py #!/usr/bin/python from fabric.api import run def host_os(): run('uname -s')
在 vpsee.com 这台主机(host)上使用 root 帐户执行上面的任务 host_os:
$ fab -H root@vpsee.com host_os [root@vpsee.com] Executing task 'host_os' [root@vpsee.com] run: uname -s [root@vpsee.com] Login password for 'root': [root@vpsee.com] out: Linux Done. Disconnecting from root@vpsee.com... done.
来看一个更复杂点的例子,在多个服务器(grid00, grid02, …, grid05)上更换 root 密码(假设原密码是 root),注意加上 @parallel,这样任务是并行执行的,在大量服务器上会快很多:
#!/usr/bin/python # -*- coding: utf-8 -*- from fabric.api import * import string from random import choice import socket import paramiko env.user = 'root' env.password = 'root' env.hosts = [ 'grid00', 'grid01', 'grid02', 'grid03', 'grid04', 'grid05'] @task @parallel def passwd(user, passwd=False): with settings(hide('running', 'stdout', 'stderr'), warn_only=True): if isup(env.host): if not passwd: passwd = genpass() sudo("echo -e '%sn%s' | passwd %s" % (passwd, passwd, user)) def genpass(length=10): return ''.join(choice(string.ascii_letters + string.digits) for _ in range(length)) def isup(host): print 'connecting host: %s' % host timeout = socket.getdefaulttimeout() socket.setdefaulttimeout(1) up = True try: paramiko.Transport((host, 22)) except Exception, e: up = False print '%s down, %s' % (host, e) finally: socket.setdefaulttimeout(timeout) return up
使用 fab -l 查看我们刚编写的 fabfile.py 里面的可用命令,这个命令就是那个函数名 def passwd(user, passwd=False):
$ fab -l Available commands: passwd
使用这个命令批量更换 grid00-grid05 的 root 密码为 test,passwd 传递参数的时候接冒号,并且用户名和密码参数用逗号隔开:
$ fab passwd:root,test [grid00] Executing task 'passwd' [grid01] Executing task 'passwd' [grid02] Executing task 'passwd' [grid03] Executing task 'passwd' [grid04] Executing task 'passwd' [grid05] Executing task 'passwd' connecting host: grid05 connecting host: grid04 connecting host: grid02 connecting host: grid03 connecting host: grid01 connecting host: grid00 Done.
Fabric 的强大之处在于可以用 Python 编写各种任务(函数),这些任务可以指定到任何服务器上(通过 ssh),非常适合管理大量服务器、批量处理任务。另外 Fabric 工作方式非常简单容易理解,就是简单的 ssh 而已,没有内幕没有架构,不像其他工具什么客户端服务器端、什么中间代码、什么 DSL 领域专属语言(嗯,说的就是 puppet, chef)。Fabric 使用起来只需要懂点 Python 就可以了,不需要学命令、api、框架之类的。我们喜欢简单、容易理解的工具。
转载请注明:爱开源 » 使用 Fabric 批量执行服务器任务