以下为观看Ansible-Configuration Management的笔记。不适合初学者查看。可以作为温习使用
阅读全文遇到有人反映可能是内网环境。无法访问外部网络。安装初始化环境的时候好像颇为不便。其实只要能ssh上去。这一切都不是问题。就是各种转发,以下以内网使用pip安装第三方依赖包为例说明该如何操作
1.本机开启一个临时的http代理
1 | pip install mitmproxy # 安装 |
1 | mitmproxy -p 8899 --ignore .+ # 使用 |
mitmproxy是一个python编写的http/https中间人框架。这里我们单独的使用它的http proxy功能。
参数p当然是port端口的意思了。监听8899端口
加上ignore是因为中间人https连接需要客户端安装信任证书才可以。此处我们只是单纯的使用一下proxy不需要中间人。所以所有流量使用HTTP Connection隧道方式就达成目的了。使用正则表达式.+
忽略所有域名。至于为什么使用http不是用socks。因为http使用更广泛
2.ssh使用远程端口转发(参考ssh端口映射)
1 | ssh -R 8899:localhost:8899 remote_server |
将远程主机上的8899端口映射到本机的8899端口
3.远程主机使用本地的http代理进行环境初始化
可以使用如下命令进行测验
1 | curl -x http://localhost:8899 ip.cn |
比如使用pypi安装tornado执行如下命令即可
1 | pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --proxy http://localhost:8899 tornado |
思路是这样。其它同理~~~
开发中总会遇到一些测试需要回滚数据库。常规的单元测试的做法是在单个会话中不真正的写入到数据库。而是测试完成后进行数据库回滚。大多数情况下这样都是满足要求的。只是有的时候需要数据库真正的写入到数据库。此时rollback回滚就有些乏力了。此时给数据库做一个备份,测试完成后回滚是一种不错的主意。Postgresql数据库的常规备份我们会使用pg_dump和pg_restore进行导出和恢复。此时如何快速的进行这个操作是我们关注的话题
很幸运。很顺利的搜到了答案。6年前有人在stackexchange上提问同样的问题。得到了一些有用的回复。大概有这些
- 使用文件系统级快照LVM
- 使用CREATE DATABASE … TEMPLATE语法
- 将数据库放在虚拟机里面。使用虚拟机快照
其中最有效的方案是二。因为LVM在个人笔记本上难以实施。虚拟机恢复时间较慢。依据方案二于是乎有人写了一个工具 stellar。粗略读了一下源码。其具体原理大概如下图
备份的时候使用create database … template创建2个备份。恢复的时候删掉原有的数据库。将一个备份重命名为原有的名称。另外的一个备份再生成一个备份就完成了。另外删除新建数据库操作均会关闭所有已连接的数据库会话。
因为类似文件系统级快照,所以方法极快。我本机2G的数据库文件,创建一个快照大概十秒钟左右,恢复就更快了。当然缺点也是有的,你每创建一个快照都会新增2个一样大小的副本,相当的占据硬盘空间,可是为了速度这点缺陷也就微不足道了┑( ̄Д  ̄)┍
另外一个小缺点。因为它定位于测试环境下的数据库备份恢复。所以只连接一台机器。比如你一个数据库在机器A,一个数据库在机器B.赛高~~,那你只能在2个目录下使用2个配置文件来完成了。如果同一个机器上的多个数据库是可以直接备份的。再就是此工具比较专注于Postgresql。对于Mysql就不那么友好了。或许是Mysql的备份方案不一样
使用方法
stellar init
按照提示输入本机数据库访问路径生成配置文件stellar snapshot
生成一个快照stellar restore <snap1>
恢复- 其他请看
stellar --help
( ⊙ o ⊙ )啊! 多么爽快,世界真美妙
参考
Is it possible to quickly create/restore database snapshots with PostgreSQL?
github stellar
metaclass一直被归类为比较高深的内容,写代码也很少会使用到metaclass。然而如果你看某些项目的源代码,还是会被绕到metaclass里面去。花一些时间理解下metaclass很有用的,因为它真的能把一条线串起来,环环相扣,所以有扎实的基础是掌握metaclass的前提,本文代码基于python3.5
阅读全文工作中看到有一些不好的代码,想了个办法优化了一下,于是有了这篇博文。本文主要讲tornado的表单验证,使用的是wtforms。本文最终达到的效果是使用self.xx获取post传递过来的值。
阅读全文letsencrypt刚出来的时候写了一篇它的认证签发原理。自那过后就没有真正的去实践过了。最近有部署HTTPS的需求就又考察了一番。发现acme.sh灰常好用啊~~~,来一篇水文记录下测试部署HTTPS的完整过程吧
阅读全文很早就使用过autopep8来自动格式化代码,使用IDE的时候也会经常使用格式化代码功能让代码更符合规范一点。可是这都不是自动化的,或者说是强制的。为了保持团队的良好代码风格感觉每个同事在提交代码之前都自动进行格式化或者风格检查是一个不错的主意,于是找到了pre-commit
原理也还是很简单的,git自身提供了一些hook功能,查看git/hooks目录下会发现有一些sample文件,这样在执行commit、push、merge的时候都是可以进行一些简单的检查等功能的。然而这个设定有一个缺点。没一个hook只能执行一个文件的内容,所以要么将各种功能放在一个文件里面,或者每个功能都放置在各自的文件里面。最后由一个文件一起执行。pre-commit就解决了我们的这个文件。将不同的任务分割成单个文件。然后只需要添加别人共享的脚本就能够很快的进行commit hook了,简要使用方法例举如下
在项目根目录下编写配置文件(.pre-commit-config.yaml)
1
2
3
4
5- repo: git://github.com/pre-commit/pre-commit-hooks
sha: v0.7.1
hooks:
- id: trailing-whitespace
- id: autopep8-wrapper进行初始化
pre-commit install
就可以了,以后每次执行commit的时候就会执行检查。配置文件的repo地址即为符合pre-commit框架的地址,id即为提供的功能~~,还是很好理解的。例如以上提供的autopep8-wrapper就可能够配置pep8规范进行一些代码风格检查,如果不符合风格就会自动格式化。pep8工具的默认配置文件是~/.config/pep8
参考
About style guide of python and linter tool. pep8, pyflakes, flake8, haking, Pyling.
写几条自己用supervisor遇到的一些小坑
- Python 3 Wall的反派代表,一直不能使用python3安装
- 对中文输出支持奇差,估计是使用python2造成的,举个例子,假如你要在python2里面print输出一个unicode中文字符。我试了各种办法,均无解(和supervisor使用子进程运行程序的策略有关),好在使用logging模块输出中文居然没啥问题-_-,正式运行环境也是全部使用logging代替print
- 即使用python3,输出中文也会遇到问题,需要在配置文件添加
environment=LANG="en_US.utf8", LC_ALL="en_US.UTF-8", LC_LANG="en_US.UTF-8"
解决 - 写配置文件的时候一个变量不能配置多行,我一开始因为environment太长。写了2行,导致后面的没生效,折腾好久
- 修改supervisor配置文件后,如果配置文件错了,不会报错!而且supervisor没有工具能对配置文件的正确性进行检查,灰常操蛋啊!
- supervisor可以检查到异常自动重启并设置最大重启次数,可是有时候会造成无限重启这种情况。因为重启后立刻退出才会触发最大重启次数机制,假如程序一直是运行了十分钟自动退出。那么会造成无限重启,可以使用它的api写一个脚本监控这种情况,进行警告
1 | import xmlrpc.client |