番一、OP酱的自白
自从入了贵圈,每天需要强大的内心来维护混乱的线上,每天都是用浆糊一样的shell /python在糊墙补窟窿啊,感觉每天都是在和if else打交道啊,每次花牛鼻子劲写的脚本,下次来点新需求,能重用的部分居然少到不想再重用,很绝望啊,有木有?批量运行工具还是在lhck lhcp,每次一长串命令,各种转义各种烦躁啊,有木有?转义也就罢了,还时不时被信任关系之类的bulabula,爷是root?这是啥root啊!
番二、 ansible vs puppet vs saltstack
你一定不会屈服的,实际上很多人已经揭竿而起投笔从戎写出各种IT Automation Management Tool/System(ITAMS),甚至有人还遍尝百草,把经验写成了书(佩服!),我们要搞一个进来也是大势所趋,你真的不想扩容扩到睡着了。
你也一定听过很多ITAMS,那么你看好哪一个呢?所谓萝卜青菜各有所爱,呐,我来放一下我的选择理由:
首先,没有一个工具是能满足大家所有需求的,所以开发是more or less的事了,在选择的时候,我们的标准是:
1. 可作为批量执行工具
2. 可支持playbook,模块化
3. 容易上手,开发扩展容易
4. 在权限控制方面能很好的与目前的登陆授权管理系统结合
5. 社区活跃,有问题能查到解决办法
就playbook和模块化来说,puppet,saltstack和ansible半斤八两,就不细比了。
puppet有产品线已经在用,优点是历史悠久,比较成熟,在可远程可本地,功能强劲,不过这厮批量执行功能没得,为了批量执行个命令写个配置文件,好像有点大刀砍蚊子腿的感觉了,而且有客户端在,和授权系统结合比较麻烦。
saltstack和ansible都是python流的,而且就功能上来讲,两者也极为相似,不同之处是salt stack是有客户端的,并且execution模块还用0MQ实现了pub-sub,命令和执行结果因此可以高效并行传输,不过成也萧何败也萧何,第一个sub阶段(将querystring下发到所有机器,然后收集机器响应的阶段)太依赖与客户端返回了,如果客户端未能及时返回或未响应的话,playbook执行阶段可能会直接漏掉这部分机器而没有任何提示,这对于运维来说是不可接受的,要改造这个就得推掉saltstack的现有架构…算了吧。
与前两者比起来,ansible在特性上似乎并不抢眼,配置管理方面(playbook)绝对比不过老大哥puppet,批量执行方面也只是多线程,不像saltstack那么高大上,不过ansible搜索热度高出saltstack三倍多,显然靠的不是吹牛,至少,ansible至少不会悄悄的丢机器,这给了我们一个定心丸,而且仅依赖ssh,与登录授权管理系统天然集成,简单即有效,没有比这更美妙的事情了。
So, 让我们来尝尝Ansible吧!
番三、Ansible的说明书
三番一话 ansible
ansible是一个python package,是个完全的unpack and play软件,对客户端唯一的要求是有ssh有python,并且装了python-simplejson包,部署上简单到发指。
安装完成后,ansible套装里会有几个可执行命令,我们重点讲两个
ansible 是一个批量执行工具,可以理解为一个已经插件化的lh工具。
一个最简单的运行实例如下:
ansible 从hosts.txt中读取机器列表,并匹配其中机器名符合正则xcache06的机器,在其上执行date命令
再看一个:
和上一个相比,有一些变化。
· 首先,这个例子中,机器列表是从系统配置里自动得到的;
· 然后还多了个-m,指明了我们是在调用yum模块,实际上第一个例子中,module也是有的,只不过是默认的shell,我们可以不写而已;
· 最后 -a参数也有些特别,需要理解这些参数不难,执行ansible-doc yum就可以获得帮助:
三番二话 host-pattern
在上面的示例中,大家可能注意到了第一个参数,这个参数被称为host-pattern,主要用来从全量机器/分组列表中筛选出符合要求的机器列表。
之所以单独放出来讲,是因为在ansible命令中,host-pattern参数算是比较需要耗费记忆力的地方,并且我们也做了一点修改,大体介绍下:
”plain-example” 机器名或组名等于plain-example的机器
”~regex-excmple” 机器名或组名正则匹配regex-excmple的机器
”~regex-array[1-3]” 机器名或组名正则匹配regex-array[1-3]的机器【与官方版本有差异,官方版本有bug,查看网络文档时请关注】
”~regex-array[2]” 机器名或组名正则匹配regex-array的机器list中的第3个【为啥是[2]?程序员从零开始数….依赖hosts脚本返回,不要使用!!】
”~regex-array[1:2]” 机器名或组名正则匹配regex-array的机器list中的第2个【为啥是第2个?左闭右开+程序员从0开始….依赖hosts脚本返回,不要使用!!】
”pdl.relation;pdl.bmw” 获取pdl.relation和pdl.bmw的并集,逻辑”或“
”pdl.relation;&pdl.bmw” 获取pdl.relation和pdl.bmw的交集,逻辑”与“
”pdl.relation;!pdl.bmw” 获取属于pdl.relation但不属于pdl.bmw的机器集合,逻辑”非”
逻辑”或与非“可以与普通或正则规则一起使用,比如:
但是,需要注意的是,ansible的“逻辑操作”并不遵守典型的逻辑运算法则,处理的过程是:按分号切分 — 所有“非”组成排除集 — 所有“与”组成交集, — 所有“或”组成最终结果
官方程序支持从脚本获取机器和分组信息,我们利用此特性与公司内的运维管理系统进行了集成,小米的机器用一组tag来维护,对于每一个tag,我们都在cache中建立了对应的组,查询时请按照上述规则组装即可
比如,tagstr pdl.bmw_sbs.fe_srv.nginx 可以写成pdl.bmw;&sbs.fe;&srv.nginx ,关于这个脚本的书写方法和小米机器管理系统的相关介绍,可以参见“
如何写出自己的host脚本”一文。
更多ansible相关命令,请查看ansible -h
三番三话 ansible-shell
每次敲ansible xxx ,敲得多了,是不是也有些烦躁了?来试试ansible-shell吧!这个shell来自github,我们对他做了一些修改完善,美化输出,增加了后台日志,机器数实时显示,step by等实用功能,所有更改目前已merge进主干,来看看吧:
支持cd 确定操作集,支持内置模块命令和参数补全,是不是方便多了?
CentOS 默认没有装pip,运行自然失败,装一个吧:
等等,权限?没问题,加参数!
下载失败这事吧。。,算了,下一个话题!
呐,能不能切换到其它账号?
这个没解决是不好意思给大家用的。
作为一名SRE,手中自有千钧之力,一回车reboot一票机器,岂不是成千古恨?加个-p参数吧,每次run之前都确认下,是不是安全感多了好多?
敢不看清楚就回车的,都是真勇士,大家在y前还是先确认下参数好一些。
有人就烦了,说你截图太多了,到现在我还没明白基础使用呢。先系统讲讲呗!
行!
ansible-shell内置的命令主要有四个:
cd : 切换到指定的组/表达式筛选的机器集合上
list: 显示目前的机器集合,list groups 可以列出所有的组(对我们可能没啥用)
serial:运行时的并发度,默认是20
help: 顾名思义,他能生成简单的模块帮助信息,方便即时查询
不过上面大家显然看到了更多的命令,这些命令是怎么个用法呢,我打了一行参数进去,到底是谁去执行了 ?
是这样的:ansible-shell在启动时将所有的内置命令/ansible模块和参数列表等都加入自动补全中,在你敲完每个命令回车后,它会拿第一个参数判断你输入的是不是一个内置命令(cd/list/serial),是则执行;否则看他是不是一个ansible模块,是则运行ansible模块;否则,认为他是一个shell命令,举例来说,当你输入hostname -i的时候,你会发现他会报错,原因是有个ansible模块就叫hostname,如果你一定想运行shell的那个hostname,在前面加个!就可以了
那,我就想运行shell怎么办? 前面加个!就好
麻麻再也不用担心我的批量操作了
收队!下面我们迅速带过剩下的部分吧!
三番末
ansible套件中的其他工具:
ansible-doc 模块文档查看器,很有用,使用ansible -l 显示所有module列表,使用 ansible-doc <module_x>来查看module_x的详细文档,这里不做太多介绍
ansible-playbook 传说中的配置管理工具,如果你用过puppet或者saltstack,这个可以不用介绍了,如果你没用过,也没关系,花费20分钟看下
官方的Video。 掌握一件事情最好的办法就是使用它,你可以下载
官方的example来学习
ansible-galaxy 和三星没关系,你可以把他理解成ansible的pip,可以从galaxy.ansible.com下载官方收录的playbooks
ansible-pull 支持直接从git下载playbook执行,需要遵循其规定的目录格式,用处不是特别大,可以不关注
如果希望了解更多,请访问官方wiki主页和博客:
我想开发!
欢迎!
本人github上的地址为htps://github.com/iambocai,欢迎您共享和交流
为了方便大家快速了解代码结构,我以执行流程作为切入点给大家讲下代码结构。
ansible执行过程大体过程如下图,其中暖色调的代表已经模块化。
代码结构就是这个样子,对哪一块不满意,一起来改造吧!

- 如何利用ansible callback插件对执行结果进行解析
最近在写一个批量巡检工具,利用ansible将脚本推到各个机器上执行,然后将执行的结果以json格式返回来. 如下所示: # ansible node2 -m script -a /root/pyth ...
- 《Ansible权威指南》笔记(2)——Inventory配置
四.Inventory配置ansible通过Inventory来定义主机和组,使用时通过-i指定读取,默认/etc/ansible/hosts.可以存在多个Inventory,支持动态生成.1.定义主 ...
- useful Ansible commands
This article includes some useful Ansible commands. I will try to write blogs by English. You may wa ...
- 《Ansible权威指南》笔记(4)——Playbook
七.Playbook1.语法特性如下:(1)"---"首行顶格开始(2)#号注释(3)缩进统一,不同的缩进代表不同的级别,缩进要对齐,空格和tab不能混用(4)区别大小写,键值对k ...
- 《Ansible权威指南》笔记(3)——Ad-Hoc命令集,常用模块
五.Ad-Hoc命令集1.Ad-Hoc命令集通过/usr/bin/ansible命令实现:ansible <host-pattern> [options] -v,--verbose ...
- 《Ansible权威指南》笔记(1)——安装,ssh密钥登陆,命令
2016-12-23 读这本<Ansible权威指南>学习ansible,根据本书内容和网上的各种文档,以及经过自己测试,写出以下笔记.另,这本书内容很好,但印刷错误比较多,作者说第二版会 ...
- 自动化运维工具ansible部署以及使用
测试环境master 192.168.16.74webserver1 192.168.16.70webserver2 192.168.16.72安装ansiblerpm -Uvh http://ftp ...
- Ansible Ubuntu 安装部署
一.安装: $ sudo apt-get install ansible 二.配置: a.基本配置 $ cd /etc/ansible/ $ sudo cp hosts hosts_back 备份一个 ...
- Ansible 模块命令介绍
copy模块: 目的:把主控端/root目录下的a.sh文件拷贝到到指定节点上 命令:ansible 10.1.1.113 -m copy -a 'src=/root/a.sh dest=/tmp/' ...
- 用Vagrant和Ansible搭建持续交付平台
这是一个关于Vagrant的学习系列,包含如下文章: Vagrant入门 创建自己的Vagrant box 用Vagrant搭建Jenkins构建环境 用Vagrant和Ansible搭建持续交付平台 ...
随机推荐
- 2017 Multi-University Training Contest - Team 3 Kanade's sum hd6058
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6058 题目: Kanade's sum Time Limit: 4000/2000 MS (J ...
- Unity状态机的实现,以《塔防》为例
什么是有限状态机? 通俗点讲,有限状态机是:将对象的状态(攻击.闲置.晕眩)的实现代码,提取出来,封装成状态.由状态机负责在各个状态之间调度. 对象持有状态管理类(状态机)的引用,与具体的状态解耦. ...
- Laravel 学习记录
1.当配置 根目录没有指向/public 时 去掉www.blog.im/public 后的文件 需要把 public 文件夹里的..htaccess 文件放到 项目根目录.server.ph ...
- bind函数的作用
面向连接的网络应用程序分为客户端和服务器端.服务器端的执行流程一般为4步,客户端程序相对简单,一般需要两个步骤. 服务器端执行流程4步如下: (1)调用socket函数,建立一个套接字,该套接字用于接 ...
- tomcat 连接器优化
在$CATALINA_HOME/conf/server.xml配置文件中的Connetctor节点,和连接数相关的参数配置和优化. maxThreads Tomcat使用线程来处理接收的每个请求.这个 ...
- selenium 之定位方法
1 id 定位 driver.find_element_by_id() HTML 规定id 属性在HTML 文档中必须是唯一的.这类似于公民的身份证号,具有很强的唯一性 from selenium i ...
- mellanox RDMA RoCE
一:首先根据系统发行版本下载对应的驱动,下载地址如下: http://www.mellanox.com/page/products_dyn?product_family=26&mtag=lin ...
- 【c++ primer, 5e】设计Sales_data类 & 定义改进的Sales_data类
[设计Sales_data类] 1.考虑Sales_data类应该有那些接口. isbn.combine.add.read.print... 2.考虑如何使用这些接口. Sales_data tota ...
- mysql命令行创建数据库
create database publiccms; grant all privileges on publiccms.* to root@localhost identified by 'publ ...
- 照着官网来安装openstack pike之创建并启动instance
有了之前组件(keystone.glance.nova.neutron)的安装后,那么就可以在命令行创建并启动instance了 照着官网来安装openstack pike之environment设置 ...