Кукольный: напишите ресурс репо, но включите его в нескольких местах без дублирования - PullRequest
0 голосов
/ 19 января 2019

Я пишу кукольный модуль для своего приложения, и с некоторых дней я застрял в том, как управлять репо.

У меня есть Кукольный 4.10 , и все узлы Centos 7

Файл init.pp в модуле моего приложения:

 class my_app{
   anchor { '::my_app::begin': } ->
   class { '::my_app::repo': } ->
   class { '::my_app::install': } ->
   class { '::my_app::config': } ->
   class { '::my_app::service': } ->
   anchor { '::my_app::end': }
}

и repo.pp класс:

class my_app::repo{
  if ! defined(Yumrepo[my_app]) {
    yumrepo {'my_app' :
      ensure   => 'present',
      descr    => 'my_app RPM repository',
      baseurl  => 'http://my_repo_server.com/repos/my_app',
      gpgcheck => 0
    }
  }
}

Класс init.pp установлен на всех серверах, теперь проблема в том, что на всех клиентах и, возможно, на некоторых серверах также должен быть my_app_client.pp :

class my_app::my_app_client{
  include my_app::repo
  [...]
}

Код возвращает ошибку уже объявлено , потому что я объявил класс my_app :: repo дважды.

Я не думаю, что определение 2 репозиториев в этом случае является правильным, и объявлять его как Определенные типы ресурсов , похоже, тоже не работает.

Как мне решить эту проблему? Какова хорошая практика в этом случае?

Заранее спасибо.

1 Ответ

0 голосов
/ 21 января 2019

Проблема в том, что вы не можете использовать

class { '::my_app::repo': }

и

include my_app::repo

в том же наборе манифестов.

Документация для этого на https://puppet.com/docs/puppet/5.3/lang_classes.html#declaring-classes. В результате вы можете использовать декларацию, похожую на ресурс (например, class) только один раз для каждого класса, и вы не можете смешивать ее с include , но вы можете include класс столько раз, сколько захотите.

В вашем случае, я бы посоветовал вам использовать рефакторинг для использования include для ваших my_app классов.

...