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
定义了两个值。 这些值的结构完全是次要考虑因素。您没有覆盖该键的默认查找策略,您可以优先查找整个值 那个键。您的数据定义存在两个问题:
这些值的 highest-priority(在这种情况下是唯一重要的值)不提供您尝试通过 lookup
函数检索的数据.
正如诊断所说,您有一个递归查找:为了加载与键 my
关联的值,其中的 lookup
函数要求 Hiera 首先加载键的值 my
.
您可以通过为 my
指定 deep
合并来解决 (1),但我不希望这样解决 (2)。
您需要重构数据,同时牢记 Hiera 的扁平(-ish)数据模型。其中一项是或包含 IP 地址查找 table 并不是特别的问题,但只能在外部或从不同项目的值中引用。
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
定义了两个值。 这些值的结构完全是次要考虑因素。您没有覆盖该键的默认查找策略,您可以优先查找整个值 那个键。您的数据定义存在两个问题:
这些值的 highest-priority(在这种情况下是唯一重要的值)不提供您尝试通过
lookup
函数检索的数据.正如诊断所说,您有一个递归查找:为了加载与键
my
关联的值,其中的lookup
函数要求 Hiera 首先加载键的值my
.
您可以通过为 my
指定 deep
合并来解决 (1),但我不希望这样解决 (2)。
您需要重构数据,同时牢记 Hiera 的扁平(-ish)数据模型。其中一项是或包含 IP 地址查找 table 并不是特别的问题,但只能在外部或从不同项目的值中引用。