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 👍