适用于多个产品/团队的 Ansible 角色和剧本组织

Ansible role and playbook organization for multiple products/teams

提问人:eatheril 提问时间:5/19/2023 最后编辑:eatheril 更新时间:6/1/2023 访问量:220

问:

我们从使用 ansible 最佳实践文本的 ansible 开始,但现在它变得难以管理。出于这个原因,我们正在尝试重新组织我们的 ansible 结构,并将其划分为多个 git 存储库。

我们的用例是,我们有一个非常复杂的系统,其中有几个团队在专门的测试环境中开发解决方案,每个解决方案都包括多个应用程序、数据库等。到目前为止,每个人都使用带有单个“角色”和“playbook”文件夹的单个 git 存储库。我们的结构如下所示:

- group_vars
- host_vars
- inventory
- roles
   - team1_role
       - tasks
            - sqlite.yml
            - app1_1.yml 
            - app1_2.yml 
   - team2_role
       - tasks
            - sqlite.yml
            - app2_1.yml
            - app2_2.yml
   - team3_role
   -...
- playbooks
   - team1_playbook
       - team1.yml --> where this playbook install sqlite in host1, app1_1 and app1_2 in host2
       - team1_action1.yml --> where this playbook perform some maintenance activity, such as update passwords. 
   - team2_role
       - team2.yml --> where this playbook install sqlite in host3, app2_1 and app2_2 in host2
   - all.yml

在阅读了几个网站之后,我直截了当地看到,我们必须为每个“team_role”和一个“common_role”创建一个存储库,其中包含诸如sqlite.yml之类的常见内容。对我们来说,为每个应用程序创建一个存储库不会有任何好处。

但是,我们不知道如何处理这些剧本。我只看到树选项:

  • 使用 playbook 为每个团队创建第二个存储库
  • 允许团队访问和编辑包含所有 playbook 的中央 ansible 存储库。
  • 为每个团队创建一个包含剧本和角色的存储库,将 ansible 结构更改为如下所示:
- team1
    - roles
    - playbooks
- team1
    - roles
    - playbooks

体验后,您会推荐什么?

溶液

我们最终同意使用第三种选择。这不是 ansible 最佳实践,但为每个角色定义集合的解决方案在短期内似乎对我们不起作用。让我们看看经验是否没有告诉我们我们错了。

然后,我们将为每个团队定义一个存储库,他们将在其中编写自己的角色和剧本。然后,我们将有一个用于通用清单的存储库(可能为所有团队共享)和一个用于通用角色的存储库(从长远来看,我们可能会将其更改为每个角色都有一个存储库)。

因此,最终的结构将是:

 - group_vars
 - host_vars
 - inventory
 - common_roles
    - sqlite.yml
 - teams
    - team1
       - roles
            - app1_1.yml 
            - app1_2.yml 
       - playbooks
            - team1.yml
    - team2
       - roles
            - app2_1.yml
            - app2_2.yml
       - playbooks
            - team2.yml
    - team3
       -...

Git Ansible 组织

评论


答:

1赞 HiroCereal 5/19/2023 #1

您可能会从使用 Ansible Collections 中受益

并将角色从两个存储库中的 playbook 中分离出来。你会有:

  • Ansible Collections 存储库,托管不同团队的可重用角色
  • 每个团队的 Ansible playbook 存储库,利用 Ansible 集合存储库中定义的角色

可以在多个团队和/或应用程序之间重用的所有内容都会转到 Ansible Collections 存储库。其他所有内容都存储在每个团队/应用程序的存储库中。

Ansible Collections 存储库的结构可能如下所示:

ansible-collection/
└── myorg
    ├── database
    │   └── roles
    │       ├── mysql
    │       ├── postgresql
    │       └── sqlite
    ├── team1
    │   └── roles
    │       ├── appA
    │       └── appB
    └── team2
        └── roles
            ├── appC
            └── appD

然后,您可以利用剧本中的角色:

---
- hosts: host1
  tasks:
    - include_role:
        name: myorg.database.sqlite
    - include_role:
        name: myorg.team1.appA

这样可以使您的代码保持干燥状态,并使您的组织能够重用现有代码。

评论

0赞 eatheril 5/21/2023
谢谢你的回答。但是,这个想法是所有团队都修改 git 存储库中的单个集合?或者它更像是银河系库中的一些神器?
0赞 HiroCereal 5/22/2023
是的,或者你可以为每个团队设置一个单独的集合,然后为常见角色设置一个集合。只需将所有可重用的代码放在集合中即可;)
0赞 eatheril 5/23/2023
我一直在阅读更多关于收藏的信息。我看到在一个集合中,有可能包含角色和剧本。如果每个团队都向我们发送包含他们的角色和剧本的集合,您怎么看?这样一来,团队就可以拥有一个包含其集合的 ansible 存储库,该存储库可以完成他们的完整部署。