Почему 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]

/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увидеть, есть ли класс
  • Я попробовал require File['logio_plugin_file']из другого ресурса. Ресурс requirement запустился, но файл не был создан.
  • Обновлять:Я попробовал сократить вызов типа файла, включив только символы 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. При внимательном рассмотрении я обнаружил циклическую ссылку.

Надеюсь, это кому-то поможет, и спасибо Шейну Мэддену за уделенное время.

Связанный контент