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'],
  }

}

.. と私パペットランはスキップしています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]

最終実行レポート.yaml

「logio_plugin_file」という用語は 2 つのPuppet::Util::Logエントリの一部としてのみ言及されており、File[logio_plugin_file]エントリは存在しません。

以下は、これら 2 つのエントリの簡単な抜粋です。

- !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プラス記号ensure、、pathおよび のみを含めるようにしてみましたがsource、効果はありませんでした。
  • アップデート:リソースの名前を変更してみましたが (例: 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

しかし、より深い 2 つのリソースがスキップされていたため、問題は を中心に発生していることがわかりました/etc/logstash/plugins/logstash。詳しく調べてみると、循環参照が見つかりました。

これが誰かの役に立つことを願います。また、時間を割いてくれた Shane Madden に感謝します。

関連情報