如何组织基础设施即代码项目

128次阅读
没有评论

问题描述

已经完成了一个使用Terraform和Ansible的基础设施即代码项目。目前,他的项目组织结构如下:

Project1
  Terraform
    ec2.tf
    rds.tf
    …
    variables.tf
    scripts<一些脚本文件>
    templetes<一些作为模板的tfl文件>
  Ansible
    Playbooks<一些playbook yml文件>
      playbook1.yml
      playbook2.yml
      ……
    ansible_hosts
    vars<一些vars_file使用的变量文件>
    files<需要复制到远程主机的文件>
    templates<jinja2模板文件>
    roles<一些角色,如webserver、dbserver等>

对于下一个项目,他可能会使用CloudFormation/Terraform和Ansible/Chef来构建基础设施即代码项目。他还可能会涉及Jenkins、代码流水线等方面的工作。

他有一个通用的问题:在组织DevOps项目时,应该是基于项目还是基于工具?

解决方案

请注意以下操作可能会因工具版本不同而有所变化。以下是一些通用的建议。

组织方式

在DevOps项目中,如何组织基础设施即代码取决于你的项目背景。以下是两种可能的组织方式:

  1. 基于项目的组织:将基础设施和相关的代码组织在同一个项目中,与产品代码放在一起。例如,如果你正在为产品团队构建基础设施,那么将基础设施与产品代码放在同一个代码库中是有意义的。这种方法有助于将基础设施与产品紧密结合。

  2. 基于工具的组织:将不同工具的基础设施代码分别组织在一起。例如,将所有的Terraform项目放在一个目录下,将所有的Ansible项目放在另一个目录下。这种方式适用于构建通用的基础设施组件,比如DNS、文件存储、电子邮件等。

代码复用

在你的项目中,你提到了代码复用的问题。大多数DevOps工具都支持将代码模块化,以避免重复编写相似的代码。以下是一些常见工具的代码复用方法:

  • Terraform模块:Terraform允许你创建可重用的模块,这些模块可以在不同的项目中使用。你可以将通用的Terraform配置提取到模块中,然后在多个项目中引用这些模块。

  • Ansible角色:类似地,Ansible也支持角色的概念,可以将通用的任务和配置封装成角色,然后在不同项目的playbook中引用这些角色。

概念上的一致性

在DevOps项目中,保持工具的一致性是一个重要的原则。尽量在整个组织中使用相同的工具集,而不是每个项目都选择不同的工具。这样可以更容易地在项目之间共享代码,文档和经验。

在选择组织方式时,你可以根据项目的特点和规模进行权衡。如果项目之间存在很多重复的基础设施代码,考虑将这些代码模块化并在多个项目中重用。最终的目标是使项目结构清晰,易于维护,并在多个项目之间实现代码的高度可复用性。

提示:关于使用Git子模块的问题,这是一个可以考虑的方法。Git子模块允许你在不同项目之间共享代码,并且可以灵活地管理不同项目使用的不同版本。但要注意,子模块需要在整个团队中得到充分的认可和使用,以免导致混乱。

提示:角色应该是可重用的部分,它们应该尽量与特定环境无关,只包含通用任务和配置。项目特定的”魔法”应该在playbook中实现,甚至可以使用嵌套playbook来实现。

请根据你的实际情况和团队的实践,综合考虑这些建议,并灵活应用在你的DevOps项目中。

正文完