Назад | Перейти на главную страницу

Как я могу извлечь объявление виртуального ресурса марионетки из определения класса?

У меня вопрос о виртуальных ресурсах в марионетке. Если бы у меня был:

class foo::virtual
{
  define foo () {
    custom_resource { $name:
      <attributes>,
      }
  }
  @foo { '1st_foo':
    <attributes>,
  }
}

Я могу realize(Foo::Virtual::Foo['1st_foo']) в объявлении узла.

Однако я хотел бы извлечь спецификацию каждого виртуального foo в отдельное место, где-нибудь помимо спецификации класса foo :: virtual и определения foo ().

По аналогии у меня есть класс с именем common :: data, который предоставляет значения по умолчанию для различных переменных:

  class common::data {
    $barList = [ 'a','b','z']
  }

Есть ли способ объявить @foo { '2nd_foo': } из common :: data? А затем сослаться на это в объявлении узла?

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

Вот полный рабочий протестированный пример (протестирован на CLI с применением марионетки и правильным именем узла):

class foo::virtual {
  define foo() { notify { "test${title}": message => "realized foo ${title}" } }
  @foo { '1st_foo': }
}

class common::data {
  include foo::virtual
  @foo::virtual::foo { '2nd_foo': }
}

node default {
  include common::data
  realize(Foo::Virtual::Foo['1st_foo'])
  realize(Foo::Virtual::Foo['2nd_foo'])
}

Вывод подтверждает, что оба произошли:

notice: realized foo 1st_foo
notice: realized foo 2nd_foo