Ansible 架构

Ansible 是一款极其简单的 IT 自动化引擎,可自动化云配置、配置管理、应用程序部署、服务内编排以及许多其他 IT 需求。

Ansible 从一开始就针对多层部署进行了设计,它通过描述所有系统之间的相互关系来对你的 IT 基础架构进行建模,而不是一次只管理一个系统。

它不使用代理也不需要额外的自定义安全基础架构,因此易于部署 - 最重要的是,它使用一种非常简单的语言(YAML,以 Ansible 剧本的形式),允许你以接近普通英语的方式描述你的自动化作业。

在本节中,我们将快速概述 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 等数据源提取你的清单。

剧本

剧本可以精细地编排你的基础架构拓扑的多个部分,并对一次处理多少台机器进行非常详细的控制。这就是 Ansible 开始变得最有趣的地方。

Ansible 对编排的处理方法是精细调整的简单性,因为我们认为你的自动化代码应该在几年后对你来说仍然非常清晰,并且应该几乎不需要记住任何特殊语法或功能。

以下是一个简单的剧本的样子

---
- hosts: webservers
  serial: 5 # update 5 machines at a time
  roles:
  - common
  - webapp

- hosts: content_servers
  roles:
  - common
  - content

Ansible 搜索路径

模块、模块实用程序、插件、剧本和角色可以存放在多个位置。如果你编写了自己的代码来扩展 Ansible 的核心功能,你可能在 Ansible 控制节点上的不同位置有几个具有相同或类似名称的文件。搜索路径决定 Ansible 在任何给定剧本运行时将发现并使用哪些文件。

Ansible 的搜索路径在运行过程中逐渐增长。当 Ansible 找到给定运行中包含的每个剧本和角色时,它将向搜索路径追加与该剧本或角色相关的任何目录。这些目录在整个运行过程中保持在范围内,即使剧本或角色已完成执行也是如此。Ansible 按以下顺序加载模块、模块实用程序和插件

  1. 与命令行上指定的剧本相邻的目录。如果你使用 ansible-playbook /path/to/play.yml 运行 Ansible,则如果这些目录存在,Ansible 将追加这些目录

    /path/to/modules
    /path/to/module_utils
    /path/to/plugins
    
  2. 与由命令行上指定的剧本静态导入的剧本相邻的目录。如果 play.yml 包含 - import_playbook: /path/to/subdir/play1.yml,则如果这些目录存在,Ansible 将追加这些目录

    /path/to/subdir/modules
    /path/to/subdir/module_utils
    /path/to/subdir/plugins
    
  3. 由剧本引用的角色目录的子目录。如果 play.yml 运行 myrole,则如果这些目录存在,Ansible 将追加这些目录

    /path/to/roles/myrole/modules
    /path/to/roles/myrole/module_utils
    /path/to/roles/myrole/plugins
    
  4. 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
    
  5. 作为 Ansible 发行版的一部分提供的标准目录。

注意

用户指定目录中的模块、模块实用程序和插件将覆盖标准版本。这包括一些具有通用名称的文件。例如,如果你在用户指定目录中有一个名为 basic.py 的文件,它将覆盖标准 ansible.module_utils.basic

如果你在多个用户指定目录中拥有多个名称相同的模块、模块实用程序或插件,则命令行上的命令顺序以及每个剧本中 include 和 role 的顺序将影响在该特定剧本上找到和使用哪个插件。