Ansible Playbooks vs Roles


别闹
2025-03-18 09:14:40 (21天前)


根据

Ansible
</跨度>
docs,一本Playbook
是:

…一个非常简单的配置管理和多机器部署系统的基础,不同于任何已经存在的,并且非常…实例,如果我配置我的/ etc /

ansible
</跨度>
/ hosts文件看起来像:

[数据库]
mydb01.example.org
mydb02.example.org

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

……那么这是什么……

5 条回复
  1. 0# 不丶离 | 2019-08-31 10-32




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




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



    剧本定义

    什么

    正在发生

    哪里

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




    [databases]

    您的广告资源中的其他条目是主机组。主机组定义将运行播放的一组主机。



    游戏是剧本中的一组任务或角色(或两者)。在大多数情况下(和示例),剧本将只包含一个剧本。但你可以拥有任意多的人。这意味着你可以拥有一个将扮演角色的剧本

    postfix

    在主机组上

    mail_servers

    和角色

    mysql

    在主机组上

    databases




    1.   - hosts: mail_servers
    2. roles:

    3. - postfix
      • hosts: databases
        roles:

        • mysql





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




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




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




    AFAIK你必须在调用时提供playbook的路径

    ansible-playbook

    。所以

    ansible-playbook someplaybook.yaml

    期待

    someplaybook.yaml

    在你当前的目录中。但是你可以提供完整的路径:

    ansible-playbook /path/to/someplaybook.yaml


  2. 1# 滔滔江水 | 2019-08-31 10-32



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



    我的观点如下:



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





    1. source data

      1. - 用于创建目标主机配置的数据
      2. </LI>
      3. <LI>
      4. <code>
      5. target data
      6. </code>
      7. - 用于识别目标主机的数据
      8. </LI>
      9. <LI>
      10. <code>
      11. config changes
      12. </code>
      13. - 我们申请的一系列规则/行动
      14. <code>
      15. source data
      16. </code>
      17. 超过目标主机基于
      18. <code>
      19. target data
      20. </code>
      21. </LI>

      </醇>


      在Ansible术语中:





      1. source data

        1. - 是我们可以放置数据的各个地方 -
        2. <code>
        3. group_vars
        4. </code>
        5. <code>
        6. playbook
        7. </code>
        8. 瓦尔,
        9. <code>
        10. role
        11. </code>
        12. 变量等等,这些地方会影响优先级(如果在不同的位置重新定义了名为相同的变量,那么在变量值期间会有非常具体的规则
        13. <code>
        14. ansible
        15. </code>
        16. /
        17. <code>
        18. ansible-playbook
        19. </code>
        20. 执行
        21. </LI>
        22. <LI>
        23. <code>
        24. target data
        25. </code>
        26. - 是库存(并且,还可以在库存中定义库存/主机组变量!)
        27. </LI>
        28. <LI>
        29. <code>
        30. config changes
        31. </code>
        32. - ansible4个抽象级别:
        33. <OL>
        34. <LI>
        35. 任务 - 单一行动
        36. </LI>
        37. <LI>
        38. 任务列表 - 操作列表
        39. </LI>
        40. <LI>
        41. role - 由同一'subject'分组的操作列表(或列表列表),通常所有目标都在同一主机/主机组上运行
        42. </LI>
        43. <LI>
        44. playbook - 播放列表,每个播放可能在不同的主机组上运行,应用几个
        45. <code>
        46. role
        47. </code>
        48. S /
        49. <code>
        50. task
        51. </code>
        52. s /任务列表(和特殊任务,如
        53. <code>
        54. handlers
        55. </code>
        56. </LI>
        57. </醇>
        58. </LI>

        </醇>


        从“软件”方面来看 - 角色应该足够通用

        重用




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



        摘要



        以上所有允许将类似配置分组 - 成为

        role


        将相关的子系统/组件分组为一个

        playbook


        另外,值得一提的是,剧本中的1个YAML项目(包括

        hosts:

        和或者

        tasks



        pre_tasks



        post_tasks



        roles

        )被称为a

        play



        现在问你的问题:



        是的,一开始很混乱。



        你通常连接你的

        source data

        你的角色的语义,所以当你看到这个角色

        setup_db

        被应用于相关主机组的游戏中(例如,

        db_hosts


        但是一个

        play

        可以运行几个主机组的联合。
        这只是一个约定与灵活性的问题。



        附:



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


  3. 2# 咿呀哟 | 2019-08-31 10-32




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





    [databases]

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



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

    角色




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



    例子来自

    文件

    描述了示例项目。它包含两件事:




    • 剧本。

      site.yml



      webservers.yml



      fooservers.yml

      是剧本。


    • 角色:

      roles/common/



      roles/webservers/

      包含的定义

      common



      webservers

      相应的角色。



    内部剧本(

    webservers.yml

    你有类似的东西:


    1. <code>
    2.   ---
        • 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/

        )。根据

        文件

        角色定义以这种方式构建:





        • 如果存在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如何知道在哪里可以找到该剧本?





        1. $ ansible-playbook someplaybook.yaml




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




        1. $ ansible-playbook somedir/somedir/someplaybook.yaml




        会在里面寻找一本剧本

        somedir/somedir/

        目录。



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


      • 3# 离线请留言 | 2019-08-31 10-32



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



        示例Playbook:dual_role-playbook.yml



        1.   - name: Some Action for two roles
        2. hosts: localhost

        3. vars_files:

        4. - roles/dual_role/meta/main.yml
        5. roles:

        6. - dual_role/container-1
        7. - dual_role/container-2
        8. </code>


        角色文件夹和文件方案如下所示:




        1. 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

        2. </code>

      登录 后才能参与评论