/ etc / hosts模板的木偶内容与facter

我已经build立了一个模板来设置/ etc / hosts文件的内容。 这是我的模板:

127.0.0.1 localhost.localdomain localhost <%= scope.lookupvar('ipaddress') %> <%= scope.lookupvar('fqdn') %> <%= scope.lookupvar('hostname') %> 

这是正确的工作,但我想,在具有多个networking接口的节点上,为这两个IP地址提供主机名。 然后我尝试了以下模板:

 <%= scope.lookupvar('interfaces').each do |interface| %> <%= scope.lookupvar('ipaddress_'+interface) %> 

木偶在客户端显示错误:

 Could not retrieve catalog from remote server: wrong header line format 

当然,我可以使用傀儡提供的来pipe理主机文件,但是像这样:

 # host entry with multiple aliases host { 'dashboard': ip => [$ipaddress_eth0, $ipaddress_eth1] host_aliases => [ 'nagios', 'munin' ], } 

是不允许的(ip不能是一个数组显然,而且,我无法找出节点是否有2个接口或只有一个)。

谢谢你的帮助!


然后我创build了这个事实,导出到目标节点。 它应该返回一个使用的IP地址数组:

 Facter.add('network_interfaces') do result = [] setcode do f = File.open('/etc/network/interfaces', 'r') f.each_line{|line| if line =~ /^.*address ((([0-9]{1,3})\.){3}([0-9]{1,3})).*$/i result << $1 end } result end end 

这是facter -p network_interfaces的输出

 192.168.10.10 172.23.10.10 

这是我的代码来创build主机行:

 # host entry with multiple aliases host { 'dashboard': ip => $network_interfaces host_aliases => [ 'nagios', 'munin' ], } 

但傀儡失败与错误:

 Parameter ip failed: Invalid IP address "192.168.10.10172.23.10.10" 

显然,事实返回的ip数组不是被puppet视为一个数组,而是一个常规的string。

是否有可能返回一个数组而不是string作为数组的连接元素?

非常感谢!

您在以下语法错误:

 <%= scope.lookupvar('interfaces').each do |interface| %> <%= scope.lookupvar('ipaddress_'+interface) %> 
  1. 你开始迭代时使用<%= :它应该是<%
  2. 你不closures你的块

改为像这样:

 <% scope.lookupvar('interfaces').each do |interface| %> <%= scope.lookupvar('ipaddress_'+interface) %> <% end %> 

其次, interfaces是一个代表机器上所有可用接口的String 。 您需要将该String转换为Enumerable ,在这种情况下#split方法派上用场:

 <% scope.lookupvar('interfaces').split(",").each do |interface| %> <%= scope.lookupvar('ipaddress_'+interface) %> <% end %> 

好的,根据男主人的说法,每个主持人应该有一条线。

每个主机不应该有多个IP地址。

我做了以下工作:如果我可以在我的节点上find生产接口,则使用此接口,否则,我使用用于pipe理的默认接口。

我的事实是这样的:

 Facter.add('ip_prod') do require 'facter/util/ip' confine :interface => "eth0,eth1,lo" setcode do ip = Facter::Util::IP.get_interface_value('eth1', 'ipaddress') ip end end 

只有当eth0和eth1作为物理接口时才加载。

作为主机模板; 我使用这个:

 <% if @ip_prod %> <%= ip_prod %> <%= scope.lookupvar('fqdn') %> <%= scope.lookupvar('hostname') %> <% else %> <%= ip_admin %> <%= scope.lookupvar('fqdn') %> <%= scope.lookupvar('hostname') %> <% end%> 

我碰到每个可能的networking接口,如果相关的事实存在,就分配它,否则我使用在这个文件中分配pipe理IP的“默认”事实。

感谢您的帮助,希望能帮助别人:)