查找功能在 Puppet 配置文件中不起作用
Lookup function does not work within the Profile for Puppet
在人偶 运行 期间,我的节点上的事件查看器出现以下错误。我怀疑问题出在我的个人资料中不正确的查找功能。
Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Evaluation Error: Error while evaluating a Resource Statement, Scconfig::Coserveradmin[SomeSettings]:
parameter 'parameterA' expects a String value, got Undef
parameter 'parameterB' expects a String value, got Undef
parameter 'parameterC' expects a String value, got Undef
parameter 'parameterD' expects a String value, got Undef
coserveradmin
是具有所有字符串参数的 define
资源。我想从 Json 文件
中查找值
{
"SASettings" : {
"Watchdog" : {
"ParameterA" : "somevalue",
"ParameterB" : "somevalue"
},
"Serversettings" : {
"ParameterC" : "somevalue",
"ParameterD" : "somevalue",
},
"GeneralSettings" : {
"ParameterE" : "somevalue",
"ParameterF" : "somevalue",
},
"customsettings_prod" : {
"ParameterG" :"somevalue",
"ParameterH" : "%{facts.hostname}.example-cloud.com"
},
"customsettings_dev" : {
"ParameterI" :"",
"ParameterK" : "%{facts.hostname}.example.net"
}
}
}
在我的 hiera.yaml 文件中,我定义了 json 文件的名称和路径。
- name: "Desired Some Settings"
path: "default/serveradmin.json"
在配置文件中我有以下代码。
class profile::scconfig_someprofile_a {
.
.
.
$hname= $::facts['hostname']
$mac= "${facts['macaddress'].delete(':')}"
$adminpropeties = lookup('SASettings')
if $hname=~someregex {
scconfig::coserveradmin{ 'SomeSettings':
property1 => $adminpropeties['customsettings_prod.ParameterG'],
property2 => $adminproperties['Watchdog.ParameterA'],
property3 => $adminproperties['Watchdog.ParameterB'],
property4 => $adminproperties['Serversettings.ParameterC'],
.
.
.
.
and so on
.
macaddress => $mac,
}
elsif $hname=~someregex {
scconfig::coserveradmin{ 'SomeSettings':
property1 => $adminpropeties['customsettings_dev.ParameterI'],
property2 => $adminproperties['Watchdog.ParameterA'],
property3 => $adminproperties['Watchdog.ParameterB'],
property4 => $adminproperties['Serversettings.ParameterC'],
.
.
.
.
and so on
.
macaddress => $mac,
}
还根据要求为 "define" 资源添加代码。
define scconfig::coserveradmin(
String $Property1,
String $Property2,
String $Property3,
String $Property4,
.
.
.
String $macaddress,
) {
$dscmoduleversion = lookup('requires.modules.codsc.version')
if $dscmoduleversion != '' {
$module = {
'name' => 'codsc',
'version' => $dscmoduleversion,
}
}else{
$module = 'codsc'
}
$configname1='someconfig1'
$configname2='someconfig2'
$configname3='someconfig3'
dsc { 'someconfig1':
require => lookup('requires.cloudopssoftware'),
resource_name => 'Someresourcename',
module => $module,
properties => {
configname => $configname1,
Prop1 => $Property1,
Prop2 => $Property2,
Prop3 =>$Property3,
},
}
dsc { 'someconfig2':
require => lookup('requires.cloudopssoftware'),
resource_name => 'someresourcename2',
module => $module,
properties => {
configname => $configname2,
Prop1 => $Property4,
Prop2 => $Property5,
Prop3 =>$Property6,
},
}
dsc { 'someconfig3':
require => lookup('requires.cloudopssoftware'),
resource_name => 'someresourcename3',
module => $module,
properties => {
configname => $configname3,
Prop1 => $Property6,
Prop2 => $Property7,
Prop3 =>$Property8,
.
.
.
Propn => $macaddress
},
}
请注意,最后一个 属性 即 macaddress 是在配置文件 class 中评估的,因此我没有看到任何错误。
任何想法可能是什么问题。
I suspect the issue is with incorrect lookup function in my profile.
情况似乎并非如此。如果您的 lookup()
调用未成功查找并返回哈希值,那么当您尝试提取值时会出现不同的错误。
我想您可能检索到了错误的哈希值——这可能是您的 hiera 配置和/或数据的问题,而不是 lookup()
调用本身的问题——但它是否是正确的哈希值或错误的,您尝试用于从中提取数据的语法与问题中提供的哈希结构不匹配。例如,这个表达式
$adminpropeties['customsettings_prod.ParameterG']
尝试检索键为 'customsettings_prod.ParameterG'
的值,但显示的数据不包含该键。
你似乎想要的是
$adminpropeties['customsettings_prod']['ParameterG']
提取具有键 'customsettings_prod'
的值,并且该值本身是哈希,提取与键 'ParameterG'
关联的 其 值。
或者,您可能会发现 the dig()
function 从嵌套数据结构中提取数据很方便,例如您的数据结构:
dig($adminpropeties, 'customsettings_prod', 'ParameterG')
在人偶 运行 期间,我的节点上的事件查看器出现以下错误。我怀疑问题出在我的个人资料中不正确的查找功能。
Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Evaluation Error: Error while evaluating a Resource Statement, Scconfig::Coserveradmin[SomeSettings]:
parameter 'parameterA' expects a String value, got Undef
parameter 'parameterB' expects a String value, got Undef
parameter 'parameterC' expects a String value, got Undef
parameter 'parameterD' expects a String value, got Undef
coserveradmin
是具有所有字符串参数的 define
资源。我想从 Json 文件
{
"SASettings" : {
"Watchdog" : {
"ParameterA" : "somevalue",
"ParameterB" : "somevalue"
},
"Serversettings" : {
"ParameterC" : "somevalue",
"ParameterD" : "somevalue",
},
"GeneralSettings" : {
"ParameterE" : "somevalue",
"ParameterF" : "somevalue",
},
"customsettings_prod" : {
"ParameterG" :"somevalue",
"ParameterH" : "%{facts.hostname}.example-cloud.com"
},
"customsettings_dev" : {
"ParameterI" :"",
"ParameterK" : "%{facts.hostname}.example.net"
}
}
}
在我的 hiera.yaml 文件中,我定义了 json 文件的名称和路径。
- name: "Desired Some Settings"
path: "default/serveradmin.json"
在配置文件中我有以下代码。
class profile::scconfig_someprofile_a {
.
.
.
$hname= $::facts['hostname']
$mac= "${facts['macaddress'].delete(':')}"
$adminpropeties = lookup('SASettings')
if $hname=~someregex {
scconfig::coserveradmin{ 'SomeSettings':
property1 => $adminpropeties['customsettings_prod.ParameterG'],
property2 => $adminproperties['Watchdog.ParameterA'],
property3 => $adminproperties['Watchdog.ParameterB'],
property4 => $adminproperties['Serversettings.ParameterC'],
.
.
.
.
and so on
.
macaddress => $mac,
}
elsif $hname=~someregex {
scconfig::coserveradmin{ 'SomeSettings':
property1 => $adminpropeties['customsettings_dev.ParameterI'],
property2 => $adminproperties['Watchdog.ParameterA'],
property3 => $adminproperties['Watchdog.ParameterB'],
property4 => $adminproperties['Serversettings.ParameterC'],
.
.
.
.
and so on
.
macaddress => $mac,
}
还根据要求为 "define" 资源添加代码。
define scconfig::coserveradmin(
String $Property1,
String $Property2,
String $Property3,
String $Property4,
.
.
.
String $macaddress,
) {
$dscmoduleversion = lookup('requires.modules.codsc.version')
if $dscmoduleversion != '' {
$module = {
'name' => 'codsc',
'version' => $dscmoduleversion,
}
}else{
$module = 'codsc'
}
$configname1='someconfig1'
$configname2='someconfig2'
$configname3='someconfig3'
dsc { 'someconfig1':
require => lookup('requires.cloudopssoftware'),
resource_name => 'Someresourcename',
module => $module,
properties => {
configname => $configname1,
Prop1 => $Property1,
Prop2 => $Property2,
Prop3 =>$Property3,
},
}
dsc { 'someconfig2':
require => lookup('requires.cloudopssoftware'),
resource_name => 'someresourcename2',
module => $module,
properties => {
configname => $configname2,
Prop1 => $Property4,
Prop2 => $Property5,
Prop3 =>$Property6,
},
}
dsc { 'someconfig3':
require => lookup('requires.cloudopssoftware'),
resource_name => 'someresourcename3',
module => $module,
properties => {
configname => $configname3,
Prop1 => $Property6,
Prop2 => $Property7,
Prop3 =>$Property8,
.
.
.
Propn => $macaddress
},
}
请注意,最后一个 属性 即 macaddress 是在配置文件 class 中评估的,因此我没有看到任何错误。
任何想法可能是什么问题。
I suspect the issue is with incorrect lookup function in my profile.
情况似乎并非如此。如果您的 lookup()
调用未成功查找并返回哈希值,那么当您尝试提取值时会出现不同的错误。
我想您可能检索到了错误的哈希值——这可能是您的 hiera 配置和/或数据的问题,而不是 lookup()
调用本身的问题——但它是否是正确的哈希值或错误的,您尝试用于从中提取数据的语法与问题中提供的哈希结构不匹配。例如,这个表达式
$adminpropeties['customsettings_prod.ParameterG']
尝试检索键为 'customsettings_prod.ParameterG'
的值,但显示的数据不包含该键。
你似乎想要的是
$adminpropeties['customsettings_prod']['ParameterG']
提取具有键 'customsettings_prod'
的值,并且该值本身是哈希,提取与键 'ParameterG'
关联的 其 值。
或者,您可能会发现 the dig()
function 从嵌套数据结构中提取数据很方便,例如您的数据结构:
dig($adminpropeties, 'customsettings_prod', 'ParameterG')