Ansible Playbooks vs Roles

时间:2015-08-19 16:29:42

标签: ansible ansible-playbook

根据Ansible文档,Playbook  是:

  

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

而且,根据相同的文档,Roles  是:

  

...基于已知文件结构自动加载某些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文件中定义了Playbooks,那么角色定义在哪里?
  • 除了生活在Ansible服务器上的ansible.cfg之外,如何使用可用的Playbooks / Roles添加/配置Ansible?例如,当我运行ansible-playbook someplaybook.yaml时,Ansible如何知道在哪里找到该剧本?

5 个答案:

答案 0 :(得分:81)

  

Playbook vs Role vs [databases]和/ etc / ansible / hosts中的类似条目

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

角色是一组任务和其他文件,用于配置主机以服务于某个角色

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

来自documentation的示例描述了示例项目。它包含两件事:

  • 剧本。 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文件中定义了Playbooks,那么角色定义在哪里?

它们在roles/*目录中定义。角色主要使用YAML文件定义,但也可以包含任何类型的资源(files/templates/)。根据{{​​3}},角色定义的结构是这样的:

  
      
  • 如果存在roles / x / tasks / main.yml,则其中列出的任务将添加到播放
  •   
  • 如果存在roles / x / handlers / main.yml,则其中列出的处理程序将添加到游戏中
  •   
  • 如果存在roles / x / vars / main.yml,则其中列出的变量将添加到游戏中
  •   
  • 如果存在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如何知道在哪里找到该剧本?

$ ansible-playbook someplaybook.yaml

将在当前目录中查找一个剧本。

$ ansible-playbook somedir/somedir/someplaybook.yaml

将在somedir/somedir/目录中查找一个剧本。

您有责任将所有Playbooks和角色的项目放在服务器上。 Ansible与此无关。

答案 1 :(得分:31)

  

Playbook vs Role vs [databases]和/ etc / ansible / hosts中的类似条目

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

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

[databases]以及广告资源中的其他条目是主机组。主机组定义一组播放将运行的主机。

游戏是剧本中的一组任务或角色(或两者)。在大多数情况下(和示例),剧本将只包含一个剧本。但你可以拥有任意多的人。这意味着您可以拥有一个可在主机组postfix上运行角色mail_servers并在主机组mysql上运行角色databases的手册:

- hosts: mail_servers
  roles:
    - postfix

- hosts: databases
  roles:
    - mysql
  

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

在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

答案 2 :(得分:8)

这是一个术语/语义问题。它可以是主观的,即使有基线定义。

我的观点如下:

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

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

    在Ansible术语中:

    1. source data - 我们可以放置数据的各个地方 - group_varsplaybook vars,role vars等等。这些地方影响优先级(如果名为变量的名称)在不同的位置重新定义相同的内容,在ansible / ansible-playbook执行期间,变量的值有非常具体的规则
    2. target data - 是库存(而且,它也可以在库存中定义库存/主机组变量!)
    3. config changes - ansible有4个抽象级别:
      1. 任务 - 单一行动
      2. 任务列表 - 操作列表
      3. 角色 - 按相同主题分组的操作列表(或列表列表),通常所有目标都在同一主机/主机组上运行
      4. playbook - 播放列表,每个播放可能在不同的主机组上运行,应用多个role s / task s /任务列表(以及handlers等特殊任务)
    4. 来自&#39;软件&#39;方面 - 角色应该足够通用,以便重用

      同样在一些(相当大的)组织中,角色&#39;由A组装运,用于B组维护的剧本。

      摘要

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

      现在提出您的问题:

      是的,起初很困惑。

      您通常会将play与您角色的语义联系起来,因此当您看到角色source data应用于相关主机组的游戏时(例如setup_db) 但是db_hosts可以在几个主机组的并集上运行。 这只是一个约定与灵活性的问题。

      P.S。

      请写回来是否会增加混乱或澄清。 感谢。

答案 3 :(得分:0)

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

示例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

答案 4 :(得分:0)

简单地说:

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

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

[database]是在清单文件中定义的主机组,其中列出了属于database组的主机。您还可以通过指定类似

来指定一组Web服务器
[web]
web1.example.com
web2.example.com

然后可以在剧本或角色中使用组webdatabase来指定要应用的主机。

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