puppetlabs / puppet-lint

Check that your Puppet manifests conform to the style guide

Home Page:https://puppetlabs.github.io/puppet-lint/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

puppet-lint --fix crashes on NoMethodError

pikrzysztof opened this issue · comments

puppet-lint version: 2.4.2
ruby version: 3.0.3-p157
platform: x86_64-linux
file path: ./modules/kt_defaults/manifests/filebeat.pp
file contents:

class kt_defaults::filebeat (
  $version = '6.8.4',
  $use_oss = true,
  $output_hosts = [
    'ls1.local.kentik.com',
    'ls2.local.kentik.com',
    'ls3.local.kentik.com',
  ],
  $disable_docker_module = false,
  $docker_log_paths = ['/var/lib/docker/containers/*/*.log'],
  $filters_global = [],
  $filters_fqdn = [],
  $output_ports = undef,
  $use_ssl = undef,
  $force_ls = false, # allow localvm to force output to logstash
){

  require stdlib
  require kt_defaults::certs::ssl
  include kt_elk::conf

  $description = "Filebeat 6.x - includes docker metadata module natively"
  $servicename = "filebeat"
  $servicedir  = "/data/service/${servicename}"

  $filebeat_ssl = kt_pick('kt_defaults::filebeat::use_ssl', [$use_ssl, $kt_elk::conf::logstash['filebeat_ssl']])
  $ls_ports     = kt_pick('kt_defaults::filebeat::output_ports', [$output_ports, $kt_elk::conf::logstash['ports']])

  # default to file output on localvm, but allow this to be overridden
  if ($kentik::env_name == 'staging' or $kentik::env_name == "localvm") and $force_ls == false {
    $output_ls = false
  } else {
    $output_ls = true # send to logstash by default
  }

  # make the curl command httpsproxy friendly (puppet does not load profile.d env data in exec)
  $httpproxyhost=lookup("kt_defaults::httpproxy::host", String, undef, "")
  $httpproxyport=lookup("kt_defaults::httpproxy::port", Integer, undef, 0)
  # if httpproxy hiera is present, add --proxy flag to curl request
  if $httpproxyhost != "" {
    if $httpproxyport != 0 {
      $curl_proxy_opts = "--proxy http://${httpproxyhost}:${httpproxyport}"
    }
  } else {
    $curl_proxy_opts = ""
  }

  /*
    configuration sanity checks
  */
  if size($output_hosts) <= 0 {
    fail('Must provide a non-empty array for $output_hosts.')
  }
  if $filebeat_ssl == true {
    if 'local.kentik.com' in $output_hosts[0] == false {
      # quick and dirty check to make sure we are using the correct domains
      fail('If using filebeat + ssl only domains with "*.local.kentik.com" will work with the currently hardcoded cert paths.')
    }
  }

  # if the current filebeat version on the host (i.e. filebeat_version) matches
  # version paramater - noop, else download version and install
  if $filebeat_version {
    # when comparing variables w/ regex DO NOT wrap string with `/` or it will not be interpolated, only use =~
    if $filebeat_version =~ $version {
      ## notice("CAUGHT in conditional: expected: ${version}, has: ${filebeat_version}")
      package { 'filebeat':
        ensure  => installed,
      }
    } else {
      ## notice("PASSED THROUGH conditional: expected: ${version}, has: ${filebeat_version}")
      $url = "artifacts.elastic.co/downloads/beats/filebeat"
      if $use_oss == true {
        $package = "filebeat-oss-${version}-amd64.deb"
      } else {
        $package = "filebeat-${version}-amd64.deb"
      }
      # curl the filebeat deb into /tmp
      exec { 'get_filebeat':
        command => "/usr/bin/curl ${curl_proxy_opts} -L https://$url/$package --output /tmp/$package",
        creates => "/tmp/$package",
      }

      # ensure latest version of the deb is installed
      package { 'filebeat':
        ensure   => latest,
        provider => dpkg,
        source   => "/tmp/$package",
        require  => Exec['get_filebeat'];
      }
      # dep-chain to restart filebeat services if the package was upgraded/installed
      ~> Service['filebeat']
      ~> Service['filebeat-journald']
      }
    }

/*
  filebeat:   standard filebeat service installed by deb package.
*/
  file {
    [
      "${servicedir}",
      "${servicedir}/scripts",
      "${servicedir}/output",
      "/etc/systemd/system/filebeat.service.d",
    ]:
    ensure  => 'directory',
    force   => true;
  }

  # use custom unit service file
  file { '/etc/systemd/system/filebeat.service':
    owner   => root,
    group   => root,
    source  => 'puppet:///modules/kt_defaults/filebeat/filebeat/filebeat.service',
    require => [
      Package['filebeat'],
    ];
  }

  # set all systemd overrides in an execstart file
  file { '/etc/systemd/system/filebeat.service.d/execstart.conf':
    owner   => root,
    group   => root,
    source  => 'puppet:///modules/kt_defaults/filebeat/filebeat/execstart.conf',
    require => [
      Package['filebeat'],
      File['/etc/systemd/system/filebeat.service.d'],
    ];
  }

  # kentik custom configurations live primarily in the kt_defaults files/filebeat
  # directory.
  file { '/etc/filebeat/filebeat.yml':
    content => template('kt_defaults/filebeat/filebeat/filebeat.yml.erb'),
    require => Package['filebeat'],
    notify  => Service['filebeat'];
  }

  # enforce a require which ensures all of the
  # above config files are present in their directories
  service { 'filebeat':
    provider  => 'systemd',
    ensure    => 'running',
    enable    => 'true',
    require   => [
      File['/etc/systemd/system/filebeat.service.d/execstart.conf'],
      File['/etc/filebeat-journald/filebeat.yml'],
    ];
  }

  # enable telegraf plugin for service
  kt_defaults::telegraf::input {
    'filebeat':;
  }

/*
  filebeat-journald:  uses same binary as filebeat but implements the stdin input
                      from journalctl. When filebeat uses the stdin input IT CANNOT
                      use any other inputs (i.e. log, docker etc...)
*/
  file {
    [
      "/etc/${servicename}-journald",
      "/var/lib/${servicename}-journald",
      "/var/log/${servicename}-journald",
      "/etc/systemd/system/filebeat-journald.service.d",
    ]:
    ensure  => 'directory',
    force   => true;
  }

  #
  file { '/etc/systemd/system/filebeat-journald.service':
    owner   => root,
    group   => root,
    source  => 'puppet:///modules/kt_defaults/filebeat/filebeat-journald/filebeat-journald.service',
    require => [
      Package['filebeat'],
    ];
  }

  # set all systemd overrides in an execstart file
  file { '/etc/systemd/system/filebeat-journald.service.d/execstart.conf':
    owner   => root,
    group   => root,
    source  => 'puppet:///modules/kt_defaults/filebeat/filebeat-journald/execstart.conf',
    require => [
      Package['filebeat'],
      File['/etc/systemd/system/filebeat-journald.service.d'],
    ];
  }

  # kentik custom configurations live primarily in the kt_defaults files/filebeat
  # directory.
  file { '/etc/filebeat-journald/filebeat.yml':
    content => template('kt_defaults/filebeat/filebeat-journald/filebeat.yml.erb'),
    notify  => Service['filebeat-journald'],
    require => [
      Package['filebeat'],
      File['/etc/filebeat-journald'],
      File['/var/lib/filebeat-journald'],
      File['/var/log/filebeat-journald'],
    ];
  }

  # enforce a require which ensures all of the
  # above config files are present in their directories
  service { 'filebeat-journald':
    provider  => 'systemd',
    ensure    => 'running',
    enable    => 'true',
    require   => [
      File['/etc/systemd/system/filebeat-journald.service'],
      File['/etc/systemd/system/filebeat-journald.service.d/execstart.conf'],
      File['/etc/filebeat-journald/filebeat.yml'],
    ];
  }

  # enable telegraf plugin for service
  kt_defaults::telegraf::input {
    'filebeat-journald':;
  }

/*
  helper scripts
*/
  file {"${servicedir}/scripts/filebeat-purge-registry.sh":
    owner   => root,
    group   => root,
    mode    => '0755',
    source  => 'puppet:///modules/kt_defaults/filebeat/filebeat-purge-registry.sh',
    require => [
      Package['filebeat'],
      File["${servicedir}/scripts"],
    ];
  }

  ## have a symlinked version
  file {"/usr/local/bin/filebeat-purge-registry":
    ensure => 'link',
    target => "${servicedir}/scripts/filebeat-purge-registry.sh",
  }

}

