Chef infra 从不同的食谱中呈现部分模板

Chef infra 从不同的食谱中呈现部分模板,chef-infra,Chef Infra,我们正在多个应用服务器节点上安装telegraf代理;作为收集服务器度量值的监视框架的一部分 这是由我们的烹饪大师完成的 master/recipe/telegraf_install.rb 这个主食谱也有默认的配置模板 master/template/telegraf\u install\u default.conf.erb master/template/Partial2.conf.erb 一直以来,我们都是在主食谱下编写角色文件 master/role/Application1_DEV.js

我们正在多个应用服务器节点上安装telegraf代理;作为收集服务器度量值的监视框架的一部分

这是由我们的烹饪大师完成的

master/recipe/telegraf_install.rb

这个主食谱也有默认的配置模板

master/template/telegraf\u install\u default.conf.erb

master/template/Partial2.conf.erb

一直以来,我们都是在主食谱下编写角色文件

master/role/Application1_DEV.json

master/role/Application1_UAT.json

master/role/Application2_DEV.json

注意:并非所有应用程序都需要部分模板;仅当某些应用程序需要某些自定义项或特定要求时,才需要部分模板,否则将呈现默认模板

然而,随着时间的推移,许多应用程序都被安装在多个环境中。 角色文件的数量失控,难以跟踪和维护

然后,我们计划为每个单独的应用程序创建包装器cookbook,以便

  • 我们在包装器手册中定义了特定于应用程序/环境的角色文件
  • 包装烹饪书将被钉在一个特定的主烹饪书版本
  • 独立修改包装食谱,无需对主食谱进行修改和更改 (这是一项企业授权,即每当对其进行任何更改时(角色文件除外)都会升级cookbook版本)
现在我们有这样的包装食谱:-

包装器1/template/Partial1.erb

包装器1/role/Application1_DEV.json

包装器1/role/Application1_UAT.json

wrapper2/template/Partial2.erb

包装器2/role/Application2_DEV.json

按照要求;我们想将基础烹饪书与所有包装隔离开来; 因此,我们希望从包装器cookbook传递部分模板文件(特定于应用程序)

我们通过将渲染逻辑更改为:

<%= render @partial_name , :cookbook => 'wrapper1' %>
'wrapper1'>
Chef::Mixin::Template::TemplateError(未找到Cookbook wrapper1。如果从另一本Cookbook加载wrapper1,请确保在元数据中配置依赖项)第20行:
18:
19: 
20:'包装器1'>
21: 
22:
当我在主食谱中添加包装器的依赖项时;错误消失了,我们成功地收敛了

然而,这违背了隔离主cookbook的目的,对于包装器cookbook中的每个部分模板,我需要在主cookbook元数据中添加包装器依赖项


我希望我能解释我的要求。如果您能建议是否有任何解决方法或可能有其他方法来解决此问题,我们将不胜感激。

在主食谱中创建一个,然后在任何依赖于主食谱的食谱中使用它

在主食谱中创建一个,然后在任何依赖于主食谱的食谱中使用它

问题是什么?错误是什么?没有任何错误。上述逻辑是有效的。我担心我必须将包装依赖添加到我的主食谱中,这是有道理的;由于配置操作发生在主食谱中,即它需要来自包装器的模板信息。我正在寻找一些其他的工作,我可以在包装自定义配置;在使用它的时候不要对主机做任何更改问题是什么?错误是什么?没有任何错误。上述逻辑是有效的。我担心我必须将包装依赖添加到我的主食谱中,这是有道理的;由于配置操作发生在主食谱中,即它需要来自包装器的模板信息。我正在寻找一些其他的工作,我可以在包装自定义配置;并且在使用主机时不会对其进行任何更改
# Telegraf Configuration.
[global_tags]
  ## Environment variables can be used as tags and throughout the config file (i.e. user = "$USER").
  app = "<%= @app %>"
  env_name = "<%= @env_name %>"
  env_type = "<%= @env_type %>"
  role = "<%= @role %>"

<% unless @partial_name.empty? -%>
 <%= render @partial_name %>
<% end -%>
# Partial1 service
[[inputs.procstat]]
pattern = "Pattern1"

[inputs.procstat.tags]
service_name = "Service1"
instance = "Instance1"
[[inputs.proc]]
pattern = "Pattern2"

[inputs.proc.tags]
service_name = "Service2"
instance = "Instance2"
"default_attributes": {
            "telegraf": {
                "template_name": "telegraf_install_default.conf.erb",
                "app": "App1",
                "env_name": "DEV1",
                "env_type": "DEV",
"default_attributes": {
            "telegraf": {
                "template_name": "telegraf_install_default.conf.erb",
                "partial_name": "Partial1.conf.erb",
                "app": "App1",
                "env_name": "UAT1",
                "env_type": "UAT",
"default_attributes": {
            "telegraf": {
                "template_name": "telegraf_install_default.conf.erb",
                "partial_name": "Partial2.conf.erb",
                "app": "App2",
                "env_name": "DEV1",
                "env_type": "DEV",
<%= render @partial_name , :cookbook => 'wrapper1' %>
Chef::Mixin::Template::TemplateError (Cookbook wrapper1 not found. If you're loading wrapper1 from another cookbook, make sure you configure the dependency in your metadata) on line #20:

 18:
 19: <% unless @partial_name.empty? -%>
 20:  <%= render @partial_name, :cookbook => 'wrapper1' %>
 21: <% end -%>
 22: