Puppet 和 Hiera 中的递归查找问题

Recursive lookup problem in Puppet and Hiera

Puppet 代理失败并出现以下错误:

    Error: Could not retrieve catalog from remote server: 
    Error 500 on SERVER: Server Error: Lookup of key 'my.net.hosts.agent01' failed: 
    Recursive lookup detected in [my.net.needs_proxy, my.net.hosts.agent01] on node agent01

我的 Hiera 设置如下。特定于节点的文件:

# environments/test/data/nodes/agent01.yaml
---
my:
  net:
    host:
      ip_address: "%{lookup('my.net.hosts.agent01')}"
      
    needs_proxy: false

和“子系统”特定文件:

# environments/test/data/subsystems/main.yaml
---
my:
  net:
    hosts:
      agent01: "192.168.0.1"
      agent02: "192.168.0.2"
      agent03: "192.168.0.3"

    needs_proxy: false

hiera.yaml 如下:

# environments/test/hiera.yaml
---
version: 5
hierarchy:
  - name: "Per-node data"
    path: "nodes/%{::trusted.certname}.yaml"
  - name: "Per-subsystem data"
    path: "subsystems/%{::subsystem}.yaml"
  - name: "Common and fallback data"
    path: "common.yaml"

AFAICT 设置正确,上面的两个文件都被考虑在节点 agent01 的层次结构中。

预期的行为是特定于节点的文件 (agent1.yaml) 中的查找插值 %{lookup('my.net.hosts.agent01')} 获取在特定于子系统的文件 (main.yaml) 中找到的值.但这并没有发生,并产生了上述错误。

我看不出任何明显的错误,也许我遗漏了什么。感谢任何帮助。

(编辑添加 hiera.yaml)

AFAICT it is correctly set-up and both files above are considered in the hierarchy for node agent01.

您需要了解 Hiera 是一个平面键/值存储,恰好支持结构化类型的值。您演示的与 lookup 插值函数一起使用的键/子键语法可能会导致人们将数据模型误认为是某种树,但这种观点会导致不正确的期望。

在这种情况下,所提供的 Hiera 数据为键 my 定义了两个值。 这些值的结构完全是次要考虑因素。您没有覆盖该键的默认查找策略,您可以优先查找整个值 那个键。您的数据定义存在两个问题:

  1. 这些值的 highest-priority(在这种情况下是唯一重要的值)不提供您尝试通过 lookup 函数检索的数据.

  2. 正如诊断所说,您有一个递归查找:为了加载与键 my 关联的值,其中的 lookup 函数要求 Hiera 首先加载键的值 my.

您可以通过为 my 指定 deep 合并来解决 (1),但我不希望这样解决 (2)。

您需要重构数据,同时牢记 Hiera 的扁平(-ish)数据模型。其中一项是或包含 IP 地址查找 table 并不是特别的问题,但只能在外部或从不同项目的值中引用。