将facter注入文件内容 - 没有将Hash隐式转换为String

时间:2018-06-13 03:57:24

标签: puppet facter

我想将facter <prop>中的一些值注入文件内容。

它适用于$fqdn,因为facter fqdn会返回字符串

node default {
  file {'/tmp/README.md':
    ensure  => file,
    content => $fqdn, # $(facter fqdn)
    owner   => 'root',
  }

}

但是,它不适用于哈希对象(facter os):

   node default {
      file {'/tmp/README.md':
        ensure  => file,
        content => $os, # $(facter os) !! DOES NOT WORK
        owner   => 'root',
      }

   }

运行puppet agent -t时收到此错误消息:

  

错误:无法应用目录:参数内容失败   文件[/tmp/README.md]:Munging因价值而失败   {“architecture”=&gt;“x86_64”,“family”=&gt;“RedHat”,“hardware”=&gt;“x86_64”,   “name”=&gt;“CentOS”,“release”=&gt; {“full”=&gt;“7.4.1708”,“major”=&gt;“7”,   “minor”=&gt;“4”},“selinux”=&gt; {“config_mode”=&gt;“强制执行”,   “config_policy”=&gt;“有针对性”,“current_mode”=&gt;“强制执行”,   “启用”=&gt; true,“强制”=&gt; true,“policy_version”=&gt;“28”}}在课堂上   content:没有将Hash隐式转换为String(文件:   /etc/puppetlabs/code/environments/production/manifests/site.pp,line:   2)

如何将哈希转换为pp文件中的字符串?

1 个答案:

答案 0 :(得分:2)

如果你有Puppet&gt; = 4.5.0,现在可以将各种数据类型本地转换为清单中的字符串(即在pp文件中)。转换函数记录在here

这可以做你想要的:

file { '/tmp/README.md':
  ensure  => file,
  content => String($os),
}

或更好:

file { '/tmp/README.md':
  ensure  => file,
  content => String($facts['os']),
}

在我的Mac OS X上,这会导致文件包含:

{'name' => 'Darwin', 'family' => 'Darwin', 'release' => {'major' => '14', 'minor' => '5', 'full' => '14.5.0'}}

查看所有文档,因为有很多选项可能对您有用。

当然,如果你想要$ os事实中的密钥,

file { '/tmp/README.md':
  ensure  => file,
  content => $facts['os']['family'],
}

现在,如果您没有最新的Puppet,并且您没有字符串转换函数,那么执行此操作的旧方法将是通过模板和嵌入式Ruby(ERB),例如。

$os_str = inline_template("<%= @os.to_s %>")
file { '/tmp/README.md':
  ensure => file,
  content => $os_str,
}

这实际上会导致格式略有不同的Hash,因为Ruby,而不是Puppet进行格式化:

{"name"=>"Darwin", "family"=>"Darwin", "release"=>{"major"=>"14", "minor"=>"5", "full"=>"14.5.0"}}