Внедрение facter в содержимое файла - без явного преобразования Hash в String - PullRequest
0 голосов
/ 13 июня 2018

Я хочу добавить некоторые значения из facter <prop> в содержимое файла.

Работает с $fqdn, так как facter fqdn возвращает string .

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]: сбой проверки для значения {"Architecture" => "x86_64", "family" => "RedHat", "hardware"=> "x86_64", "name" => "CentOS", "release" => {"full" => "7.4.1708", "major" => "7", "minor" => "4"}, "selinux" => {"config_mode" => «принудительное исполнение», «config_policy» => «таргетинг», «current_mode» => «принудительное исполнение», «включенный» => true, «принудительное исполнение» => правда, «policy_version»"=>" 28 "}} в содержимом класса: нет неявного преобразования Hash в String (файл: /etc/puppetlabs/code/environments/production/manifests/site.pp, строка: 2)

Как преобразовать хеш в строку внутри файла pp?

1 Ответ

0 голосов
/ 13 июня 2018

Если у вас есть Puppet> = 4.5.0, теперь можно напрямую преобразовывать различные типы данных в строки в манифестах (то есть в файлах pp).Функции преобразования задокументированы здесь .

Это будет делать то, что вы хотите:

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

или лучше:

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

На моем MacOS 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,
}

Это на самом деле приводит к хэш-форматированию, немного отличающемуся от формата, так как Ruby, а не Puppet, форматирует:

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