如何使用Ansible 2.0 Python API

概览

Ansible 和 SaltStack 都提供了 Python 直接调用的API, 这方便了 Pythoner 对这些软件进行二次开发和整合, 此功能着实方便了不少, 比起 Python 代码中调用 shell 也略显专业!

然而 Ansible 在2.0版本后重构了大部分的代码逻辑, 启用了2.0版本之前的 Runner 和 Playbook 类, 使得广大同学之前的代码运行错误. 择日不如撞日, 今天中午对照官方的文档, 结合源代码, 对2.0版本之后的 Python API 做了下探究

<% if (page.comments){ %>

<%= __('comment') %>

<% if (theme.comment_provider == "facebook") { if (theme.facebook) { %> <%- partial('_partial/facebook_comment', {fbConfig: theme.facebook}) %> <% } %> <% } else if(config.disqus_shortname) { %>
<% } %>
<% } %>

利用let's encrypt为网站免费启用https

概览

Let’s Encrypt旨在为每个站点提供免费的基于SSL证书,以加速HTTP向HTTPS的过渡,恰逢上周HTTP2的发布,对于HTTPS的优化,其速度显著优于HTTP1.x(某些应用场景)

特点

  • 免费:任何站点都可以免费申请一个针对其域名的有效证书
  • 自动:证书的申请以及配置在web服务器上整个过程完全自动化, 并且支持后台更新
  • 安全:提供业内最新的安全技术和最好的实践
  • 透明:所有证书的签发与撤销记录均对需要调查的人员开放
  • 开放:自动化执行的发放与更新将遵循开放标准,并且允许自定义插件
  • 合作:对整个互联网都有益的社区行动, 不由任何一个组织控制
<% if (page.comments){ %>

<%= __('comment') %>

<% if (theme.comment_provider == "facebook") { if (theme.facebook) { %> <%- partial('_partial/facebook_comment', {fbConfig: theme.facebook}) %> <% } %> <% } else if(config.disqus_shortname) { %>
<% } %>
<% } %>

博客从Typecho迁移到hexo

前言

之前博客都是运行在wordpress/Typecho上面,这两种框架都是基于php编写,依赖于lnmp, 加之服务器网络有时不太稳定, 访问速度就时好时坏, 前段时间还被别人注入了php木马, 搞了很长时间才清理干净. 甚是头疼.

另外就是每当写博客发表时都要在重新排版, 于是索性换了hexo 其基于nodejs编写, 由markdown直接转换为纯静态的html, 访问速度会快一点, 安全等方面也不需要考虑太多. 本地编写结合github管理, 简直就是完美.

整体结构/流程:
本地—> github —> vps

本地推送到github后由github的webhook来触发vps的更新部署脚本, 于是首先就想到了ngx_lua, 在nginx配置一个url /hookdeploy 然后由lua来触发执行更新脚本.

<% if (page.comments){ %>

<%= __('comment') %>

<% if (theme.comment_provider == "facebook") { if (theme.facebook) { %> <%- partial('_partial/facebook_comment', {fbConfig: theme.facebook}) %> <% } %> <% } else if(config.disqus_shortname) { %>
<% } %>
<% } %>

Kubernetes技术研究容器监控监测

大部分的应用程序我们在部署的时候都会适当的添加监控,对于运行载体容器则更应该如此。kubernetes提供了 liveness probes来检查我们的应用程序。它是由节点上的kubelet定期执行的。

首先说一下Pod的整个生命阶段:

  • Pending:表示集群系统正在创建Pod,但是Pod中的container还没有全部被创建,这其中也包含集群为container创建网络,或者下载镜像的时间;
  • Running:表示pod已经运行在一个节点商量,并且所有的container都已经被创建。但是并不代表所有的container都运行,它仅仅代表至少有一个container是处于运行的状态或者进程出于启动中或者重启中;
  • Succeeded:所有Pod中的container都已经终止成功,并且没有处于重启的container;
  • Failed:所有的Pod中的container都已经终止了,但是至少还有一个container没有被正常的终止(其终止时的退出码不为0)
<% if (page.comments){ %>

<%= __('comment') %>

<% if (theme.comment_provider == "facebook") { if (theme.facebook) { %> <%- partial('_partial/facebook_comment', {fbConfig: theme.facebook}) %> <% } %> <% } else if(config.disqus_shortname) { %>
<% } %>
<% } %>

Kubernetes技术研究集群自动发现skydns

为什么要引入DNS

在kubernetes中每一个service都会被分配一个虚拟IP,每一个Service在正常情况下都会长时间不会改变,这个相对于pod的不定IP,对于集群中APP的使用相对是稳定的。但是Service的信息注入到pod目前使用的是环境变量的方式,并且十分依赖于pod(rc)和service的创建顺序,这使得这个集群看起来又不那么完美,于是kubernetes以插件的方式引入了DNS系统,利用DNS对Service进行一个映射,这样我们在APP中直接使用域名进行引用,避免了之前的变量泛滥问题,也避免了创建顺序的尴尬局面。

