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

эквивалент hiera_include для типов ресурсов

Я использую yumrepo встроенного типа. Я могу получить базовую интеграцию с hiera working

  yumrepo { hiera('yumrepo::name') :
    metadata_expire => hiera('yumrepo::metadata_expire'),
    descr           => hiera('yumrepo::descr'),
    gpgcheck        => hiera('yumrepo::gpgcheck'),
    http_caching    => hiera('yumrepo::http_caching'),
    baseurl         => hiera('yumrepo::baseurl'),
    enabled         => hiera('yumrepo::enabled'),
  }

Если я попытаюсь удалить это определение и вместо этого сделаю hiera_include('classes'), вот что у меня в соответствующем бэкэнде yaml

classes:
 - "yumrepo"

yumrepo::metadata_expire: 0
yumrepo::descr: "custom repository"
yumrepo::gpgcheck: 0
yumrepo::http_caching: none
yumrepo::baseurl: "http://myserver/custom-repo/$basearch"
yumrepo::enabled: 1

Я получаю эту ошибку на агенте

Ошибка 400 на сервере: не удалось найти класс yumrepo

Я думаю, вы не можете уйти от какого-то минимального объявления узла с типами ресурсов и иерархией? Может быть hiera_hash путь?

Я попытался это сделать, но возникла синтаксическая ошибка.

  yumrepo { 'hnav-development':
    hiera_hash('yumrepo')
  }

Я закончил использовать create_resources. По сути, он предоставляет возможность отображать определенные типы к узлам с hiera, примерно так же hiera_include делает с классами из коробки.

При такой настройке я могу объявить любое количество file типы ресурсов на любом уровне иерархии, плюс вся конфигурация находится в источниках данных hiera.

/etc/hiera.yaml

:hierarchy:
  - defaults
  - "%{environment}"

/var/lib/hiera/defaults.yaml

classes:
  - hiera_file_wrapper
hiera_file:
    hiera-two:
       path: /home/quickshiftin/hiera-two
       ensure: file
       content: 'Hiera two' 

/var/lib/hiera/production.yaml

hiera_file:
    hiera-baby:
       path: /home/quickshiftin/hiera-baby
       ensure: file
       content: 'Hiera baby!

модули / hiera_file_wrapper / манифесты / init.pp

class hiera_file_wrapper()
{
    create_resources(file, hiera_hash('hiera_file'))
}

манифесты / site.pp

hiera_include('classes')

поскольку yumrepo это тип ресурса, а не класс, который работать не будет.

Я бы сказал, поместил класс в названный yumrepo_myreponame и пусть он объявит yumrepo ресурс. Для этого вы можете поместить параметры класса в Hiera, если вам нужно, а затем передать их в объявление ресурса.

Например, у меня есть модуль включения EPEL для сервера, который можно поставить в его Hiera classes массив, чтобы включить его. Все его содержание:

class epel_yumrepo {
  yumrepo { "epel":
    descr          => 'Extra Packages for Enterprise Linux 6 - $basearch',
    enabled        => 1,
    gpgcheck       => 1,
    gpgkey         => 'http://download.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6',
    mirrorlist     => 'https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch',
    failovermethod => "priority",
  }
}

Предположим, у вас есть репозиторий yum с именем hnav, и вам нужно, чтобы у него был другой URL-адрес в зависимости от того, какую версию ОС вы используете, 5 или 6.

Вы настроили свою иерархию в /etc/puppet/hiera.yaml лайк

:hierarchy:
- "%{::operatingsystemmajrelease}"
- common

Таким образом, hiera сначала будет искать файл yaml, названный в честь версии ОС, 5.yaml или 6.yaml. Если он не найдет там значения, он будет искать в common.yaml.

Вы написали параметризованный класс, чтобы hiera могла автоматически указывать URL-адрес.

модули / hnav / manifest.init.pp

class hnav ( $url ) {
  yumrepo { 'hnav':
    enabled => true,
    baseurl => $url
  }
}

Если по какой-то причине вам не нравились параметризованные классы, вы могли бы написать приведенное выше как

class hnav {
  yumrepo { 'hnav':
    enabled => true,
    baseurl => hiera('hnav::url')
  }
}

Затем вы настроили классы, которые вы хотели применить ко всем вашим узлам.

common.yaml

classes:
  - hnav

И вы устанавливаете значения для URL

5.yaml

hnav::url: http://example.com.yum/5/

6.yaml

hnav::url: http://example.com.yum/6/

Это действительно искусственный пример, но, возможно, он поможет вам понять, где используется hiera.

Я создал функциональность hiera_manifest на своей работе. По сути, он позволяет вам вызывать модули, классы, параметры и определенные типы через hiera yaml.

Я просто разместил это на Github, чтобы поделиться: https://github.com/mlbam/hiera_manifest

Это дает небольшие преимущества в том, что параметры также устанавливаются во время вызова модуля, класса или типа.

Следует отметить различие в некотором синтаксисе определений ресурсов при использовании метапараметров. Кроме того, при устранении неполадок ошибки иногда остаются в манифесте, и вы не получаете правильного сообщения об ошибке для модуля, который выдает ошибку.