error:

NoMethodError: undefined method `next_token_of' for nil:NilClass
/usr/lib/ruby/gems/3.0.0/gems/puppet-lint-2.4.2/lib/puppet-lint/plugins/check_resources/ensure_first_param.rb:31:in `fix'
/usr/lib/ruby/gems/3.0.0/gems/puppet-lint-2.4.2/lib/puppet-lint/checkplugin.rb:42:in `block in fix_problems'
/usr/lib/ruby/gems/3.0.0/gems/puppet-lint-2.4.2/lib/puppet-lint/checkplugin.rb:38:in `each'
/usr/lib/ruby/gems/3.0.0/gems/puppet-lint-2.4.2/lib/puppet-lint/checkplugin.rb:38:in `fix_problems'
/usr/lib/ruby/gems/3.0.0/gems/puppet-lint-2.4.2/lib/puppet-lint/checks.rb:67:in `block in run'
/usr/lib/ruby/gems/3.0.0/gems/puppet-lint-2.4.2/lib/puppet-lint/checks.rb:65:in `each'
/usr/lib/ruby/gems/3.0.0/gems/puppet-lint-2.4.2/lib/puppet-lint/checks.rb:65:in `run'
/usr/lib/ruby/gems/3.0.0/gems/puppet-lint-2.4.2/lib/puppet-lint.rb:205:in `run'
/usr/lib/ruby/gems/3.0.0/gems/puppet-lint-2.4.2/lib/puppet-lint/bin.rb:66:in `block in run'
/usr/lib/ruby/gems/3.0.0/gems/puppet-lint-2.4.2/lib/puppet-lint/bin.rb:62:in `each'
/usr/lib/ruby/gems/3.0.0/gems/puppet-lint-2.4.2/lib/puppet-lint/bin.rb:62:in `run'
/usr/lib/ruby/gems/3.0.0/gems/puppet-lint-2.4.2/bin/puppet-lint:7:in `<top (required)>'
/usr/bin/puppet-lint:25:in `load'
/usr/bin/puppet-lint:25:in `<main>'

I think this was fixed in and should be in puppet-lint 2.5.0:
e4d1612

Fixed in 2.5.0 👍