為什麼 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']從其他資源請求。所需資源已運行,但未建立檔案。
  • 更新:我嘗試減少檔案類型呼叫以僅包含titleplus 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'] ]
}

注意require中的循環引用: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 抽出寶貴的時間。

相關內容