Puppet agent run error "couldnt find valid string"

37 views
Skip to first unread message

nand...@gmail.com

unread,
May 14, 2021, 10:45:30 AM5/14/21
to Puppet Users
Hi all,

PE server version : PE 2019.8.5
Puppet agent version : 6.21.1 

Actually i have added profile class which calls hosts class and pass parameters to it .Then its been assigned to individual  nodegroup on console .
we were facing below 500 error while puppet agent run and that looks like validation of parameter as string .

I suspect this could be of Undef parameter validation but not sure what could be rectify this issue .

Can someone help me on what could be the error ?

Profile class :
--------------------
class profile::ldap_hosts () {

 

  class { '::hosts':

          host_entries => {

                        "ldaps1-dev.com.net" => { ensure => 'absent' },

                        "ldaps2-dev.com.net  " => { ensure => 'absent' },

                        " ldaps3-dev.com.net " => { ensure => 'absent' },

                        " ldaps4-dev.com.net  " => { ensure => 'absent' },

                        }

}

 

}

hosts class :

# == Class: hosts

#

# Manage /etc/hosts

#

class hosts (

  $collect_all           = false,

  $enable_ipv4_localhost = true,

  $enable_ipv6_localhost = false,

  $enable_fqdn_entry     = false,

  $use_fqdn              = true,

  $fqdn_host_aliases     = $::hostname,

  $localhost_aliases     = ['localhost',

                            'localhost4',

                            'localhost4.localdomain4'],

  $localhost6_aliases    = ['localhost6',

                            'localhost6.localdomain6'],

  $purge_hosts           = false,

  $target                = '/etc/hosts',

  $host_entries          = undef,

) {

 

 

  # validate type and convert string to boolean if necessary

  if is_string($collect_all) {

    $collect_all_real = str2bool($collect_all)

  } else {

    $collect_all_real = $collect_all

  }

 

  # validate type and convert string to boolean if necessary

  if is_string($enable_ipv4_localhost) {

    $ipv4_localhost_enabled = str2bool($enable_ipv4_localhost)

  } else {

    $ipv4_localhost_enabled = $enable_ipv4_localhost

  }

 

  # validate type and convert string to boolean if necessary

  if is_string($enable_ipv6_localhost) {

    $ipv6_localhost_enabled = str2bool($enable_ipv6_localhost)

  } else {

    $ipv6_localhost_enabled = $enable_ipv6_localhost

  }

 

  # validate type and convert string to boolean if necessary

  if is_string($enable_fqdn_entry) {

    $fqdn_entry_enabled = str2bool($enable_fqdn_entry)

  } else {

    $fqdn_entry_enabled = $enable_fqdn_entry

  }

 

  # validate type and convert string to boolean if necessary

  if is_string($use_fqdn) {

    $use_fqdn_real = str2bool($use_fqdn)

  } else {

    $use_fqdn_real = $use_fqdn

  }

 

  # validate type and convert string to boolean if necessary

  if is_string($purge_hosts) {

    $purge_hosts_enabled = str2bool($purge_hosts)

  } else {

    $purge_hosts_enabled = $purge_hosts

  }

 

  if $ipv4_localhost_enabled == true {

    $localhost_ensure     = 'present'

    $localhost_ip         = '127.0.0.1'

    $my_localhost_aliases = $localhost_aliases

  } else {

    $localhost_ensure     = 'absent'

    $localhost_ip         = '127.0.0.1'

    $my_localhost_aliases = undef

  }

 

  if $ipv6_localhost_enabled == true {

    $localhost6_ensure     = 'present'

    $localhost6_ip         = '::1'

    $my_localhost6_aliases = $localhost6_aliases

  } else {

    $localhost6_ensure     = 'absent'

    $localhost6_ip         = '::1'

    $my_localhost6_aliases = undef

  }

 

  if !is_string($my_localhost_aliases) and !is_array($my_localhost_aliases) {

    fail('hosts::localhost_aliases must be a string or an array.')

  }

 

  if !is_string($my_localhost6_aliases) and !is_array($my_localhost6_aliases) {

    fail('hosts::localhost6_aliases must be a string or an array.')

  }

 

  if $fqdn_entry_enabled == true {

    $fqdn_ensure          = 'present'

    $my_fqdn_host_aliases = $fqdn_host_aliases

    $fqdn_ip              = $::ipaddress

  } else {

    $fqdn_ensure          = 'absent'

    $my_fqdn_host_aliases = []

    $fqdn_ip              = $::ipaddress

  }

 

  Host {

    target => $target,

  }

 

  host { 'localhost':

    ensure => 'absent',

  }

 

  host { 'localhost.localdomain':

    ensure       => $localhost_ensure,

    host_aliases => $my_localhost_aliases,

    ip           => $localhost_ip,

  }

 

  host { 'localhost6.localdomain6':

    ensure       => $localhost6_ensure,

    host_aliases => $my_localhost6_aliases,

    ip           => $localhost6_ip,

  }

 

  if $use_fqdn_real == true {

    @@host { $::fqdn:

      ensure       => $fqdn_ensure,

      host_aliases => $my_fqdn_host_aliases,

      ip           => $fqdn_ip,

    }

 

    case $collect_all_real {

      # collect all the exported Host resources

      true:  {

        Host <<| |>>

      }

      # only collect the exported entry above

      default: {

        Host <<| title == $::fqdn |>>

      }

    }

  }

 

  resources { 'host':

    purge => $purge_hosts,

  }

 

  if $host_entries != undef {

    $host_entries_real = delete($host_entries,$::fqdn)

    validate_hash($host_entries_real)

    create_resources(host,$host_entries_real)

  }

}

Agent error :

May 14 08:59:48 dev-server puppet-agent[15635]: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Evaluation Error: Error while evaluating a Resource Statement, Evaluation Error: Error while evaluating a Function Call, hosts::localhost6_aliases must be a string or an array. (file: /etc/puppetlabs/code/environments/production7/modules/hosts/manifests/init.pp, line: 90, column: 5) on node cagmp-sup19b3.cag.dyn.nsroot.net

Regards,

navenk


earthgecko

unread,
May 15, 2021, 7:28:40 AM5/15/21
to Puppet Users
Hi avenk

I think you just need to change from declaring undef to using an empty array.  The code will throw the error where the class is NOT called with $enable_ipv6_localhost = true,

Change:
$my_localhost6_aliases = undef
to
$my_localhost6_aliases = []

As your own code is throwing the error:

 if !is_string($my_localhost6_aliases) and !is_array($my_localhost6_aliases) {

    fail('hosts::localhost6_aliases must be a string or an array.')

  }

undef is not a string and it is not an array.
I hope this solves the issue for you.
Reply all
Reply to author
Forward
0 new messages