kubernetes中的DNS

kubernetes中以插件的方式使用skydns作为DNS服务器。并且引入了一个另外一个组件kube2sky用来创建和删除域名解析记录。它目前仅支持两种解析A记录、SRV记录,在集群中对于域名的创建遵循一个规则:

<% if (page.comments){ %>

<%= __('comment') %>

<% if (theme.comment_provider == "facebook") { if (theme.facebook) { %> <%- partial('_partial/facebook_comment', {fbConfig: theme.facebook}) %> <% } %> <% } else if(config.disqus_shortname) { %>
<% } %>
<% } %>

Kubernetes技术研究持久化存储

docker本身设计之初是用来执行一个app,抑或是一个应用程序,在其运行结束后,将销毁一切数据,但是这明显不是我们想要的,docker也想到了这个,因此其本身提供一个-v的参数,用来将外部的存储挂载到container中,用来保存我们的持久化的数据。kubernetes最为其集群管理工具,自然也想到了这些,而且还提供了更强大的功能,基于其插件化的设计,kubernetes针对volume的driver支持是十分丰富的。本文就简单描述几个driver的设计思想和使用方法:

<% if (page.comments){ %>

<%= __('comment') %>

<% if (theme.comment_provider == "facebook") { if (theme.facebook) { %> <%- partial('_partial/facebook_comment', {fbConfig: theme.facebook}) %> <% } %> <% } else if(config.disqus_shortname) { %>
<% } %>
<% } %>

Kubernetes技术研究资源限制

前言

kubernetes的调度算法仅仅会将新创建的资源调度到拥有足够CPU和内存的节点上,因此kubernetes为用户提供了两种方法来定义资源的限制。

资源限制

首先基于计算类的资源限制,称为resouce limit.
当指定一个pod时,可以指定每一个container可以使用多少CPU和RAM,当container拥有资源限制时,调度器可以调度出更加适合该pod运行的节点,并且针对资源的抢占也可以很好的控制。

资源的类型分为两个:CPU、memory

CPU的限制的CPU的核数比重,内存的最小单位是字节

从kubernetes源代码中可以看到关于资源限制的单位如下图:

<% if (page.comments){ %>

<%= __('comment') %>

<% if (theme.comment_provider == "facebook") { if (theme.facebook) { %> <%- partial('_partial/facebook_comment', {fbConfig: theme.facebook}) %> <% } %> <% } else if(config.disqus_shortname) { %>
<% } %>
<% } %>

Kubernetes技术研究Secret资源

前言

作为kubernetes中一个重要的资源secret,它的设计初衷是为了解决container在访问外部网络或外部资源时验证的问题,例如访问一个git仓库,连接一个数据库,设置一些密码配置等,需要额外验证的场景。它被作为一种资源的形式被设计,由kubernetes集群统一管理,从字面意思来看已经表现了敏感,安全等特性,因此集群对待这类资源的管理需要额外的保护,对其内容进行加密是十分有必要的。当前,如果集群中的某些几点被恶意攻击或泄露,那么对于secret的影响则只会影响到该节点上的一些数据安全,无可厚非,如果主节点被攻陷,那么….大家都懂。

<% if (page.comments){ %>

<%= __('comment') %>

<% if (theme.comment_provider == "facebook") { if (theme.facebook) { %> <%- partial('_partial/facebook_comment', {fbConfig: theme.facebook}) %> <% } %> <% } else if(config.disqus_shortname) { %>
<% } %>
<% } %>

Kubernetes资源创建yml语法

前言

在是用kubernetes中,我们对资源的创建大部分都是通过

1
kubelet create -f RESOURCE.yaml

刚开看的时候不免有一些迷茫,看不懂语法,不知道怎么写;今天本文就介绍一下kubernetes construct语法。

Construct语法其实就是由kubelet格式化成API的post data,提交给apiserver,因此这里支持yaml,json两种数据结构的文件。

<% if (page.comments){ %>

<%= __('comment') %>

<% if (theme.comment_provider == "facebook") { if (theme.facebook) { %> <%- partial('_partial/facebook_comment', {fbConfig: theme.facebook}) %> <% } %> <% } else if(config.disqus_shortname) { %>
<% } %>
<% } %> <% if (page.comments){ %>

<%= __('comment') %>

<% if (theme.comment_provider == "facebook") { if (theme.facebook) { %> <%- partial('_partial/facebook_comment', {fbConfig: theme.facebook}) %> <% } %> <% } else if(config.disqus_shortname) { %>
<% } %>
<% } %>