自动化运维-Ansible01-Ansible基础入门
- Ansible官方地址:https://docs.ansible.com/
- GitHub地址:https://github.com/ansible/ansible/
- Ansible中文权威地址:http://www.ansible.com.cn/
- ansible插件:https://docs.ansible.com/ansible/latest/plugins/
1、Ansible概述
1.1、Ansible是什么
- Ansible是近年越来越火的一款运维自动化工具,其主要功能是帮忙运维实现IT工作的自动化、降低人为操作失误、提高业务自动化率、提升运维工作效率,常用于软件部署自动化、配置自动化、管理自动化、系统化系统任务、持续集成、零宕机平滑升级等。它丰富的内置模块(如acl、command、shell、cron、yum、copy、file、user等,多达569个)和开放的API接口,同时任何遵循GPL协议的企业或个人都可以随意修改和发布自己的版本。
- Ansible在其官网上定义如下:Ansible is a radically simple IT automation engine。即Ansible是一款极其简单的IT自动化工具。但Ansible的功能却非常不简单,完全没有因为使用方式上的简单而缩水,其自身内置模块的数量达500多个,而且还在快速地增加新模块,以下是这些模块的覆盖面的大致分类。
- 系统层:支持的系统有Linux、Windows、AIX等,对应的模块有acl、cron、pip、easy_install、yum、authorized_key等大量的内置模块。
- 知名第三方平台支持:支持的云平台有AWS、Azure、Cloudflare、Openstack、Google、Linode、Digital Ocean等,对应的模块有ec2、azure_rm_deployment、cloudflare_dns、clc_aa_policy、glance_image、gc_storage、digital_ocean等。
- 虚拟化:VMware、Docker、Cloudstack、LXC、Openstack等,对应的模块有vmware_vmkernel、docker、cs_account、lxc_container、glance_image等。
- 商业化硬件:F5、ASA、Citrix、Eos等,对应的模块有bigip_facts、asa_acl、netscaler、eos_command等。
- 系统应用层:Apache、Zabbix、Rabbitmq、SVN、GIT等,对应的模块有apache2_module、zabbix_group、rabbitmq_binding、subversion、git等。
- GitHub上有众多开源爱好者为Ansible贡献功能模块,这些模块完全可以满足日常工作所需。官方对模块也从使用者角度进行详细分类,如Cloud Modules(云主机模块)、Clustering Modules(集群模块)、Commands Modules(命令模块)、Database Modules(数据库模块)等。详细的模块分类可参考官方模块列表:http://docs.ansible.com/ansible/modules_by_category.html
- Web界面是一款功能完善的管理工具的必备功能,Tower是Ansible的Web化管理界面,但免费版的容量只有10台主机,付费版则无容量限制。基于此原因,本书会介绍搭建属于自己的Web化管理界面的方法,并代码全开源,具体地址大家可从GitHub上下载:https://github.com/stanleylst/ansibleUI
1.2、为什么选择Ansible
- 选择Ansible的原因主要有如下几个方面:
- Ansible完全基于Python开发,而DevOps在国内已然是一种趋势,Python被逐步普及,运维人员自己开发工具的门槛逐步降低,得益于此,方便对Ansible二次开发。
- Ansible丰富的内置模块,甚至还有专门为商业平台开发的功能模块,近600个模块完全可以满足日常功能所需。
- 在Ansible去中心化概念下,一个简单的复制操作即可完成管理配置中心的迁移。
- Agentless(无客户端),客户端无需任何配置,由管理端配置好后即可使用,这点非常诱人。在第10章会介绍如何部署配置Windows系统的主机端,用后会有深切的感受。
2、Ansible的工作原理
- Ansible没有客户端,因此底层通信依赖于系统软件,Linux系统下基于OpenSSH通信,Windows系统下基于PowerShell。
- 管理端必须是Linux系统,使用者认证通过后在管理节点通过Ansible工具调用各应用模块将指令推送至被管理端执行,并在执行完毕后自动删除产生的临时文件。
2.1、Ansible架构
- Ansible架构图。
- Ansible主要由5部分组成:
- host inventory:Ansible管理的主机清单。
- ansible playbooks:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件。
- modules:Ansible执行命令的功能模块,多数为内置的核心模块,也可自定义。
- plugins:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用。
- ansible:组合INVENTORY、API、MODULES、PLUGINS的绿框大家可以理解为是Ansible命令工具,其为核心执行工具。
- 根据Ansible使用过程中的不同角色,将其分为:
- 使用者
- 第一种:CMDB(Configuration Management Database,配置管理数据库),CMDB存储和管理着企业IT架构中的各项配置信息,是构建ITIL项目的核心工具,运维人员可以组合CMDB和Ansible,通过CMDB直接下发指令调用Ansible工具集完成操作者所希望达成的目标。
- 第二种:PUBLIC/PRIVATE方式,Ansible除了丰富的内置模块外,同时提供丰富的API语言接口,如PHP、Python、PERL等多种当下流行语言,基于PUBLIC(公有云)/PRIVATE(私有云),Ansible以API调用的方式运行。
- 第三种:USERS直接使用Ad-Hoc临时命令集调用Ansible工具集来完成任务执行。
- 第四种:USERS预先编写好的ANSIBLE PLAYBOOKS,通过执行Playbooks中预先编排好的任务集按序完成任务执行。
- Ansible工具集
- ansible命令是Ansible的核心工具,ansible命令并非自身完成所有的功能,其只是Ansible执行任务的入口,可以理解为“总指挥”,所有命令的执行通过其“调兵遣将”最终完成。
- ansible命令共有哪些兵将可供使唤呢?有Inventory(主机清单)、Core Modules(核心模块)、Custom Modules(自定义模块)、PLUGINS(内置和可自定义的插件)这些可供调遣。
- 作用对象
- Ansible的作用对象,不仅仅是Linux和非Linux操作系统的主机(HOSTS),同样也可以作用于各类公有云/私有云,商业和非商业设备的网络设施。
- 使用者
2.2、Ansible工作流程
- Ansible执行任务,这些组件相互调用关系如图1-2所示:
- 使用者使用Ansible或Ansible-playbook(会额外读取Playbook文件)时,在服务器终端输入Ansible的Ad-Hoc命令集或Playbook后,Ansible会遵循预先编排的规则将Playbooks逐条拆解为Play,再将Play组织成Ansible可识别的任务(Task),随后调用任务涉及的所有模块(Module)和插件(Plugin),根据Inventory中定义的主机列表通过SSH(Linux默认)将任务集以临时文件或命令的形式传输到远程客户端执行并返回执行结果,如果是临时文件则执行完毕后自动删除。
2.3、Ansible特性
- Ansible的并发特性
- 建议并发数配置为CPU核数偶数倍。如4Cores 8GB的服务器,建议最多并发20个线程。
- Ansible的幂等性
- 定义所期望的目标状态。
- 操作是幂等的。(幂等,就是命令执行多次的结果相同)
- ansible是“以结果为导向的”,指定一个“目标状态”,ansible会自动判断,“当前状态”是否与“目标状态”一致。
- 如果一致,则不进行任何操作。如果不一致,那么就将“当前状态”变成“目标状态”,这就是”幂等性”。
- “幂等性”可以保证重复的执行同一项操作时,得到的结果是一样的。
- ansible是“以结果为导向的”,指定一个“目标状态”,ansible会自动判断,“当前状态”是否与“目标状态”一致。
3、Ansible通信发展史
- 尽管稳定、快速、安全的SSH连接是Ansible通信能力的核心,但SSH的连接效率一直被诟病,所以Ansible的通信方式和效率在过去的数年中也在不停地改变和提高。
3.1、Ansible SSH工作机制
- Ansible执行命令时,通过其底层传输连接模块,将一个或数个文件,或者定义一个Play或Command命令传输到远程服务器/tmp目录,并在远程执行这些Play/Comand命令,然后删除这些临时文件,同时回传整体命令执行结果。
- 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(全面):配置管理、应用部署、任务编排等功能集于一身,丰富的内置模块满足日常功能所需;
- Efficient(高效):没有额外软件包消耗系统性能;
- Secure(安全):没有客户端,底层基于OpenSSH,保证通信的安全可靠性。
3.2、Ansible通信方式发展历程
- Ansible底层基于安全可靠的SSH协议通信,但一直被人们诟病于其效率,通信功能作为Ansible最核心的功能之一,官方也一直在做改进。
1、Paramiko通信模块
- 最初,Ansible只使用Paramiko实现底层通信功能,但是Paramiko只是Python语法的一个第三方库,发展速度远不及OpenSSH。同时,Paramiko的性能和安全性较OpenSSH稍逊一筹(在笔者眼里)。
- 在后续发布的新版本中,Ansible仍继续兼容Paramiko,甚至在诸如RHEL5/6等不支持ControlPersist [3] (只在OpenSSH5.6+版本中支持)的系统中封装其为默认通信模块。
2、OpenSSH
- 从Ansible1.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。
- (2)开启加速模块必须事先设置sudo文件NOPASSWD配置,禁用sudo后的PASSWORD交互认证过程。加速模式相对OpenSSH可以提供2~4倍的性能提升(尤其对于文件传输功能),在Playbook的应用中可以通过增加配置开关来实现。
- hosts: all accelerate: true accelerate_port: 5099 [...]
- 其中的端口也可以在ansible.cfg中单独配置。
[accelerate] accelerate_port = 5099
4、Faster OpenSSH in Ansible1.5+
- Ansible1.5+版本中的OpenSSH有了非常大的改进,旧版本中实现方式是复制文件至远程服务器后运行,然后删除这些临时文件,而新版本的替代方案是通过OpenSSH发送执行命令,将所有操作附带在SSH连接过程中同步实现。
- 该方式只在Ansible1.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连接模式,可以通过yumupdate openssh升级最新版本。
- 本节内容可以通过如图1-1所示的Ansible通信方式发展史鱼骨图来概括,从最开始的Paramiko,后来初步演变为OpenSSH,加速模式官方推荐Pipelining方式。
1
# #