Fabric 自动化部署(套娃)的终极方案
这次想跟大家分享的是Fabric,原因是,之前我的博客都是使用Hexo来生成的,Hexo是一个静态的博客渲染框架,是基于node.js的。上手难度>一般,通过托管的github,很快每个人都可以拥有一个美观的静态博客,类似这样(moshiwei.github.io)青涩又中二的大学时光。
最近发现了新的hugo,是基于Go的静态博客框架,号称目前最快。
既然是静态博客,那就追求沉浸式的写作,如果能在任何地方,完成写作,一键部署完成渲染,这才是沉浸式写作体验。为了追求这种沉浸,开
始学习Fabric。
本地远程,两个扳手
注意,现在的fabric其实是属于fabric2的release了,没有和fabric1.x达到完全统一的功能开发和升级。有些已经被优化,或者删除了,Invoke也单独剥离出来了,Invoke的前身就是fabric1.x他们的联系和爱恨情仇,文档也写了,有时间可以看看。
Fabric提到,fabric是由其他几个库组成了,但在顶部封装了自己的层,用户的依赖大部分直接从fabric包种导入,但有时候也可以从invoke和paramiko导入
Invoke and Paramiko
这两个包我要着重介绍一下。
- Invoke,实现了命令行解析,组织任务,和运行shell命令,主要任务就是在本地执行命令。(我还为了熟悉他单独写了一篇介绍文章,包含>实例)
- paramiko,实现了中低层的SSH基本功能,SSH链接,SFTP会话,SSH key的管理等(可以配置免密登录)
是不是很有趣,fabric套娃了一个强力的本地助手和一个强力的远程助手
Fabric做了什么?
- 继承了Invkoe的context和command-runner,将他们包装在paramiko的原始接口中,
- 使用了Paramiko的ssh_config解析机制拓展了Invoke的配置系统;
- 实现了自己的高级接口,比如端口转发,上下文管理器
由于我只使用过Paramiko做过一些自动化任务(Paramiko可以实现到远程server的shell命令,密码登录,免密登录,sftp文件传输,非常好用>,唯一的不好就是如果需要对标准输出,标准错误做解析的话,需要自己进一步封装,稍后介绍Fabric其实做到了这一点)。Invoke没用过,但
看上去fabric让他们相互成就了,很强。
简单实例
最基本的用例就是利用Fabric到远程server执行shell命令,然后分析执行的结果,默认情况下,远程终端的打印会直接显示在你的终端上,也>就是说远程的stdout.decode()会直接返回(起码节省几行代码)。
>>> from fabric import Connection >>> c = Connection('web1') >>> result = c.run('uname -s') Linux >>> result.stdout.strip() == 'Linux' True >>> result.exited 0 >>> result.ok True >>> result.command 'uname -s' >>> result.connection <Connection host=web1> >>> result.connection.host 'web1'
Connection的其他实例化例子
Connection(host='web1', user='deploy', port=2202)
Connection('deploy@web1:2202')
小结
其实官网把这个介绍放在最前面我觉得很好,因为可能很多人做过这两个前置任务,对内容和用法都很熟悉,对于快速入手fabric有很大的帮助
,后面我会介绍常用功能的fabric实现
reference
https://docs.fabfile.org/en/2.6/getting-started.html#