为什么 Puppet 会排除文件资源而不会出现错误?

为什么 Puppet 会排除文件资源而不会出现错误?

在这次 Puppet 运行(使用)期间发生了一件最奇怪的事情Puppet Apply,这让我很困惑。我尝试过常用的渠道来寻找解决方案,但找不到任何关于这个主题的信息。我很抱歉说得太啰嗦了,我只是不想遗漏任何东西:\

-

我的课

class c2c::profile::app::logio::stage_support {

  # Log.io plugin
  # Create plugin directories
  exec { "create_codec_dir":
    command => "/bin/mkdir --parents /etc/logstash/plugins/logstash/codecs --mode=0775",
    creates => '/etc/logstash/plugins/logstash/codecs',
  }

  # Install plugin
  file { "logio_plugin_file":

    # update: added in response to a serverfault comment
    ensure  => file,

    path    => '/etc/logstash/plugins/logstash/codecs/logio.rb',
    mode    => '0775',
    owner   => 'root',
    group   => 'root',
    source  => 'puppet:///modules/c2c/logstash/logio_codec.rb',
    require => Exec['create_codec_dir'],
    notify  => Service['logstash'],
  }

}

.. 和我的Puppet run 跳过了logio_plugin_file指令(或者,无论出于何种原因,没有复制文件)。

-

日志等

调试日志相当大,我不想粘贴整个内容,所以这里是 Puppet 运行中提到“logio_plugin_file”的每一行,但如果需要,我很乐意提供更多。

Debug: /File[logio_plugin_file]/seluser: Found seluser default 'system_u' for /etc/logstash/plugins/logstash/codecs/logio.rb
Debug: /File[logio_plugin_file]/selrole: Found selrole default 'object_r' for /etc/logstash/plugins/logstash/codecs/logio.rb
Debug: /File[logio_plugin_file]/seltype: Found seltype default 'etc_t' for /etc/logstash/plugins/logstash/codecs/logio.rb
Debug: /File[logio_plugin_file]/selrange: Found selrange default 's0' for /etc/logstash/plugins/logstash/codecs/logio.rb
..
Debug: /File[logio_plugin_file]/require: requires Exec[create_codec_dir]
Debug: /File[logio_plugin_file]/notify: subscribes to Service[logstash]
..
Debug: /File[logio_plugin_file]: Autorequiring File[logstash_codec_plugins]

/var/lib/puppet/state/last_run_report.yaml

术语“logio_plugin_file”仅在两个Puppet::Util::Log条目中被提及,并且不File[logio_plugin_file]存在任何条目。

以下是这两个条目的简短摘录:

- !ruby/object:Puppet::Util::Log
  level: !ruby/sym debug
  time: 2013-12-06 17:30:38.009095 +00:00
  tags: 
    - debug
    - file
    - logio_plugin_file
    - class
    ... (25 more ) ...
  line: 41
  source: /File[logio_plugin_file]/require
  file: /tmp/vagrant-puppet/modules-0/c2c/manifests/profile/app/logio/stage_support.pp
  message: "requires Exec[create_codec_dir]"

  .. further down, mostly the same except ..

  message: "subscribes to Service[logstash]"

-

奇怪之处

该文件包含在一个大型目录中,其中包含数十或数百个其他类,但奇怪的是,如果我使用快速测试清单(也使用puppet apply)直接包含此类,它会像魔法一样工作。(虽然我确实必须删除服务要求)

node default {
  class { 'c2c::profile::app::logio::stage_support': }
}

.. 我在我的输出中得到了这个..

Notice: /File[logio_plugin_file]/ensure: defined content as '{md5}41d00952843b8159b95ce4fcd8015cda'

.. 还有这个last_run_report.yaml..

File[logio_plugin_file]: !ruby/object:Puppet::Resource::Status
  resource: File[logio_plugin_file]
  file: /tmp/vagrant-puppet/modules-0/c2c/manifests/profile/app/logio/stage_support.pp
  line: 40
  evaluation_time: 0.023071
  change_count: 1
  out_of_sync_count: 1
  ...

-

附加要点、信息和测试

  • 我刚刚添加了Notify => Service['logstash'],但在我这样做之前就出现了这种行为。
  • 没有错误发生
  • 我在我的课程中添加了一些notify{}呼叫stage_support以确保它被正确地包含在目录中,并且确实如此。
  • Exec['create_codec_dir']正在创建我的目录
  • 我尝试将path参数更改为以logio2.rb查看类
  • 我尝试File['logio_plugin_file']从其他资源获取资源。获取资源已运行,但文件未创建。
  • 更新:我尝试减少文件类型调用以仅包含title加号ensurepathsource,但这没有任何效果。
  • 更新:我尝试重命名资源(例如logio_plugin_file_x),但没有帮助。

    [root@dev ~]# puppet --version
    3.2.3
    
    [root@dev ~]# facter --version
    1.7.2
    
    [root@dev ~]# cat /etc/redhat-release
    CentOS release 6.4 (Final)
    

-

重要的提示

这个问题是在我进行代码重组的最后阶段出现的,因此几乎肯定是这个问题造成的,但我无法解决这个问题。

任何帮助深表感谢!

答案1

正如预期的那样,问题的根源很简单,尽管我仍然不明白为什么 Puppet 没有就此发出错误:

配置文件/logstash.pp:(别处)

file { 'logstash_plugin_sub':
  path      => '/etc/logstash/plugins/logstash',
  ensure    => 'directory',
  owner     => 'root',
  group     => 'root',
  mode      => '0775',
  require   => [ File['logstash_plugin_sub'] ]
}

请注意要求中的循环引用:File['logstash_plugin_sub'] -> File['logstash_plugin_sub']

产生的行为非常奇怪,我使用这个测试发现了问题:

file { "logio_plugin_file_a":
  path    => '/etc/logstash/logio.rb',
  source  => 'puppet:///modules/c2c/logstash/logio_codec.rb',
}
file { "logio_plugin_file_b":
  path    => '/etc/logstash/plugins/logio.rb',
  source  => 'puppet:///modules/c2c/logstash/logio_codec.rb',
}
file { "logio_plugin_file_c":
  path    => '/etc/logstash/plugins/logstash/logio.rb',
  source  => 'puppet:///modules/c2c/logstash/logio_codec.rb',
}
file { "logio_plugin_file_d":
  path    => '/etc/logstash/plugins/logstash/codecs/logio.rb',
  source  => 'puppet:///modules/c2c/logstash/logio_codec.rb',
}

这个想法主要是尝试将我的文件添加到树中越来越深的位置。这个想法是我在能够改变path我原来的示例并取得成功后产生的。

因此,创建了以下内容:

/etc/logstash/logio.rb
/etc/logstash/plugins/logio.rb

但跳过了两个更深层次的资源,所以我知道我的问题集中在/etc/logstash/plugins/logstash。经过仔细检查,我发现了循环引用。

希望这对某些人有帮助,并感谢 Shane Madden 抽出时间。

相关内容