Ansible Playbooks与Roles的区别

137
根据Ansible文档,Playbook 是:“一个非常简单的配置管理和多机部署系统的基础,不同于任何已经存在的系统,并且非常适合部署复杂的应用程序。”而根据同一份文档,Role 则是:“一种基于已知文件结构自动加载特定 vars_files、tasks 和 handlers 的方式。通过角色对内容进行分组,还可以轻松共享角色与其他用户。”然而,它们之间的区别及其不同的用例对我来说并不立即明显。例如,如果我将我的 /etc/ansible/hosts 文件配置如下:
[databases]
mydb01.example.org
mydb02.example.org

[mail_servers]
mymail01.example.org
mymail_dr.example.org

那么这个 "[databases]" 的条目是一个角色吗?还是某个Playbook YAML文件的名称?或者其他什么?!?

如果有人能向我解释一下这些区别,我的Ansible理解将大大提高!

  • Playbooks vs Role vs [databases]和类似的条目在/etc/ansible/hosts中的区别
  • 如果Playbooks在YAML文件内定义,那么Roles在哪里定义?
  • 除了ansible.cfg位于Ansible服务器上之外,我如何添加/配置可用的Playbooks/Roles到Ansible?例如,当我运行ansible-playbook someplaybook.yaml时,Ansible如何知道在哪里找到该playbook?

4
角色是一种将代码功能放入通用的“库”中,从而使playbook中的代码可重用的方法,可以根据需要在任何playbook中使用。 - Juan Jimenez
4
tasks 是执行任务的操作。playbooks 组织并启动 tasksroles 组织一组任务、处理器等以执行特定功能。需要使用某个 playbook 来启动 role(s)。如果要管理站点上所有主机的配置,您会如何称呼 rolesplaybooks 的集合? - fbicknel
4
简单而有效的Ansible结构要素概述:https://devops.stackexchange.com/a/9833/17395 - dess
5个回答

150
Playbook vs Role vs [databases]和/etc/ansible/hosts中的类似条目
[databases]是一组主机的单个名称。它允许您通过一个名称引用多个主机。
Role是一组任务和附加文件,用于配置主机以提供特定的角色。
Playbook是主机和角色之间的映射。 documentation中的示例描述了示例项目。它包含两个内容:
- Playbooks. site.yml、webservers.yml、fooservers.yml是playbooks。 - Roles:roles/common/和roles/webservers/分别包含common和webservers角色的定义。
在playbook(webservers.yml)中,您会看到类似以下内容:
---
- hosts: webservers <- this group of hosts defined in /etc/ansible/hosts, databases and mail_servers in example from your question
  roles: <- this is list of roles to assign to these hosts
    - common
    - webservers

如果Playbooks在YAML文件中定义,那么角色在哪里定义呢?
它们在"roles/*"目录中定义。角色主要使用YAML文件进行定义,但也可以包含任何类型的资源(如"files/"、"templates/")。根据文档documentation,角色定义的结构如下:
如果存在roles/x/tasks/main.yml文件,则其中列出的任务将被添加到play中。 如果存在roles/x/handlers/main.yml文件,则其中列出的处理程序将被添加到play中。 如果存在roles/x/vars/main.yml文件,则其中列出的变量将被添加到play中。 如果存在roles/x/meta/main.yml文件,则其中列出的任何角色依赖项将被添加到角色列表中(1.3及更高版本)。 任何复制任务可以引用roles/x/files/中的文件,而无需相对或绝对路径。 任何脚本任务可以引用roles/x/files/中的脚本,而无需相对或绝对路径。 任何模板任务可以引用roles/x/templates/中的文件,而无需相对或绝对路径。 任何包含任务可以引用roles/x/tasks/中的文件,而无需相对或绝对路径。
最重要的文件是roles/x/tasks/main.yml,在这里定义了在执行角色时将执行的任务。
除了Ansible服务器上的ansible.cfg之外,我如何添加/配置可用的Playbooks/Roles到Ansible?例如,当我运行ansible-playbook someplaybook.yaml时,Ansible如何知道在哪里找到该playbook?
$ ansible-playbook someplaybook.yaml

在当前目录中寻找一个playbook。
$ ansible-playbook somedir/somedir/someplaybook.yaml

在目录下寻找一个playbook。
将您的项目及其所有的playbooks和角色放在服务器上是您的责任,Ansible与此无关。

感谢@Yaroslav Admin (+1) - 有一个快速的后续问题:您说角色是在目录内定义的,但实际上是什么设置了角色?换句话说,webservers.yml剧本将[webservers]主机映射到commonwebservers角色。但是,common角色包括什么?没有办法在目录中定义它,因此这些“角色目录”中通常有YAML文件吗?再次感谢! - smeeb
@smeeb 是的,你说得对,角色是由该目录内的文件定义的。它们大多是YAML格式,但也可以包含其他类型的文件。有关更多详细信息,请参见更新后的答案。 - Yaroslav Admin
6
好的。这应该在Ansible的文档中,就在他们解释原则和词汇的地方。我已经多次阅读了他们的入门指南,但无法理解playbooks和roles之间的区别和交互方式。通过您的解释,我第一次就明白了! - YSC

