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(또는 어떤 이유로든 파일을 복사하지 않습니다.)

-

로그 등

디버그 로그는 다소 크고 전체 내용을 붙여넣고 싶지 않으므로 여기에 'logio_plugin_file'을 언급하는 Puppet 실행의 모든 ​​줄이 있지만 필요한 경우 기꺼이 더 제공하겠습니다.

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

Puppet::Util::Log'logio_plugin_file'이라는 용어는 두 항목 의 일부로만 언급되고 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나는 플러스 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'] ]
}

요구 사항의 순환 참조에 유의하십시오.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에게 감사드립니다.

관련 정보