我已经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) %>
<%= :它应该是<% 改为像这样:
<% 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的“默认”事实。
感谢您的帮助,希望能帮助别人:)