从不同的烹饪书中渲染部分模板

问题描述 投票:1回答:1

我们正在多个应用服务器节点上安装telegraf代理;作为监测框架的一部分,以收集服务器指标。

这是由出来的主菜谱完成的。

Masterrecipetelegraf_install.rb)来完成。

yum_package 'telegraf' do
  source "#{Chef::Config[:file_cache_path]}/#{node['telegraf']['package']}"
  action :install
end

template '/etc/telegraf/telegraf.conf' do
  source node['telegraf']['template_name']
  owner 'telegraf'
  group 'telegraf'
  mode '0777'
  variables(
    partial_name: node['telegraf']['partial_name'],
    app: node['telegraf']['app'],
    env_name: node['telegraf']['env_name'],

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

mastertemplatetelegraf_install_default.conf.erb。

# 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 -%>

在模板下还有其他的模板文件。

MastertemplatePartial1.conf.erb

# Partial1 service
[[inputs.procstat]]
pattern = "Pattern1"

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

MastertemplatePartial2.conf.erb

[[inputs.proc]]
pattern = "Pattern2"

[inputs.proc.tags]
service_name = "Service2"
instance = "Instance2"

一直以来,我们都是在主菜谱下自己写角色文件。

主角色Application1_DEV.json。

"default_attributes": {
            "telegraf": {
                "template_name": "telegraf_install_default.conf.erb",
                "app": "App1",
                "env_name": "DEV1",
                "env_type": "DEV",

主角色Application1_UAT.json。

"default_attributes": {
            "telegraf": {
                "template_name": "telegraf_install_default.conf.erb",
                "partial_name": "Partial1.conf.erb",
                "app": "App1",
                "env_name": "UAT1",
                "env_type": "UAT",

主角色Application2_DEV.json。

"default_attributes": {
            "telegraf": {
                "template_name": "telegraf_install_default.conf.erb",
                "partial_name": "Partial2.conf.erb",
                "app": "App2",
                "env_name": "DEV1",
                "env_type": "DEV",

注意:并不是所有的应用都需要部分模板,只有当某些应用需要定制或有特定要求时才需要部分模板,否则会呈现默认模板。

然而,随着时间的推移,许多应用程序在多个环境中入职。角色文件的数量越来越多,难以跟踪和维护。

于是,我们计划为每一个应用程序创建包装食谱,这样一来

  • 我们有应用环境特定的角色文件定义在包装器cookbook中。
  • 包装版cookbook将被钉在一个特定的主cookbook版本上。
  • 在不修改主烹饪书的情况下,独立地修改包装烹饪书(这是企业的要求,即每当对烹饪书进行任何修改时,都会提升烹饪书的版本(角色文件除外)。

所以现在我们有了这样的wrapper cookbook:-。

wrapper1templatePartial1.erb

wrapper1roleApplication1_DEV.json。

wrapper1roleApplication1_UAT.json。

wrapper2templatePartial2.erb

wrapper2roleApplication2_DEV.json。

根据需求,我们希望将基础cookbook与所有的wrapper隔离开来,因此我们希望从wrapper cookbook中传递部分模板文件(这是应用程序特有的)。

我们通过修改渲染逻辑来实现。

<%= 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:

当我在主cookbook中添加了wrapper的依赖关系时,错误消失了,我们有一个成功的收敛。

然而,这有悖于隔离主菜谱的目的,因为对于包装菜谱中的每一个局部模板,我都需要在主菜谱元数据中添加包装依赖。

我希望我能够解释我的需求。如果您能建议是否有任何工作方法或其他方法来解决这个问题,我将非常感激。

chef
1个回答
0
投票

创建一个 自定义资源 中,然后在任何依赖于主菜谱的菜谱中使用它。

© www.soinside.com 2019 - 2024. All rights reserved.