2017-02-15 14 views
1

У меня есть 2 определенные ресурсы, созданныеКукол - уведомить службу в определенном ресурсе

  1. Скачать приложение и установить его в качестве службы

  2. Создать конфигурационный файл для службы

Я хочу, чтобы 1 выполнялся до 2, поскольку 1 создает каталог, в который 2 создается файл конфигурации.

Но мне также нужно, если файл конфигурации обновлен, он должен уведомить службу в 1 для обновления. Здесь я столкнулся с проблемой, поскольку, похоже, я не могу получить доступ к сервису.

Вот пример кода, я использую:

class start { 
    resource::run_service{'start'} 
    -> 
    resource::conf:service_conf{'conf'} 
} 

define resource::run_service { 
    # Does some things 
    service { 'main': 
     ensure => 'running', 
     enable => true 
    } 
} 

define resource::conf::service_conf { 
    file { 'file.config': 
     ensure => file, 
     path => '/some/path/', 
     owner => 'user', 
     group => 'group', 
     mode => 0600, 
     content => template('templates/templatefile.erb'), 
     notify => Resource::Run_service::Service['main'], # What is the proper way to do this? 
    } 
} 

Это ошибка, я получаю от марионетки:

Ошибка: не удалось получить каталог с удаленного сервера: Ошибка 400 на сервере: Недопустимые отношения: File [file.config] {notify => Resource :: Run_service :: Service ['main']}, потому что Resource :: Run_service :: Service ['main'], похоже, не находится в каталоге

Я могу это сделать:

notify => Resource::Run_service['main'], 

Но это дает мне цикл зависимости.

Есть ли способ обновить услугу?

ответ

2

Некоторые вопросы здесь:

  • resource::run_service{'start'} -> resource::conf:service_conf{'conf'} уточняет зависимость, которая является противоположностью того, что вы указали, что вы хотите (2 до 1). Я предполагаю, что это опечатка, потому что это противоречит другим частям вашего вопроса.
  • Вы должны указать определенные типы ресурсов в своих собственных манифестах.
  • Вы не получаете никакой реальной добавленной стоимости от определенных типов ресурсов, которые не содержат параметров и не используют внутреннюю переменную $title, поэтому вы можете просто удалить их. По крайней мере, вы должны, вероятно, реорганизовать их так, чтобы создание каталога для файла конфигурации находилось в том же определенном типе ресурса, что и файл конфигурации.
  • Resource::Run_service::Service['main'] не является допустимым именем ресурса, поэтому вы получаете ошибку «не в каталоге». Родные типы ресурсов не имеют пространства имен, поэтому вам не нужно указывать определенное пространство имен типов ресурсов перед ними.
  • Вам нужно использовать строки для восьмеричных значений с атрибутами mode. Это ошибка в Puppet, потому что это может привести к неопределенному поведению с преобразованием типов в Ruby.

Со всем, что в виду, самый простой путь вперед для вас:

class start { 

} 

define resource::run_service { 
    file { 'directory that contains config file': 
    ensure => directory, 
    before => File['file.config'], 
    } 

    # Does some things 
    service { 'main': 
    ensure => 'running', 
    enable => true 
    } 
} 

define resource::conf::service_conf { 
    file { 'file.config': 
    ensure => file, 
    path => '/some/path/', 
    owner => 'user', 
    group => 'group', 
    mode => '0600', 
    content => template('templates/templatefile.erb'), 
    notify => Service['main'], 
    } 
} 

Это поможет вам поведение, которое вы желаете с наименьшим количеством боли.

+1

Несмотря на то, что «вы не получаете никакой реальной добавленной стоимости от определенных типов ресурсов, которые не содержат параметров», это верно, поскольку это относится к специфике вопроса OP, это не так, как общее правило. Каждый экземпляр определенного типа имеет внутренне доступный '$ title' (также доступный как' $ name'), и его использование может сделать тип дополнительным значением (как и в случае, несколько примеров могут быть с пользой объявлены). Фактически, я бы зашел так далеко, что сказал, что в основном это использование '$ title', а не наличие или отсутствие параметров, которое определяет, добавляет ли определенный тип добавленную стоимость. –

+0

@JohnBollinger Хорошая точка. Позвольте мне обновить свой пункт. –

+0

Вы в курсе опечатки, я исправил OP. Ресурсы находятся в их собственных проявлениях, я просто форматировал их, чтобы их было легче читать. Похоже, главное, что я не знал, это то, что у местных ресурсов нет пространств имен. Я думаю, что я попробовал это без пространства имен, прежде чем публиковать свой вопрос, но при этом я не мог бы использовать «Сервис», потому что тогда он не работал. В любом случае, я принял ваш ответ. Благодарю. –