查找功能在 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')