我们正在多个应用服务器节点上安装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",
注意:并不是所有的应用都需要部分模板,只有当某些应用需要定制或有特定要求时才需要部分模板,否则会呈现默认模板。
然而,随着时间的推移,许多应用程序在多个环境中入职。角色文件的数量越来越多,难以跟踪和维护。
于是,我们计划为每一个应用程序创建包装食谱,这样一来
所以现在我们有了这样的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的依赖关系时,错误消失了,我们有一个成功的收敛。
然而,这有悖于隔离主菜谱的目的,因为对于包装菜谱中的每一个局部模板,我都需要在主菜谱元数据中添加包装依赖。
我希望我能够解释我的需求。如果您能建议是否有任何工作方法或其他方法来解决这个问题,我将非常感激。
创建一个 自定义资源 中,然后在任何依赖于主菜谱的菜谱中使用它。