используя несколько файлов hiera.yaml с puppet - PullRequest
2 голосов
/ 01 мая 2019

после введения Debian в нашу инфраструктуру в качестве ОС для оборудования, а также для виртуальных машин в нашей среде Ganeti, я пытаюсь сейчас развернуть списки подходящих источников для хостов Debian, используя локальный файл hiera.yaml в модуле, который онself.

Мы развертываем списки источников apt для Ubuntu, а также наше локальное хранилище с выделенным модулем в качестве оболочки для модуля puppetlabs / apt.Глобальный hiera.yaml на марионеточном сервере выглядит следующим образом:

---
version: 5
defaults:
  datadir: data
  data_hash: yaml_data
hierarchy:
  - name: "module scope"
    paths:
      - "%{facts.fqdn}.yaml"
      - "%{facts.context}-%{facts.location}-%{facts.hostgroup}.yaml"
      - "%{facts.context}-%{facts.datacenter}-%{facts.hostgroup}.yaml"
      - "%{facts.context}-%{facts.hostgroup}.yaml"
      - "%{facts.context}-%{facts.location}.yaml"
      - "%{facts.context}-%{facts.datacenter}.yaml"
      - "%{facts.context}.yaml"
      - common.yaml
    datadir: "/etc/puppetlabs/code/environments/%{environment}/modules/%{module_name}/data"

В модуле apt_sources common.yaml содержит ключ apt нашего репо.%{facts.context}.yaml содержит все списки источников Ubuntu и наших репо, что достаточно в большинстве случаев, поэтому для некоторых групп хостов нам нужны некоторые внешние репо, такие как mysql, percona, ceph и т. Д., И эти источникивключены в соответствующий файл yaml, либо в %{facts.context}-%{facts.hostgroup}.yaml, либо в другие файлы yaml, и в конце мы просто объединяем хеши в %{facts.context}.yaml и в другие соответствующие файлы yaml.Теперь, когда в Debian все становится немного сложнее, мне пришлось реструктурировать каталог data в нашем модуле apt_sources, чтобы списки источников Debian были отделены от списков источников Ubuntu следующим образом:

apt_sources$ tree -L 1 data/
data/
├── common.yaml
├── Debian
└── Ubuntu

2 directories, 1 file
apt_sources$ 

и ясоздал локальный файл hiera.yaml со следующим содержимым:

---
version: 5
defaults:
  datadir: data
  data_hash: yaml_data
hierarchy:
  - name: "module scope"
    paths:
      - "%{facts.operatingsystem}/%{facts.fqdn}.yaml"
      - "%{facts.operatingsystem}/%{facts.context}-%{facts.location}-%{facts.hostgroup}.yaml"
      - "%{facts.operatingsystem}/%{facts.context}-%{facts.datacenter}-%{facts.hostgroup}.yaml"
      - "%{facts.operatingsystem}/%{facts.context}-%{facts.hostgroup}.yaml"
      - "%{facts.operatingsystem}/%{facts.context}-%{facts.location}.yaml"
      - "%{facts.operatingsystem}/%{facts.context}-%{facts.datacenter}.yaml"
      - "%{facts.operatingsystem}/%{facts.context}.yaml"
      - common.yaml
    datadir: "/etc/puppetlabs/code/environments/%{environment}/modules/%{module_name}/data"

Соответствующая часть нашей init.pp, которая должна поддерживать Puppet 3, совместима с некоторой инфраструктурой QA:

#
class apt_sources (
  Hash $gnupg_key     = {},
  Hash $pin           = {},
  $proxy              = {},
  $purge_sources      = false,
  Hash $settings      = {},
  Hash $sources       = {},
  ) {

  class { 'apt':
    update => {
      frequency => 'daily',
    },
    purge  => {
      'sources.list'   => $purge_sources,
      'sources.list.d' => $purge_sources,
    },
  }

  create_resources('apt::source', hiera_hash('apt_sources::sources', $sources))
  create_resources('apt::setting', hiera_hash('apt_sources::settings', $settings))
  create_resources('apt::key', hiera_hash('apt_sources::gnupg_key', $gnupg_key))
  create_resources('apt::pin', hiera_hash('apt_sources::pin', $pin))

  Apt::Pin <| |> -> Apt::Source <| |> -> Apt::Ppa <| |> -> Exec['apt_update'] -> Package <| |>
}

Теперь при развертывании apt_sources для хоста с дополнительным файлом %{facts.context}-%{facts.hostgroup}.yaml списки источников не объединяются, а выигрывают только более специфичные файлы yaml, в данном случае файл %{facts.context}-%{facts.hostgroup}.yaml, поэтому основные репозитории в %{facts.context}.yaml не развернуто.В puppetserver я вижу в файле журнала, как Puppet ищет ключи, используя глобальный hiera.yaml, а затем локальный hiera.yaml, но только для первого хэша, тогда есть эта строка:

Hiera configuration recreated due to change of scope variables used in interpolation expressions

Puppet продолжает искать другие ключи, но на этот раз использует только глобальную конфигурацию hiera.yaml и пропускает локальную конфигурацию, поэтому Puppet не может найти хэш, и использует значение по умолчанию {}.

К сожалению, я не могу заменитьhiear_hash с lookup функцией на данный момент из-за совместимости с Puppet 3.

РЕДАКТИРОВАТЬ

Изначально только с Ubuntu в качестве ОС у меня были все данные hiera в каталоге data/ и init.pp выглядело так:

#
class apt_sources (
  $proxy         = {},
  $purge_sources = false,
  $merge_sources = true,
  ) {

  class { 'apt':
    update => {
      frequency => 'daily',
    },
    purge  => {
      'sources.list'   => $purge_sources,
      'sources.list.d' => $purge_sources,
    },
  }

  if $merge_sources {
    $sources = hiera_hash('apt_sources::sources', {})
    create_resources('apt::source', $sources)
  }
  else {
    $sources = hiera('apt_sources::sources')
    create_resources('apt::source', $sources)
  }

  $settings = hiera_hash('apt_sources::settings', {})
  create_resources('apt::setting', $settings)

  $gnupg_key = hiera_hash('apt_sources::gnupg_key', {})
  create_resources('apt::key', $gnupg_key)

  $pin = hiera_hash('apt_sources::pin', {})
  create_resources('apt::pin', $pin)

  Apt::Pin <| |> -> Apt::Source <| |> -> Apt::Ppa <| |> -> Exec['apt_update'] -> Package <| |>
}

Может быть, кто-то может объяснить это поведение.

Спасибо за вашу помощь.

1 Ответ

2 голосов
/ 01 мая 2019

Я исправил это, добавив следующее к common.yaml:

lookup_options:
  apt_sources::sources:
    merge:
      strategy: deep

, далее еще я изменил оператор create_resources следующим образом:

create_resources('apt::source', $sources)
create_resources('apt::setting', $settings)
create_resources('apt::key', $gnupg_key)
create_resources('apt::pin', $pin)
...