深受DevOps模式毒害,天天都少不了干op的活。之前部署一直用bash脚本,后台并发执行各种远程命令,但bash脚本不好做并发控制,写稍复杂些的脚本都很费劲。当用过好几层eval命令后,我终于放弃了。
几经波折,Fabric成了我的新欢。在看到fabric对服务器角色、本地和远程各种命令的支持后,相信我,我是留着口水的。
安装:
安装很简单,直接pip之:
sudo pip install fabric
执行本地测试so easy。fabric默认从cwd的fabfile.py中加载命令:
# fabfile.py
def hello():
print('Hello World!')
执行命令:
~/deploy\_tools$ fab hello
Hello World!
远程执行也并不复杂,网上各种教程很多,这里不再赘述。
Kerberos支持
重点说我遇到的问题:内网使用了Kerberos认证,使用远程命令时,一直提示输入密码。网上查了下,fabric现在并不支持Kerberos认证,但fabric的ssh是基于paramiko的,后者已经提供了Kerberos支持。github上fabric有个patch也已经支持:url。所以重新clone最新的fabric代码,然后patch之,之后手动重新安装fabric:
curl https://patch-diff.githubusercontent.com/raw/fabric/fabric/pull/1261.patch > /tmp/1261.patch
git clone https://github.com/fabric/fabric.git
cd fabric && git apply /tmp/1261.patch
python setup.py install
再次执行依然报错。但错误变成了:
ERROR:paramiko.transport:ImportError: Unable to import a GSS-API / SSPI module!
有戏!再查paramiko的install说明,发现还需要安装python-gssapi,pyasnl。安装完毕后,一切搞定!
Fabric的debug日志
在查找无法执行远程命令的原因时,找到了fabric的trouble-shooting页面。里面提及打印DEBUG日志的方式,对追查问题帮助很大:
import logging
logging.basicConfig(level=logging.DEBUG)
之后想写一下对Kerberos的了解,简单备忘下。