适用于多个应用程序的多个环境的Puppet架构

Dan*_* B. 2 puppet

我的团队使用Puppet架构,目前可以在多个环境中容纳单个应用程序(流浪,分段,生产).

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

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

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

例如,它可以像modules在顶级文件夹下添加第三个文件夹一样简单applications吗?或者是否有更好的分层策略?

到目前为止的研究尚未发现任何最佳实践示例/样板,例如通过GitHub上的example42或puppetlabs.

我们的文件结构:

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 [..]
Run Code Online (Sandbox Code Playgroud)

Jos*_*uza 5

我确信对于"最合适"的解决方案有很多意见,但我会给你我的.

实际上,Puppet设计用于支持多个环境中的多个应用程序,但有一些值得注意的警告:

  • 必须将所有常见依赖项(在单个环境中)固定到同一版本
    • 因此,如果您有三个需要Apache的应用程序,则只能有一个Apache模块
  • 可以使用独特的名称引用所有应用程序
    • IE如果你有三个不同的node.js应用程序需要自己的模块,你需要三个唯一命名的模块(或清单)
  • 您愿意同时处理多个应用程序的更新依赖关系的维护/维护
    • 如果app1需要更新Apache模块依赖项,那么您可以确保应用程序2-*保持兼容

另外要记住的是,Puppet的"环境"术语是公认的用词不当.我见过的大多数运行良好的环境实际上都在他们真正的"环境"(vagrant/dev/stage/prod)中有不同的Puppet主人,以避免环境泄漏的危险以及测试Puppet基础设施的升级(你应该有一个地方测试升级到您的Puppet版本,不会立即影响您的生产)

因此,这释放了Puppet'环境目录'以便在没有真正的"环境"概念的情况下运行,并且应该被视为"特定版本的模块集合"而不是"环境".您仍然需要认识到环境泄漏,但这确实为分割模块开辟了一条潜在的途径.

你需要记住的另一个概念是角色和个人资料(Gary Larizza,Adrien TheboCraig Dunn都很好地讨论过).这些有助于将业务逻辑与技术管理模块分离.然后,您可以处理依赖性排序和面向业务的逻辑,与用于管理各个组件的代码/模块分开.

有了所有这些概念,这里有两个架构布局,可能非常适合您的用例:

应用环境

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 [..]
Run Code Online (Sandbox Code Playgroud)

环境作为'发布'(用于随着时间的推移迭代Puppet代码)

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 [..]
Run Code Online (Sandbox Code Playgroud)

请记住,嵌套顺序(发布/环境/角色等)是基于对您的实现最有意义的内容(如果您不打算使用它们,可以取消某些内容).

我鼓励你把这些信息仅仅作为一个起点,而不是具体的"为即时成功做这件事".拥有一名技术娴熟的Puppet Architect与您一起了解您的精确需求和环境将最终得到一个更好的调整和适当的解决方案,而不是您可能在网上找到的假设和"千篇一律"类型的解决方案(包括我的).