после введения 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 <| |>
}
Может быть, кто-то может объяснить это поведение.
Спасибо за вашу помощь.