首页 文章

Ansible Playbooks vs Roles

提问于
浏览
63

根据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如何知道在哪里找到该剧本?

4 回答

  • 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
    
  • 3

    Playbook vs Role vs [数据库]和/ 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/ ) . 根据documentation角色定义以这种方式构造:

    如果存在roles / x / tasks / main.yml,则其中列出的任务将添加到play中如果roles / x / handlers / main.yml存在,则其中列出的处理程序将添加到play If / x / vars / main.yml存在,其中列出的变量将被添加到play如果roles / x / meta / main.yml存在,其中列出的任何角色依赖项将被添加到角色列表(1.3及更高版本)任何复制任务都可以引用文件在roles / x / files /中而不必相对或绝对地路径它们任何脚本任务都可以引用roles / x / files /中的脚本而不必相对或绝对地路径它们任何模板任务都可以引用角色/ 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/ 目录中查找一个剧本 .

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

  • 25

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

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

    剧本定义了发生在哪里的事情 . 您可以在此处定义主机(主机组,请参见下文)以及将应用于这些主机的角色 .

    [databases] 和清单中的其他条目是主机组 . 主机组定义将运行播放的一组主机 .

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

    - 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

  • 69

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

    我的观点如下:

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

    • source data - 用于创建目标主机配置的数据

    • target data - 用于标识目标主机的数据

    • config changes - 我们根据 target data 在目标主机上使用 source data 应用的一系列规则/操作

    在Ansible条款中:

    • source data - 是我们可以放置数据的各个地方 - group_varsplaybook vars, role vars等,这些地方会影响优先级(如果在不同的位置重新定义一个名为相同的变量,那么会有非常具体的规则是执行 ansible / ansible-playbook 期间变量的值

    • target data - 是库存(并且,还可以在库存中定义库存/主机组变量!)

    • config changes - ansible有4个抽象级别:

    • 任务 - 单一动作

    • 任务列表 - 操作列表

    • role - 按相同'subject'分组的操作列表(或列表列表),通常所有目标都在同一主机/主机组上运行

    • playbook - 播放列表,每个播放可能在不同的主机组上运行,应用了几个 role s / task s /任务列表(以及 handlers 等特殊任务)

    从'software'方面 - 角色应该足够通用以便重用 .

    同样在一些(相当大的)组织中,'角色'由A组运送,同时用于由B组维护的剧本 .

    摘要

    以上所有允许将类似配置分组 - 成为 role . 将相关的子系统/组件分组为一个 playbook . 另外,值得一提的是,剧本中的1个YAML项目(包括 hosts: 和其中之一或 taskspre_taskspost_tasksroles )被称为 play

    现在问你的问题:

    是的,一开始很混乱 .

    您通常将 source data 连接到角色的语义,因此当您看到角色 setup_db 在播放到相关主机组时应用(例如 db_hosts )但是 play 可以在多个主机组的并集上运行 . 这只是一个约定与灵活性的问题 .

    P.S.

    请写信给我是否会增加混乱,或澄清 . 谢谢 .

相关问题