提问人:eatheril 提问时间:5/19/2023 最后编辑:eatheril 更新时间:6/1/2023 访问量:220
适用于多个产品/团队的 Ansible 角色和剧本组织
Ansible role and playbook organization for multiple products/teams
问:
我们从使用 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
-...
答:
您可能会从使用 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
这样可以使您的代码保持干燥状态,并使您的组织能够重用现有代码。
评论