2017-02-19 3 views
1

Я использовал много купе, начиная с 0.x до версии 1.0, а затем менял задания, но теперь я вернулся к нему. Hiera in Puppet является для меня новичком (наряду с множеством других вещей).Назначение класса узлу на основе имени хоста через Hiera

Правильно ли я понимаю, что в принципе невозможно назначить классы для групп узлов на основе имени хоста (или имени сертификата), соответствующего Hiera?

Я использовал, например, назначение классов ntp-сервера, если хост был чем-то вроде «ntp1.foo.com». Это довольно просто с определениями node в site.pp, и я пытаюсь переместить эту концепцию в мир, основанный на Hiera. Я назначил Hiera другим классам и надеялся объединить все эти задания в одном месте.

Единственный способ, которым я нашел это, установить параметр с помощью некоторого не-Hiera и использовать его значение в Hiera для соответствия пути. Например, в моем enc сценарии экспортировать параметр, как это:

echo "parameters:" 
if [ ... ]; do echo " ntpRole: server; else echo " ntpRole: client"; fi 

и Hiera Я хотел бы сделать что-то вроде:

- "roles/ntp-%{ntpRole}" 

Я думаю, что можно было бы также сделать это с помощью пользовательского факта.

Это работает, но похоже на клочья. Есть ли лучшая/рекомендуемая альтернатива?

Одна проблема состоит в том, что каждый узел необходимо иметь значение (все присваивается ntp- то класс). Это работает для NTP, поскольку все машины являются либо NTP-клиентом, либо сервером, но для чего-то экзистенциального это не так.

Например: роль веб-сервера. Некоторые машины не будут веб-серверами, поэтому я не хочу включать этот класс, но для других, которые я делаю, и я действительно не хочу поддерживать это в файлах на узле и на самом деле не хочу имеют пустой класс *-none (например, web-none против web-server). Я хочу, чтобы все машины с именем www* или на основании некоторых других критериев загружали класс roles/web. Можно ли это сделать с Hiera?

+0

Для этого мы используем внешний пользовательский факт, так что факт будет иметь логику, к какой роли принадлежит этот узел, и в вашем hiera вы можете использовать этот факт для включения классов ролей. – Walid

ответ

0

Если ваши роли связаны с фактами сервера, то вы можете использовать настраиваемый факт для назначения ролей. Поскольку вы сказали, что раньше выполняли классификацию узлов на основе имени сервера, я предполагаю, что это маршрут, по которому вы хотите идти.

# custom role fact 
require 'facter' 

Facter.add(:role) do 
    case Facter.value(:hostname) 
    when /ntp/ then 'ntp-server' 
    when /www/ then 'web-server' 
    else abort 'Hostname does not provide a role.' 
    end 
end  

Вы можете настроить hiera конфигурации, как это:

:hierarchy: 
    - "nodes/%{::trusted.certname}" 
    - role/%{role} 
    - "common" 

Внутри файлов данных ролей, вы можете создать массив имен классов:

# role/web-server.yaml 
classes: 
    - web-server 

Внутри ваш главный (обычно $environment/manifest/site.pp:

# if no classes array, traverse the else block 
if hiera('classes', false) { 
    hiera_include('classes') 
} 
else { 
    # logic for your 'none' situations since the classes array was not present 
} 

Проверьте это для hiera_include информации: https://docs.puppet.com/hiera/3.2/puppet.html#assigning-classes-to-nodes-with-hiera-hierainclude. Обратите внимание, что он также объединит классы из ваших файлов данных fqdn.yaml.

Это даст вам функциональность, которую вы запрашиваете, и использует Hiera для включения классов по группировке узлов/имени хоста.

+0

Итак, если 'role' пуст, Hiera просто пропустит строку' role /% {role} ', когда ищет классы по иерархии? – Josh

+0

@ Josh В некотором смысле, да. Более точно, Hiera будет искать файл данных, который соответствует вашему 'else' случаю в пользовательском факте, и он будет несуществующим, так что уровень иерархии не будет предоставлять никаких данных. –

Смежные вопросы