使用带有木偶的多个hiera.yaml文件



在将Debian引入基础架构作为硬件的操作系统以及在我们的Ganeti环境中的VM之后,我现在正在尝试通过使用本地来部署Debian主机的APT源列表 hiera.yaml在模块中的文件。

我们正在部署Ubuntu的APT源列表以及我们的本地存储库,其中包含专用模块作为PuppetLabs/APT模块的包装器。Puppet服务器上的全局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和我们的回购源列表,在大多数情况下,这足够了,因此对于某些主机组,我们需要一些外部存储库,例如mysqlperconaceph等。在%{facts.context}-%{facts.hostgroup}.yaml或其他YAML文件中,最后我们只需合并%{facts.context}.yaml和其他相关YAML文件中的哈希。现在,随着Debian的情况变得更加复杂,我不得不重组apt_sources模块中的data目录,因此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的相关部分必须保持木偶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 <| |>
}

现在,当部署具有额外%{facts.context}-%{facts.hostgroup}.yaml文件的主机的APT_Sources时,源列表没有合并,而只有更具体的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作为OS,我在目录data/中拥有所有HIERA数据,而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 <| |>
}

也许有人可以解释这种行为。

谢谢您的帮助。

我通过将以下内容添加到 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)

相关内容

  • 没有找到相关文章

最新更新