git 通过cron自动拉取最新代码

git 可以deploykey的方式来clone代码,但是git没有提供一个参数来指定key的路径,如何是好?

git通过deploykey的方式clone代码其实走的就是ssh,git 2.3.0后会参考一个环境变量GIT_SSH_COMMAND,完全可以通过定制该命令来指定key的路径,如下:

或许在某些情况下-i选项可能会被配置文件中的定义给覆盖掉,那么可以添加 -F /dev/null 选项禁用可能的配置文件,如下:

curl ftp 主动模式与被动模式

curl命令访问ftp默认走被动模式,主动模式可能会不好使,比如说:

  1. curl在防火墙后面,而防火墙又不允许主动进入的连接
  2. curl所在机器有多个IP,控制链路使用的IP和数据链路期望使用不同的IP
    1. 可以通过 -P address 来指定主动模式时数据链路期望使用的IP,如果简单使用数据链路的IP,则可以直接 -P –

svn to gitlab

手动在gitlab上创建git仓库: http://gitlab.phpor.net/phpor/svn2gitlab.git

 

 

给网站开启https

https://phpor.net/blog/

开启方法: https://certbot.eff.org/

发现的几个问题:

  1. 页面中有一些google的资源,国内用户会访问不到,然后页面加载就会很慢
  2. 页面中有一些图片写的是http的绝对地址,使得https访问时,页面中加载了http的资源,显得很不漂亮
  3. 让自己的的blog支持http2
  4. https的时候登录不能成功

这里的证书是3个月的有效期,马上要到期了,根据官方提供的脚本,自动更新证书的时候需要(虽然是自动的)重新安装python(而且是编译安装),结果失败了,解决办法: 官方给了一种docker的申请方式:

https://certbot.eff.org/docs/install.html#certbot-auto

如下:

由于国内下载docker镜像很慢,可以直接在国外的机器上完成上述操作,然后,把申请好的证书拿回来配置(这样也比去某些网站申请证书来的方便的多),注意,需要把申请证书的域名解析到这个docker的机器的IP上,验证域名要用。

为了方便下次使用,还是把这个docker容器下载到国内,放在自己博客的机器上,下次就不需要修改域名解析了

写个cron自动续签证书:

提前两天自动续签证书

 

目前certbot还不支持 通配符 证书的申请 (https://certbot.eff.org/faq/#will-let-s-encrypt-issue-wildcard-certificates

根据证书颁发的方式的不同,证书的级别也有不同,从低到高依次为: DV、OV、EV:

DV ( Domain Validation):只验证域名(这个很简单)

OV (Organization Validation): 验证域名和组织

EV(Extended Validation): 验证流程更严格

目前certbot还没有计划推出EV型证书(https://certbot.eff.org/faq/#will-certbot-issue-extended-validation-ev-certificates

 

关于申请证书频繁程度是限制: https://letsencrypt.org/docs/rate-limits/

nscd nslcd

缘起:

虚拟机配置了ldap认证,由于一次断网,ldap服务器进程还在,但是无法正常服务,查看原因,发现ldap服务器进程由于大量连接导致文件描述符占满。

虚拟机上启动了nslcd,该进程会和ldap服务器保持长连接,断网的时候,ldap服务器并不知道连接已经断开(应该是服务器端没有开启探活机制,而client端开启了探活机制),网络恢复后,client重新连接,导致连接数翻倍

解决办法:

ldap认证可以不走nslcd的,参考资料:

http://www.tldp.org/HOWTO/archived/LDAP-Implementation-HOWTO/pamnss.html

 

confd 笔记

confd 配置文件:

 

有时候,我们不想在confd启动命令中写很长的参数,那么可以通过 -config-file 来指定配置文件,如果你喜欢将配置文件的位置定义到 /etc/confd/confd.toml ,那么一个参数也不需要,因为,这就是默认搜索的配置文件

一个confd.toml 的示例:

 

一个conf.d/upstream.toml

其中:

  1. prefix 就是要(递归)watch的结点,watch的返回值是变化结点的原值和新值
  2. keys是当发生更新时从哪些结点获取数据(来渲染模板),这里的结点必然是prefix下的,不能是prefix外部的,所以,如果期望变更不会被立即触发,而是一组变更完成后才被触发,这里是做不到的;比如: 期望同一时间更新多个upstream,而只重启一次nginx,这里做不到;除非自己实现,自己实现也要考虑很多东西,如:模板渲染如何实现?
  3. watch总是递归的,这个代码中写死的,没得配
  4. 这里的prefix最好从confd的根开始,不要指望和confd.toml中的prefix拼接使用; 如果 confd.tomal 中的prefix 是 /sa  而upstream.toml 中的prefix是 /nginx, 则-onetime执行时可以看到预期的效果(生成了期望的目标配置文件),但是watch的时候却不能达到预期的效果;非常怀疑这是个bug,因为,confd启动的时候可以渲染出来正确的目标配置文件(参考了confd.toml 中的prefix),后续watch的时候却没有参考confd.toml 中的prefix,所以自然watch不到了:tcpdump部分截图如下:
    初始渲染的请求:

    watch的请求:

模板文件示例:

注意:

  1. 模板中的指令,默认会导致生成的文件中出现多余的空行的,解决办法就是使用 -}}
  2. 模板中可以构造变量(如:通过printf拼接字符串)
  3. 参考: https://github.com/kelseyhightower/confd/blob/master/docs/templates.md

 

watch的实现:

  1. 查询请求中,wait参数为true就是watch,wait可以指定waitIndex,当然也可以不指定,不指定的话逻辑比较简单,就是有变化就响应;如果指定的waitIndex已经发生过,则直接返回曾经的变化结果(这是历史上指定版本的值,可能不是现在的);如果waitIndex是下下次的版本号,则下次变化将不会被感知到
  2. wait可以递归也可以不递归,通过参数recursive指定

 

关于linux下的capability

Linux的capability深入分析

从编程的角度深入分析了linux下capability的概念,相关工具 libcap

学以致用:

Docker容器往往被剥夺了很多能力,如此在容器启动之后想做一些能力之外的事情该咋办?其实,容器毕竟是容器,和虚拟机是有区别的,我们可以可以限制容器内进程的能力,我们也可以把一个具有超能力的进程放到容器里面执行,这样就可以做一些原本容器没有能力做到的事情,比如: docker exec –privileged … 。

如下图:

结论: 我们不担心容器是在非特权模式下启动的,只要我们想要权限,就可以通过某种方式(如: –privileged)将一个特权进程放到容器里面做特权的事情

etcd 的访问控制

https://coreos.com/etcd/docs/latest/auth_api.html

auth enable 之前必须添加root用户,添加时设置密码:

开启认证:

添加一个非特权账号:(注意,这时候就需要有权限的用户来操作了)

查看有哪些账号:

添加角色:

给角色添加能力:

通过 –help 查看用法:

注意,这里只添加了 /test1 的读写权限,不包含其子目录(文件),如果需要包含,请这么写:

查看有哪些角色了:

查看指定角色的权限:

将用户添加到角色:

查看用户拥有哪些角色:

列出etcd中的所有key:(-p 选项在目录的后面添加 /)

关于用户的更多操作: