本节书摘来自华章出版社《ansible权威指南 》一书中的第1章,第1.5节,李松涛 魏 巍 甘 捷 著更多章节内容可以访问云栖社区“华章计算机”公众号查看。
ansible主推的卖点是其无需任何daemon维护进程即可实现相互间的通信,且通信方式是基于业内统一标准的安全可靠的ssh安全连接。同时因为ssh是每台linux主机系统必装的软件,所以ansible无需在远程主机端安装任何额外进程,即可实现agentless(无客户端),进而助力其实现去中心化的思想。尽管稳定、快速、安全的ssh连接是ansible通信能力的核心,但ssh的连接效率一直被诟病,所以ansible的通信方式和效率在过去的数年中也在不停地改变和提高。基于以上认识,我们先来了解ansible ssh的工作机制,再来回顾其发展史。
1.?ansible ssh工作机制
ansible执行命令时,通过其底层传输连接模块,将一个或数个文件,或者定义一个play或command命令传输到远程服务器/tmp目录的临时文件,并在远程执行这些play/comand命令,然后删除这些临时文件,同时回传整体命令执行结果。这一系列操作在未来的ansible版本中会越来越简单、直接,同时快速、稳定、安全。通过了解其工作机制及其一直以来秉承的去中心化思想,我们可以总结,ansible是非c/s架构,自身没有client端,其主要特点如下。
无客户端,只需安装ssh、python即可,其中python建议版本为2.6.6以上。
基于openssh通信,底层基于ssh协议(windows基于powershell)。
支持密码和ssh认证,因可通过系统账户密码认证或公私钥认证,所以整个过程简单、方便、安全。建议使用公私钥方式认证,因为密码认证方式的密码需明文写配置文件,虽然配置文件可加密,但会增加ansible使用的复杂度。
支持windows,但仅支持客户端,服务端必须是linux系统。
如ansible官方介绍,如上特性是希望实现以下最终目标:
clear(简易):yaml语法,python语言编写,易于管理,api简单明了;
fast(敏捷):快速学习,设置简单,无需任何第三方软件;
complete(全面):配置管理、应用部署、任务编排等功能集于一身,丰富的内置模块满足日常功能所需;
eff?icient(高效):没有额外软件包消耗系统性能;
secure(安全):没有客户端,底层基于openssh,保证通信的安全可靠性。
2.?ansible通信方式发展历程
ansible底层基于安全可靠的ssh协议通信,但一直被人们诟病于其效率,通信功能作为ansible最核心的功能之一,官方也一直在做改进。本节我们来了解ansible通信发展史。
(1)paramiko通信模块
最初,ansible只使用paramiko实现底层通信功能,但是paramiko只是python语法的一个第三方库,发展速度远不及openssh。同时,paramiko的性能和安全性较openssh稍逊一筹(在笔者眼里)。
在后续发布的新版本中,ansible仍继续兼容paramiko,甚至在诸如rhel 5/6等不支持controlpersist(只在openssh 5.6+版本中支持)的系统中封装其为默认通信模块。
(2)openssh
从ansible 1.3版本开始,ansible默认使用openssh连接实现各服务器间通信,以支持controlpersist(持续管理)。ansible从0.5版本起即支持openssh功能,但直到1.3版本开始才将其设置为默认。
多数本地ssh配置参数,诸如hosts、公私钥文件等是默认支持的,但如果希望通过非默认的22端口运行命令等操作,则需要在inventory文件中配置ansible_ssh_port的值。openssh相比paramiko更快、更可靠。
(3)加速模式
据官网介绍:开启加速模式后ansible通信速度有质的提升,是开启controlpersist后的ssh的2~6倍,是paramiko通信速度的10倍。
尽管加速模式对ad-hoc命令不友好,但是playbook通过加速模式会收到更高的性能。加速模式抛弃ssh多次连接的方式,通过ssh初始化后,带着aes key的初始化连接信息通过特定的端口(默认5099,但可配置)执行命令传输文件。使用加速模式唯一需要的额外包是python-keyczar,如此一来,几乎所有的常规模块openssh/paramiko均工作在加速模式,但如下使用sudo的情况例外:
1)sudoers文件需要关闭其中的requiretty功能,注释掉或者设置每个用户的默认值为username !requiretty。sudoers的man文档说明如下。
2)开启加速模块必须事先设置sudo文件nopasswd配置,禁用sudo后的password交互认证过程。加速模式相对openssh可以提供2~4倍的性能提升(尤其对于文件传输功能),在playbook的应用中可以通过增加配置开关来实现。
其中的端口也可以在ansible.cfg中单独配置。
加速模式是现在已经被废弃的fireball模式的进化版,类似于ansible加速通信方式,但需控制机事先安装zeromq服务(这与ansible简单、无依赖、无daemon的理念是相违背的),并且一点也不支持sudo操作。
(4)faster openssh in ansible 1.5+
ansible 1.5+版本中的openssh有了非常大的改进,旧版本中实现方式是复制文件至远程服务器后运行,然后删除这些临时文件,而新版本的替代方案是通过openssh发送执行命令,将所有操作附带在ssh连接过程中同步实现。该方式只在ansible 1.5+版本有效,且需在/etc/ansible/ansible.cfg的[ssh_connection]区域开启pipelining=true功能。
关于加速模式我们还需要关注如下内容:
pipelining=true需结合sudo的requiretty配置方可生效,请确保/etc/sudoers的defaults requiretty为注释状态。绝大多数现有流行系统默认开启该选项。
在mac osx、ubuntu、windows的cygwin或其他流行os最好选择5.6以上的openssh版本,这些版本对controlpersist有更友好的支持。
如ansible运行的主机系统是rhel或centos,然而希望升级当前openssh到最新版本以支持faster/persistent连接模式,可以通过yum update openssh升级最新版本。
本节内容可以通过如图1-1所示的ansible通信方式发展史鱼骨图来概括,从最开始的paramiko,后来初步演变为openssh,加速模式官方推荐pipelining方式。

在了解ansible通信原理及发展史后,我们进一步学习ansible自身的发展史。要知道,在chef、puppet、saltstack、fabric等自动化工具群雄争霸的市场背景下,ansible依然能够杀出重围,在github取得如此惊人成就,并且被红帽官方收购,其发展史不得不让人刮目相看。