使用相同的食谱 - Chef为已知主机生成唯一的erb模板

时间:2015-03-02 17:08:46

标签: ruby loops block chef erb

我有许多主机需要在文件中使用不同的主服务器主机和唯一端口。所以端口和服务器的价值是已知的。

最终结果是我的erb文件应该为所有运行cookbook的主机产生这种性质:

PG_Host = -h myservername:unique_port

我面临的挑战是如何在配方中迭代这些值,这取决于服务器运行cookbook时的短主机名,它会选择一个特定的端口和一个特定的主服务器。

我很难将模板与erb文件匹配。我想要一些简单的解决方案来实现这一目标。任何指针都将受到赞赏。

这是我的食谱:

template '/var/lib/pgsql/conf/mymonitor.sh' do
            source 'mymonitor.sh.erb'
            owner 'postgres'
            action :create
            variables(
                    master_server: 'someserver.fqn',
                    master_port: '897'
            )
end

模板文件:

PG_HOST= -h <%= @master_server %>:<%= @master_port %>

那么如何使用某种循环在端口5555等上为anotherserver.fqn生成相似的文件呢?我不确定其他服务器及其端口的变量应如何。

1 个答案:

答案 0 :(得分:0)

传递给模板的变量可以在厨师 - 客户端运行期间计算,因此在您的配方中,您可以按照您希望的方式计算端口,并且还可以在服务器名称(master_server)期间计算chef-client运行,或者您可以使用某些节点的自动属性(由ohai收集),例如node[:hostname]node[:fqdn]。 IE。:

  • 动态传递食谱变量

    server_port = "42#{node[:ipaddress].rpartition('.')[-1]}"
    
    template '/var/lib/pgsql/conf/mymonitor.sh' do
      source 'mymonitor.sh.erb'
      owner 'postgres'
      action :create
      variables(
        master_server: node[:fqdn],
        master_port: server_port
        )
    end
    
  • 或者您可以直接在模板节点的属性中使用:

    PG_HOST= -h <%= node[:fqdn] %>:<%= node[:mycookbook][:server_port] %>
    

或使用字符串插值

    PG_HOST= -h <%= "#{node[:fqdn]}:#{node[:mycookbook][:server_port]"} %>

编辑: 可以为每个节点(或角色)覆盖属性的值,因此您可以轻松地为每个节点的属性分配不同的值。查看chef attribute documentation以查看有关属性如何工作的详细信息。