49
角色是将任务分组到一个容器中的一种方式。您可以为设置MySQL创建一个角色,为设置Postfix创建另一个角色等等。
Playbook定义了何时发生什么。在此处,您定义将应用于这些主机的主机(主机组)和角色。
[databases]和清单中的其他条目都是主机组。主机组定义要在其上运行play的一组主机。 play是playbook中一组任务或角色(或两者兼有)。在大多数情况下(和示例),playbook将仅包含一个单独的play。但是您可以拥有任意数量的play。这意味着您可以在主机组mail_servers上运行角色postfix并在主机组databases上运行角色mysql的playbook:
- hosts: mail_servers
  roles:
    - postfix

- hosts: databases
  roles:
    - mysql

如果Playbooks是在YAML文件中定义的,那么角色定义在哪里?

在Ansible中,几乎所有东西都是用YAML定义的,包括角色和Playbooks。

除了ansible.cfg位于Ansible服务器上之外,我如何使用可用的Playbooks / Roles 添加/配置Ansible?例如,当我运行 ansible-playbook someplaybook.yaml 时,Ansible如何知道在哪里找到该playbook?

据我所知,当调用ansible-playbook时,您必须提供Playbook的路径。因此,ansible-playbook someplaybook.yaml将期望someplaybook.yaml在您当前的目录中。但是您也可以提供完整的路径:ansible-playbook /path/to/someplaybook.yaml


16

这是一个术语/语义问题。虽然有一个基础定义,但它可能是主观的。

我认为:

任何配置管理/部署系统都具备以下三个要素:

  1. 源数据 - 用于创建目标主机配置的数据
  2. 目标数据 - 用于识别目标主机的数据
  3. 配置更改 - 我们使用 源数据 在目标主机上基于 目标数据 应用的规则/操作列表或集合。

在Ansible术语中:

  1. 源数据 - 是我们可以放置数据的各种位置 - group_vars, playbook vars, role vars等。这些位置会影响优先级(如果同名变量在不同位置被重新定义,则有非常具体的规则来决定在执行 ansible/ansible-playbook 时该变量的值)。
  2. 目标数据 - 是清单(也可以在清单内部定义清单/主机组变量!)
  3. 配置更改 - Ansible对其有4个抽象级别:
    1. 任务 - 单个动作
    2. 任务列表 - 动作列表
    3. 角色 - 动作列表(或列表列表),按相同的“主题”分组,通常在所有目标上操作同一台主机/主机组
    4. playbook - 操作可能不同的主机组的播放列表,应用多个roles/tasks/tasklists(以及像handlers)这样的特殊任务

从“软件”方面来看,角色应该足够通用,可以被重复使用。

在一些(相当大的)组织中,“roles”由A组提供,而在B组维护的playbooks中使用。

总结

所有上述内容都允许将类似的配置分组到一个 role 中。

将相关子系统/组件分组到一个playbook中。 此外,值得一提的是,一个playbook中的1个YAML项(包括hosts:taskspre_taskspost_tasksroles之一)被称为play

现在回答您的问题:

是的,一开始可能会有些困惑。

通常,您将源数据连接到您的角色语义上,因此当您看到角色setup_db应用于与相关主机组(例如db_hosts)关联的play时, 但是一个play可以运行在多个主机组的并集上。 这只是惯例与灵活性的问题。

P.S.

请回复我,无论这是否增加了困惑或澄清了问题。 谢谢。


9

简单来说:

Playbook类似于主程序,它包含完成任务的完整指令。但是,对于大型项目,实际上并不需要将每一个细节都写在其中。因此,您需要角色。

角色是子程序,通常实现一个目标,例如设置数据库服务器。您可以将其放置在roles/目录中,或通过提供rolesfile.yml中的URI下载第三方角色,并使用ansible-galaxy命令将其下载到您的计算机上。

[database]是在清单文件中定义的主机组,列出属于database组的主机。您还可以通过指定类似于以下内容的方式来指定一组Web服务器:

[web]
web1.example.com
web2.example.com

可以在playbooks或roles中使用组webdatabase来指定应用主机。

还可以在命令ansible中使用这些组来运行即席命令。


1
请记住,如果使用旨在影响不同角色的元文件,则playbook可以调用多个角色。
示例Playbook:dual_role-playbook.yml
- name: Some Action for two roles
  hosts: localhost

  vars_files:
    - roles/dual_role/meta/main.yml

  roles:
    - dual_role/container-1
    - dual_role/container-2

角色文件夹和文件的结构如下所示:
dual_role-playbook.yml
  -- roles
     -- dual_role
        -- meta/main.yml
        -- container-1
           -- tasks/main.yml
           -- templates/template.j2
        -- container-2
           -- tasks/main.yml
           -- templates/template.j2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接