目录


前言

本文主要介绍了ansible中一些重要概念和重要特性。并不能cover住ansible的全部特性以及细节。


预备知识


概述

ansible是一个IT自动化工具。可以用于:

ansible具有如下特点:


ansible架构

ansible的整体架构如下图所示:

ansible-arch.webp

ansible执行任务的流程,大致如下:

ansible-execution.png


额外说明

1,ansible有两种任务执行模式:

2,尽量使用ansible自带的模块,而不是shell脚本,因为ansible的很多模块提供了幂等判断机制

3,模块和插件的区别:


快速上手教程

1,安装ansible:

2,ansible按照如下的优先级顺序查找配置文件

3,ansible配置文件:

(下面仅列出了少数参数)

4,inventory文件:

既可以使用静态inventory文件,也可以使用动态inventory。使用动态inventory的好处是:可以根据其它系统(比如,CMDB、LDAP等)动态地生成主机清单,避免产生 需要在多个地方维护服务器列表 的情况。

动态inventory是一个可执行程序,ansible会创建一个子进程执行这个程序,然后从该子进程的标准输出获取主机清单。因此,可以用任何语言编写动态inventory程序,只要该程序满足ansible的规定即可。(更多关于如何编写动态inventory的细节,请移步参考文档)

可以在inventory中对主机进行分组。ansible可以同时操作属于一个组的多台主机。在定义主机的时候,可以为主机指定主机变量。也可以为组指定组变量(相当于同时为组内的所有主机指定变量)。这些变量可以被插件(比如,连接插件)、模块等使用。

下面是一个非常简单的inventory:

5,执行ad-hoc任务:

使用ansible命令,执行ad-hoc任务,其使用方法是:

其中:

比如,使用yum模块,在所有主机上安装最新版本的httpd-tools:

ansible内建了几百个模块。可以使用ansible-doc -l列出所有的模块。还可以使用ansible-doc -s <module_name>查看模块的用法。


playbook

playbook是由一个或多个play组成的列表。play的目标是:将一组主机映射到若干个预先好定义的角色上(角色中包含要调用的任务、要使用的变量、要运行的动作等)。playbook通过编排play,完成复杂的功能。

一个play由以下部分组成:

下面是一个例子:


facts

可以通过setup模块,采集远程主机的基础信息(比如,硬件、操作系统等信息),这些信息会被保存到ansible_facts变量中。

在使用playbook的时候,facts采集是默认开启的。但是,由于该操作比较耗时,所以在不需要主机基础信息的情况下,可以考虑关闭采集。也可以对采集结果进行缓存。

比如,可以通过下面的命令采集远程主机的所有IPV4地址:


role

角色是一种 基于已知的文件结构,自动地加载特定的vars_file、tasks和handlers的 方式。通过使用角色对内容进行分组,可以方便地进行复用。

下面展示了 角色目录结构

需要说明的是:tasks、handlers、vars等子目录,都不是必须的。当没用到它们的时候,可以不存在。

下面的例子中,定义了一个叫example的角色:

在这个例子中,角色会根据远程主机的操作系统类型,导入相关的任务。

(import_tasks用于导入任务列表)

ansible配置文件中roles_path参数是冒号分隔的路径列表,ansible会去这些路径下寻找角色。比如:

可以通过play的roles选项使用角色:


条件选择

可以通过when语句实现:在某些条件满足的情况下,才执行任务或使用角色。使用when语句非常简单,并且在when语句中,可以使用jinja2表达式。

比如:

在这个例子中:只有当远程主机的操作系统类型是Debian时,才执行关机命令。

更多关于条件选择的细节,可以查看官方文档


循环

可以通过循环实现:使用不同的参数,多次执行同一个任务。比如,向远程主机批量添加用户:

更多关于循环的细节,可以查看官方文档


关于大规模集群的一些思考

当集群规模变大的时候,主控机的压力就会随之增大,因此,需要找到一些方式,降低主控机的压力,从而避免出现性能瓶颈,下面是博主的一些方案:


异步执行任务

ansible支持异步执行任务,也就是:在将任务下发之后,不再保持连接,而是每隔一段时间轮询一次执行结果,直到任务完成。

想要让任务异步执行,需要在task中,加入两个参数:async和poll。

其中:

比如:

如果想要更方便的查看轮询结果,可以使用async_status模块,比如:

在这个例子中:

第一个任务是一个异步任务,其执行结果被注册到了job_sleeper变量中。

第二个任务使用async_status模块轮询第一个任务的执行结果,并返回轮询结果。最多轮询30次。


ansible-pull

ansible默认使用推模式。而asible-pull则是使用拉模式。

其原理是:去指定的VCS源上拉取playbook,然后在本机执行。比如:

其中:

因为VCS可以做到水平扩展,所以,ansible-pull也可以做到无限的水平扩展。

通常把ansible-pull与crontab一起使用,这样就可以做到:定期地在本地执行playbook。


参考文档


TODO