适用于多个应用程序的多环境的Puppet体系结构

适用于多个应用程序的多环境的Puppet体系结构,puppet,Puppet,我的团队使用一个Puppet体系结构,该体系结构目前可在多个环境(漫游、登台、生产)中容纳单个应用程序 现在,我们希望扩展此设置的范围以支持其他应用程序。他们中的许多人将使用我们已经定义的现有模块的子集,其他人将要求定义新的模块(可能共享也可能不共享) 对于支持多个应用程序的多个环境,最合适的Puppet体系结构是什么? 在这样的体系结构中,每个应用程序大概相当于一个模块。(文件)结构上区分作为应用程序的模块和作为一个或多个模块的依赖项的模块的最佳方式是什么 例如,它是否可以像在顶级应用程序文件

我的团队使用一个Puppet体系结构,该体系结构目前可在多个环境(漫游、登台、生产)中容纳单个应用程序

现在,我们希望扩展此设置的范围以支持其他应用程序。他们中的许多人将使用我们已经定义的现有模块的子集,其他人将要求定义新的模块(可能共享也可能不共享)

对于支持多个应用程序的多个环境,最合适的Puppet体系结构是什么?

在这样的体系结构中,每个应用程序大概相当于一个模块。(文件)结构上区分作为应用程序的模块和作为一个或多个模块的依赖项的模块的最佳方式是什么

例如,它是否可以像在顶级
应用程序
文件夹下添加第三个
模块
文件夹那样简单?还是有更好的分层策略

到目前为止,研究还没有找到任何最佳实践示例/样板,例如通过GitHub上的example42或puppetlabs

我们的文件结构:


我相信对于什么是“最合适的”解决方案有很多意见,但我会给你我的

Puppet实际上是为支持多个环境中的多个应用程序而设计的,具有一些值得注意的注意事项:

  • 所有公共依赖项(在单个环境中)必须固定到同一版本
    • 因此,如果有三个应用程序需要Apache,那么只能有一个Apache模块
  • 所有应用程序都可以使用独特的名称进行引用
    • 也就是说,如果有三个不同的node.js应用程序需要它们自己的模块,那么它们需要三个唯一命名的模块(或清单)
  • 您愿意同时维护/维护多个应用程序的更新依赖关系
    • 如果app1需要更新Apache模块依赖项,您愿意确保App2-*保持兼容
另一件需要记住的事情是,Puppet对“环境”的术语是一个术语。我见过的大多数运行良好的环境实际上在每个真正的“环境”(vagrant/dev/stage/prod)中都有不同的Puppet masters,以避免Puppet基础设施升级带来的危险,并对其进行测试(您应该有地方测试对Puppet版本的升级,该升级不会立即影响您的生产)

因此,这释放了傀儡“环境目录”,使其在没有真正“环境”概念的情况下运行,并且应该被视为“特定版本的模块集合”,而不是“环境”。您仍然需要意识到环境泄漏,但这确实为拆分模块开辟了一条潜在的途径

您需要记住的另一个概念是角色和配置文件(由、和详细讨论)。这有助于将业务逻辑与技术管理模块分离。然后,您可以将依赖项排序和面向业务的逻辑与用于管理单个组件的代码/模块分开处理

所有这些概念就绪后,以下是两种可能非常适合您的用例的体系结构布局:

按应用程序划分的环境 作为“发布”的环境(用于随着时间的推移对Puppet代码进行迭代) 请记住,嵌套顺序(发布/环境/角色等)是灵活的,取决于对您的实现最有意义的内容(如果您不打算使用它们,可以消除一些)

我鼓励你把这些信息仅仅作为一个起点,而不是一个具体的“为了即时成功而这样做”。让一位技术高超的木偶架构师与您合作,了解您的精确需求和环境,最终将得到一个比您可能在网上(包括我的)找到的假设和“饼干刀”式解决方案更好、更合适的解决方案

puppet
├── environments
│   ├── production → manifests → init.pp
│   ├── staging → manifests → init.pp
│   └── vagrant → manifests → init.pp
├── hiera.yaml
├── hieradata
│   ├── accounts.yaml
│   ├── common.yaml
│   └── environments
│       ├── production.yaml
│       ├── staging.yaml
│       └── vagrant.yaml
├── modules
│   ├── acl [..]
│   ├── newrelic [..]
│   ├── nginx [..]
│   └── puma [..]
└── vendor
    ├── Puppetfile
    ├── Puppetfile.lock
    └── modules [..]
