Ansible剧本与角色


97

根据Ansible文档,一本Playbook 是:

...非常简单的配置管理和多机部署系统的基础,与现有系统不同,它非常适合于部署复杂的应用程序。

而且,根据那些相同的文档,角色 是:

...基于已知文件结构自动加载某些vars_files,任务和处理程序的方式。按角色对内容进行分组还可以轻松与其他用户共享角色。

但是,这些与它们的不同用例之间的区别对我而言并不是立即显而易见的。例如,如果我将/etc/ansible/hosts文件配置为如下所示:

[databases]
mydb01.example.org
mydb02.example.org

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

...那么这是什么[databases]... 角色?还是某个地方的剧本YAML文件的名称?或者是其他东西?!?

如果有人可以向我解释这些差异,那么我对Ansible的理解将会大大增强!

  • Playbook vs Role vs [databases]和类似条目/etc/ansible/hosts
  • 如果在YAML文件中定义了Playbook,那么在哪里定义角色?
  • 除了ansible.cfg在Ansible服务器上生活之外,我如何使用可用的Playbooks / Roles添加/配置Ansible?例如,当我跑步时ansible-playbook someplaybook.yaml,Ansible如何知道在哪里可以找到该剧本?

1
角色是一种通过将功能放入通用的“库”中以使其在可重用的代码中重用的方法,然后可根据需要在任何“可充电的书”中使用该功能。
Juan Jimenez

tasks做东西。playbooks组织和启动任务。roles组织执行特定功能的任务,处理程序等。playbook需要一些来启动role。你会调用的集合rolesplaybooks?例如说一个管理您站点上所有主机的配置的主机?
fbicknel

Answers:


110

剧本vs角色vs [数据库]和/ etc / ansible / hosts中的类似条目

[databases]是一组主机的单个名称。它允许您通过单个名称引用多个主机。

角色是一组任务和其他文件,用于配置主机以充当特定角色

Playbook是主机和角色之间的映射。

从实施例的文档描述示例项目。它包含两件事:

  • 剧本。site.ymlwebservers.ymlfooservers.yml是剧本。
  • 角色:roles/common/roles/webservers/包含相应的定义commonwebservers角色。

