Ansible 架构
Ansible 是一个非常简单的 IT 自动化引擎,它可以自动化云配置、配置管理、应用程序部署、服务内编排以及许多其他 IT 需求。
从一开始就为多层部署而设计,Ansible 通过描述所有系统如何相互关联来建模您的 IT 基础设施,而不仅仅是每次管理一个系统。
它不使用代理,也不使用额外的自定义安全基础设施,因此易于部署 - 最重要的是,它使用一种非常简单的语言(YAML,以 Ansible Playbook 的形式),使您可以用接近纯英语的方式描述您的自动化作业。
在本节中,我们将为您快速概述 Ansible 的工作原理,以便您了解各个部分是如何组合在一起的。
模块
Ansible 的工作原理是连接到您的节点并将名为“Ansible 模块”的脚本推送到它们。大多数模块接受描述系统所需状态的参数。然后,Ansible 执行这些模块(默认通过 SSH),并在完成后将其删除。您的模块库可以驻留在任何计算机上,并且不需要服务器、守护程序或数据库。
您可以 编写自己的模块,但您应该首先考虑 您是否应该这样做。通常,您会使用您喜欢的终端程序、文本编辑器,可能还会使用版本控制系统来跟踪对内容的更改。您可以使用任何可以返回 JSON 的语言(Ruby、Python、bash 等)编写专用模块。
模块实用程序
当多个模块使用相同的代码时,Ansible 将这些函数存储为模块实用程序,以最大限度地减少重复和维护。例如,解析 URL 的代码是 lib/ansible/module_utils/url.py
。您也可以 编写自己的模块实用程序。模块实用程序只能用 Python 或 PowerShell 编写。
插件
插件 增强了 Ansible 的核心功能。虽然模块在目标系统中以单独的进程执行(通常这意味着在远程系统上),但插件在控制节点上,在 /usr/bin/ansible
进程内执行。插件为 Ansible 的核心功能提供选项和扩展 - 转换数据、记录输出、连接到清单等等。Ansible 附带了许多方便的插件,您可以轻松地 编写自己的插件。例如,您可以编写一个 清单插件 来连接到任何返回 JSON 的数据源。插件必须用 Python 编写。
清单
默认情况下,Ansible 将其管理的机器表示在一个文件(INI、YAML 等)中,该文件将您所有受管机器放在您自己选择的组中。
要添加新机器,不涉及额外的 SSL 签名服务器,因此永远不会因为模糊的 NTP 或 DNS 问题而无法决定为什么特定机器没有连接上。
如果您的基础设施中有另一个真实来源,Ansible 也可以连接到它。Ansible 可以从 EC2、Rackspace、OpenStack 等来源提取清单、组和变量信息。
以下是一个纯文本清单文件的示例
[webservers]
www1.example.com
www2.example.com
[dbservers]
db0.example.com
db1.example.com
列出清单主机后,可以将变量分配给它们,在简单的文本文件(在名为“group_vars/”或“host_vars/”的子目录中)或直接在清单文件中。
或者,如前所述,使用动态清单从 EC2、Rackspace 或 OpenStack 等数据源中提取您的清单。
Playbook
Playbook 可以精细地编排您的基础设施拓扑的多个部分,并非常详细地控制每次要处理的机器数量。这是 Ansible 开始变得最有趣的地方。
Ansible 的编排方法是经过微调的简单性,因为我们认为您的自动化代码多年后应该对您有完美的意义,并且应该很少需要记住特殊的语法或功能。
以下是一个简单的 Playbook 的示例
---
- hosts: webservers
serial: 5 # update 5 machines at a time
roles:
- common
- webapp
- hosts: content_servers
roles:
- common
- content
Ansible 搜索路径
模块、模块实用程序、插件、Playbook 和角色可以存在于多个位置。如果您编写自己的代码来扩展 Ansible 的核心功能,您可能在 Ansible 控制节点上的不同位置有多个具有相似或相同名称的文件。搜索路径确定 Ansible 将在任何给定的 Playbook 运行时发现和使用的文件。
Ansible 的搜索路径在运行时会逐渐增加。当 Ansible 找到在给定运行中包含的每个 Playbook 和角色时,它会将与该 Playbook 或角色相关的任何目录附加到搜索路径。这些目录在运行期间保持在范围内,即使在 Playbook 或角色执行完成后也是如此。Ansible 按此顺序加载模块、模块实用程序和插件
与命令行上指定的 Playbook 相邻的目录。如果您使用
ansible-playbook /path/to/play.yml
运行 Ansible,则 Ansible 会附加这些目录(如果它们存在)/path/to/modules /path/to/module_utils /path/to/plugins
与命令行上指定的 Playbook 静态导入的 Playbook 相邻的目录。如果
play.yml
包含- import_playbook: /path/to/subdir/play1.yml
,则 Ansible 会附加这些目录(如果它们存在)/path/to/subdir/modules /path/to/subdir/module_utils /path/to/subdir/plugins
Playbook 引用的角色目录的子目录。如果
play.yml
运行myrole
,则 Ansible 会附加这些目录(如果它们存在)/path/to/roles/myrole/modules /path/to/roles/myrole/module_utils /path/to/roles/myrole/plugins
在
ansible.cfg
中指定为默认路径或由相关环境变量指定的目录,包括各种插件类型的路径。有关更多信息,请参阅 Ansible 配置设置。示例ansible.cfg
字段DEFAULT_MODULE_PATH DEFAULT_MODULE_UTILS_PATH DEFAULT_CACHE_PLUGIN_PATH DEFAULT_FILTER_PLUGIN_PATH
示例环境变量
ANSIBLE_LIBRARY ANSIBLE_MODULE_UTILS ANSIBLE_CACHE_PLUGINS ANSIBLE_FILTER_PLUGINS
作为 Ansible 发行版一部分的标准目录。
注意
用户指定目录中的模块、模块实用程序和插件将覆盖标准版本。这包括一些具有通用名称的文件。例如,如果您在用户指定的目录中有一个名为 basic.py
的文件,它将覆盖标准 ansible.module_utils.basic
。
如果您的用户指定目录中有多个具有相同名称的模块、模块实用程序或插件,则命令行中的命令顺序以及每个 Play 中包含项和角色的顺序将影响在该特定 Play 上找到和使用的模块、实用程序或插件。