关于从食谱传递数据给Chef模板的变量

验证环境
厨师版本11.4.0

在厨师中,使用相同的食谱,并提供不同的多个值以将结果输出到不同的文件中时,可以使用变量。

当初,我认为可以通过创建多个角色并将不同的值放入JSON中来解决这个问题。但是,在run_list中,它并不被理解为多个recipe。当多个角色使用相同的菜谱时,只有后者会被采用,最初加载的角色将不被识别。

我们来看一下使用变量的菜谱。

在 JSON 中,可以为 key “ports” 分配多个值,如 “6379” 和 “6380”。

{
    "redis": {
       "ports": [
         "6379", "6380"
       ]
    },
   "run_list": [
      "recipe[redis]"
   ]
}

在菜谱中,将”ports.each do |port|”的部分分解执行,写作如下:
同时,虽然有点难以理解,但…

    variables({
      :port => port
    })

このように port 、この場合でいえば “6379” 、 “6380” の値を
@port に代入している。


package "redis"

### 色々

directory "/etc/redis" do
  owner "redis"
  mode  0644
end

ports.each do |port| ### portsを分解して実行させる

  template "/etc/redis/#{port}.conf" do
    owner "root"
    mode  0644
    source "redis.conf.erb"

    variables({
      :port => port  ### ここで代入している
    })
  end

end

在模板内使用被赋值的 @port。


pidfile /var/run/redis_<%= @port %>.pid

port <%= @port %>
logfile /var/log/redis/redis_<%= @port %>.log
dir /var/lib/redis/<%= @port %>

根据上述内容的结果,将其输出为文件。

pidfile /var/run/redis_6379.pid

port 6379
logfile /var/log/redis/redis_6379.log
dir /var/lib/redis/6379
pidfile /var/run/redis_6380.pid

port 6379
logfile /var/log/redis/redis_6380.log
dir /var/lib/redis/6380

我期待的一样,可以接收多个值,并确认它们分别被输出到不同的文件中。

由于我认为还有更优雅的方法,所以如果有其他方法,请务必务必给予评论。

广告
将在 10 秒后关闭
bannerAds