我有许多主机需要在文件中使用不同的主服务器主机和唯一端口。所以端口和服务器的价值是已知的。
最终结果是我的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生成相似的文件呢?我不确定其他服务器及其端口的变量应如何。
答案 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以查看有关属性如何工作的详细信息。