puppet
├── environments (Managed by r10k/code manager)
│   ├── app1 
│   │   └── modules 
│   │       ├── profiles [..] 
│   │       └── app1_specific_component [..] 
│   ├── app2
│   │   └── modules 
│   │       ├── profiles [..] 
│   │       └── app2_specific_component [..] 
│   └── app3 
│       └── modules
│           ├── profiles [..] 
│           └── app3_specific_component [..] 
├── hiera.yaml
├── hieradata
│   ├── accounts.yaml
│   ├── common.yaml
│   └── applications
│       ├── app1
│       │   ├── default.yaml
│       │   └── environments (server environments)
│       │       ├── vagrant
│       │       │   └── roles 
│       │       │       ├── role1.yaml
│       │       │       ├── role2.yaml
│       │       │       └── role3.yaml 
│       │       ├── stg
│       │       │   └── roles 
│       │       │       ├── role1.yaml
│       │       │       ├── role2.yaml
│       │       │       └── role3.yaml 
│       │       └── prd
│       │           └── roles 
│       │               ├── role1.yaml
│       │               ├── role2.yaml
│       │               └── role3.yaml
│       ├── app2
│       │   ├── default.yaml
│       │   └── environments 
│       │       ├── vagrant
│       │       │   └── roles 
│       │       │       ├── role1.yaml
│       │       │       ├── role2.yaml
│       │       │       └── role3.yaml 
│       │       ├── stg
│       │       │   └── roles 
│       │       │       ├── role1.yaml
│       │       │       ├── role2.yaml
│       │       │       └── role3.yaml 
│       │       └── prd
│       │           └── roles 
│       │               ├── role1.yaml
│       │               ├── role2.yaml
│       │               └── role3.yaml
│       └── app3
│           ├── default.yaml
│           └── environments 
│               ├── vagrant
│               │   └── roles 
│               │       ├── role1.yaml
│               │       ├── role2.yaml
│               │       └── role3.yaml 
│               ├── stg
│               │   └── roles 
│               │       ├── role1.yaml
│               │       ├── role2.yaml
│               │       └── role3.yaml 
│               └── prd
│                   └── roles 
│                       ├── role1.yaml
│                       ├── role2.yaml
│                       └── role3.yaml 
├── modules (These are common to all environments, to prevent leakage)
│   ├── acl [..]
│   ├── newrelic [..]
│   ├── nginx [..]
│   └── puma [..]
└── vendor
    ├── Puppetfile
    ├── Puppetfile.lock
    └── modules [..]
puppet
├── environments (Managed by r10k/code manager)
│   ├── release_1 
│   │   └── modules 
│   │       ├── profiles [..] 
│   │       ├── app1_specific_component [..] 
│   │       ├── app2_specific_component [..]
│   │       ├── app2_specific_component [..]
│   │       ├── acl [..] (v1)
│   │       ├── newrelic [..] 
│   │       ├── nginx [..] 
│   │       └── puma [..] 
│   ├── release_2
│   │   └── modules 
│   │       ├── profiles [..] 
│   │       ├── app1_specific_component [..] 
│   │       ├── app2_specific_component [..]
│   │       ├── app2_specific_component [..]
│   │       ├── acl [..] (v1.1)
│   │       ├── newrelic [..] 
│   │       ├── nginx [..] 
│   │       ├── puma [..] 
│   │       └── some_new_thing_for_release_2 [..]
│   └── release_3
│       └── modules 
│           ├── profiles [..] 
│           ├── app1_specific_component [..] 
│           ├── app2_specific_component [..]
│           ├── app2_specific_component [..]
│           ├── acl [..] (v2.0)
│           ├── newrelic [..] 
│           ├── nginx [..] 
│           ├── puma [..] 
│           ├── some_new_thing_for_release_2 [..]
│           └── some_new_thing_for_release_3 [..]
├── hiera.yaml
├── hieradata
│   ├── accounts.yaml
│   ├── common.yaml
│   ├── environments
│   │   ├── release_1.yaml
│   │   ├── release_2.yaml
│   │   └── release_3.yaml
│   └── roles
│       ├── role1
│       │   ├── default.yaml 
│       │   ├── environments (server environments) 
│       │   │   ├── vagrant
│       │   │   │   ├── defaults.yaml
│       │   │   │   └── release (optional, only if absolutely necessary) 
│       │   │   │       ├── release_1.yaml
│       │   │   │       ├── release_2.yaml
│       │   │   │       └── release_3.yaml 
│       │   │   ├── stg
│       │   │   │   ├── defaults.yaml
│       │   │   │   └── release (optional) 
│       │   │   │       ├── release_1.yaml
│       │   │   │       ├── release_2.yaml
│       │   │   │       └── release_3.yaml 
│       │   │   └── prd
│       │   │       ├── defaults.yaml
│       │   │       └── release (optional) 
│       │   │           ├── release_1.yaml
│       │   │           ├── release_2.yaml
│       │   │           └── release_3.yaml 
│       ├── role2
│       │   ├── default.yaml 
│       │   └── environments 
│       │       ├── vagrant
│       │       │   └── defaults.yaml
│       │       ├── stg
│       │       │   └── defaults.yaml
│       │       └── prd
│       │           └── defaults.yaml
│       └── role3
│           └── default.yaml 
├── modules (Anything with ruby libraries should go here to prevent leakage)
│   ├── stdlib [..]
└── vendor
    ├── Puppetfile
    ├── Puppetfile.lock
    └── modules [..]