在剧本(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

如果在YAML文件中定义了Playbook,那么在哪里定义角色?

它们在roles/*目录内定义。角色主要是使用YAML文件定义的,但也可以包含任何类型的资源(files/templates/)。根据文档,角色定义是通过以下方式构造的:

  • 如果存在role / x / tasks / main.yml,则其中列出的任务将被添加到剧本中
  • 如果存在role / x / handlers / main.yml,则其中列出的处理程序将添加到播放中
  • 如果Roles / x / vars / main.yml存在,则其中列出的变量将添加到播放中
  • 如果存在role / x / meta / main.yml,则其中列出的所有角色依赖项都将添加到角色列表中(1.3及更高版本)
  • 任何复制任务都可以引用role / x / files /中的文件,而不必相对或绝对地对其进行路径
  • 任何脚本任务都可以引用role / x / files /中的脚本,而不必相对或绝对地对其进行路径
  • 任何模板任务都可以引用role / x / templates /中的文件,而不必相对或绝对地对其进行路径
  • 任何包含任务都可以引用role / x / tasks /中的文件,而不必相对或绝对地对其进行路径

最重要的文件是roles/x/tasks/main.yml,您可以在其中定义在执行角色时将要执行的任务。

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

$ ansible-playbook someplaybook.yaml

会在当前目录中查找剧本。

$ ansible-playbook somedir/somedir/someplaybook.yaml

会在somedir/somedir/目录内寻找一本剧本。

将所有剧本和角色放在服务器上是您的责任。Ansible与此无关。


感谢@Yaroslav管理员(+1)-一个快速的后续问题:您声明角色是在目录中定义的,但是实际上是什么设置了角色?换句话说,webservers.yml剧本将[webservers]主机映射到commonand webservers角色。但是该common角色究竟包含了什么?无法在目录中定义它,因此那些“角色目录”中通常没有YAML文件吗?再次感谢!
smeeb

@smeeb是的,正确的角色是由该目录中的文件定义的。它们主要是YAML,但也可以包含其他类型的文件。有关更多详细信息,请参见更新的答案。
Yaroslav Admin

36

剧本vs角色vs [数据库]和/ etc / ansible / hosts中的类似条目

角色是一种将任务组合到一个容器中的方法。您可以扮演一个角色来设置MySQL,另一个角色来设置Postfix等。

一本剧本定义哪里发生了什么。在这里您可以定义主机(主机组,请参见下文)以及将应用于这些主机的角色。

[databases]而清单中的其他条目是主机组。主机组定义了将要运行播放的主机集。

剧本是剧本中的一组任务或角色(或两者)。在大多数情况(和示例)中,一本剧本将只包含一个剧本。但是,您可以随心所欲。这意味着您可以拥有一本可以postfix在主机组mail_servers和角色mysql在主机组上运行的剧本databases

- hosts: mail_servers
  roles:
    - postfix

- hosts: databases
  roles:
    - mysql

如果在YAML文件中定义了Playbook,那么在哪里定义角色?

在Ansible中,几乎所有内容都是在YAML中定义的,这对角色和剧本都很重要。

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

AFAIK,您必须在调用时提供剧本的路径ansible-playbook。因此,ansible-playbook someplaybook.yaml期望someplaybook.yaml将在您的当前目录。但是您可以提供完整的路径:ansible-playbook /path/to/someplaybook.yaml


13

这是一个术语/语义问题。即使存在基线定义,它也可能是主观的。

我的看法如下:

任何配置管理/部署系统都具有:

  1. source data -用于创建目标主机的配置的数据
  2. target data -用于识别目标主机的数据
  3. config changes-我们source data根据目标主机对目标应用的规则/操作的列表/集合target data

用Ansible术语:

  1. source data-是我们可以放置数据的各个位置- group_varsplaybookvars,rolevars等,这些位置会影响优先级(如果在不同的位置重新定义了一个名称相同的变量,则存在非常具体的规则来确定ansible/ ansible-playbook执行期间变量
  2. target data -是库存(而且,也可以在库存内定义库存/主机组变量!)
  3. config changes -ansible具有4个抽象级别:
    1. 任务-单动
    2. 任务列表-动作列表
    3. 角色-按同一“主题”分组的操作列表(或列表列表),通常所有目标都在同一主机/主机组上操作
    4. 剧本-剧本列表,每个剧本都可能在不同的主机组上运行,并应用多个roles / tasks / tasklists(以及特殊任务,例如handlers

从“软件”方面来说,角色应该具有足够的通用性,可以重复使用

同样在一些(规模较大)的组织中,“角色”由A组运送,而在B组维护的剧本中使用。

摘要

以上所有都允许将类似的配置分组为一个role。将相关的子系统/组件分组为一个playbook。另外,值得一提的,在一个剧本1个YAML项目(包括hosts:与任一者或taskspre_taskspost_tasksroles)称为play

现在为您的问题:

是的,一开始令人困惑。

通常,您source data将角色的语义与您联系起来,因此当您看到该角色setup_db被应用到相关主机组中时(例如db_hosts),但是a play可以运行在多个主机组的联合上。这只是惯例与灵活性的问题。

聚苯乙烯

请给我回信,这是否使您感到困惑或澄清。谢谢。


1

另外请记住,如果使用旨在影响不同角色的元文件,则剧本可以调用多个角色。

范例剧本: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

0

简单的说:

剧本就像主程序一样,它包含完成作业的完整指令。但是,对于大型项目,实际上并不希望包含每个细节。所以你需要角色。

角色是子例程,通常可以实现一个目标,例如,设置数据库服务器。您可以将其放在roles/目录中,或者通过在其中提供URI来下载第三方角色,rolesfile.yml并要求ansible-galaxy为您下载它们。

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

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

然后,可以在剧本或角色中使用“ 分组” web或“ 分组” database来指定要应用的主机。

这些组也可以在命令中使用ansible以运行临时命令。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.