本节书摘来自华章出版社《Ansible权威指南 》一书中的第1章,第1.4节,李松涛 魏 巍 甘 捷 著更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.4 Ansible是如何工作的
Ansible没有客户端,因此底层通信依赖于系统软件,Linux系统下基于OpenSSH通信,Windows系统下基于PowerShell,管理端必须是Linux系统,使用者认证通过后在管理节点通过Ansible工具调用各应用模块将指令推送至被管理端执行,并在执行完毕后自动删除产生的临时文件。Ansible具体的工作机制官方有专栏介绍https://www.ansible.com/how-ansible-works,但整体稍过简略。我们参考从官网视频中的截图来详细了解下其工作方式,如图1-1所示。根据Ansible使用过程中的不同角色,我们将其分为:
使用者
Ansible工具集
作用对象
(1)使用者
如图1-1中Ansible工作机制所示,Ansible使用者来源于多种维度,图中为我们展示了4种方式:
第一种方式:CMDB(Conf?iguration Management Database,配置管理数据库),CMDB存储和管理着企业IT架构中的各项配置信息,是构建ITIL项目的核心工具,运维人员可以组合CMDB和Ansible,通过CMDB直接下发指令调用Ansible工具集完成操作者所希望达成的目标;
第二种方式:PUBLIC/PRIVATE方式,Ansible除了丰富的内置模块外,同时提供丰富的API语言接口,如PHP、Python、PERL等多种当下流行语言,基于PUBLIC(公有云)/PRIVATE(私有云),Ansible以API调用的方式运行;
第三种方式:USERS直接使用Ad-Hoc临时命令集调用Ansible工具集来完成任务执行,Ad-Hoc将在第3章有详细介绍;
第四种方式:USERS预先编写好的ANSIBLE PLAYBOOKS,通过执行Playbooks中预先编排好的任务集按序完成任务执行。
(2)Ansible工具集
ansible命令是Ansible的核心工具,ansible命令并非自身完成所有的功能集,其只是Ansible执行任务的调用入口,大家可心理解为“总指挥”,所有命令的执行通过其“调兵遣将”最终完成。ansible命令共有哪些兵将可供使唤呢?大家看中间绿色框中有INVENTORY(命令执行的目标对象配置文件)、API(供第三方程序调用的应用程序编程接口)、MODULES(丰富的内置模块)、PLUGINS(内置和可自定义的插件)这些可供调遣。
(3)作用对象
Ansible的作用对象,不仅仅是Linux和非Linux操作系统的主机(HOSTS),同样也可以作用于各类公有云/私有云,商业和非商业设备的网络设施。
![41740030fb9152246ce2d7a551f8b3c52db408a1](https://i-blog.csdnimg.cn/blog_migrate/1846a04cf74907d282294b466c865052.png)
同样,如果我们按Ansible工具集的组成来讲,由图1-1可以看出Ansible主要由6部分组成。
ANSIBLE PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件;
INVENTORY:Ansible管理主机的清单;
MODULES:Ansible执行命令的功能模块,多数为内置的核心模块,也可自定义;
PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用。
API:供第三方程序调用的应用程序编程接口;
ANSIBLE:该部分图中表示的不明显,组合INVENTORY、API、MODULES、PLUGINS的绿框大家可以理解为是Ansible命令工具,其为核心执行工具;
Ansible执行任务,这些组件相互调用关系如图1-2所示:
![0cb61e1c42ce1246fef1c875c6f4c10a345a02fb](https://i-blog.csdnimg.cn/blog_migrate/e84cadc0fb87b4fa1f0697a53b37128b.png)
图1-2 Ansible组件调用关系
使用者使用Ansible或Ansible-playbook(会额外读取Playbook文件)时,在服务器终端输入Ansible的Ad-Hoc命令集或Playbook后,Ansible会遵循预先编排的规则将Playbooks逐条拆解为Play,再将Play组织成Ansible可识别的任务(Task),随后调用任务涉及的所有模块(Module)和插件(Plugin),根据Inventory中定义的主机列表通过SSH(Linux默认)将任务集以临时文件或命令的形式传输到远程客户端执行并返回执行结果,如果是临时文件则执行完毕后自动删除。