Назад | Перейти на главную страницу

Марионетка: Как работает иерархия, если роль подобрана?

Я пытаюсь понять, как работает иерархия Puppet.

Мой марионеточный сервер hiera.yaml выглядит так:

[root@puppet puppet]# cat hiera.yaml 
:backends: 
  - yaml 
:yaml: 
  :datadir: '/etc/puppet/hieradata/%{::environment}' 
:hierarchy: 
  - fqdns/%{::fqdn} 
  - roles/%{::role} 
  - domains/%{::domain} 
  - common

Есть модули, которые я хочу, чтобы все серверы были, поэтому я поместил их в common.yaml файл, и есть модули для конкретных ролей, которые включены в каждый role.yaml файл.

Когда запускается сервер, который соответствует роли в Puppet, модули из role.yaml файл загружается первым. Мой вопрос: как только серверу соответствует роль ... остановится ли он на этом? или он продолжит иерархию и загрузит модули под common.yaml также?

Если нет, как я могу убедиться, что он будет вести себя именно так?

Изменить № 1: вот пример одного из role.yaml файлы:

[root@puppet roles]# cat dataorigin.yaml 
classes:
  - workspace

jdk_enable: true
jdk_ver: 1.6.0_41
component_ver: 1-1-5-17
tomcat_enable: true
debug_mode: true

fstab_params:
  mount1:
    mnt_src:  "isilonnj01.eyedcny.local:/ifs/Peer39/do_share"
    mnt_dest: "/doshare"
    mnt_opts: "tcp,hard,intr,noatime"
    mnt_dest_parent: ""

И сервер site.pp выглядит так:

hiera_include("classes", [])
Package {  allow_virtual => false, }
node default {
include stdlib
}

Изменить № 2: Вот пример модуля motd:

include stdlib
class motd {
    file { "/etc/custom_motd.sh":
    path    => '/etc/custom_motd.sh',
    ensure  => present,
    owner   => "root",
    group   => "root",
    mode    => "775",
    content => template('motd/custom_motd.sh.erb'),
    #require => Class['nagios_client'],
    }

    file_line { 'enable motd':
    ensure  => present,
    line    => '/etc/custom_motd.sh',
    path    => '/etc/profile',
    require  => File['/etc/custom_motd.sh']
    }
}

В motd module настроен в common.yaml файл, а в role.yaml В файле есть модуль, называемый рабочей областью. Как я могу сказать Puppet, что нужно загрузить motd module из common.yaml файл?

Hiera - это инструмент для поиска данные. Вы даете ему ключевое имя, и он просматривает свои файлы данных и возвращает первое совпадение (которое должно быть наиболее конкретным), с которым он сталкивается, перемещаясь вниз по своей иерархии.

Использование в марионетке, у вас есть больше вариантов, что делать, если для ключа более одного значения:

hiera
    Standard priority lookup. Gets the most specific value for a given key. 
    This can retrieve values of any data type (strings, arrays, hashes) 
    from Hiera.
hiera_array
    Uses an array merge lookup. Gets all of the string or array values 
    in the hierarchy for a given key, then flattens them into a single 
    array of unique values.
hiera_hash
    Uses a hash merge lookup. Expects every value in the hierarchy for
    a given key to be a hash, and merges the top-level keys in each 
    hash into a single hash. Note that this does not do a deep-merge 
    in the case of nested structures.

С помощью hiera как ENC для загрузки модулей работает как этот (Курсив добавлен):

Обратите внимание, что hiera_include функция использует поиск слияния массивов для получения массива классов; это означает, что каждый узел получит каждый класс из своей иерархии.

Итак, если вы следовали документации и использовали hiera_include, будут загружены все классы, указанные вами в иерархии узла.

В вашем примере, предполагая role=dataorigin, и это common.yaml выглядит так:

---
classes:
 - a

Ваш site.pp вызовет модули workspace, stdlib и a быть назначенным запрашивающему узлу.