автоматическое создание требуемых параметров по данным в hiera

Есть ли способ создать требуемый параметр с помощью hiera? Возможно, поиск возможен, но я новичок в кукольном деле и не знаю всех возможностей.

Я использую модуль oneview-puppet для создания ресурсов из приложения puppet.

Ресурсы были созданы hiera, определенными как один файл конфигурации (YAML). Там я объединяю несколько ресурсов из модуля выше. Эти ресурсы имеют сложные зависимости. Обзор можно найти здесь (стр. 29).

Поэтому для каждого ресурса я должен требовать зависимости, хотя они могут быть «найдены» в моем файле конфигурации. На самом деле он работает только тогда, когда ресурсы, созданные его последовательностью, находятся в файле site/manifest/init.pp.

Я пытался добавить параметр require в hiera, но там он будет интерпретироваться как строка.

пример site/oneviewconf/manifest/init.pp:

class oneviewconf (
  Hash $oneview_ethernet_networks = {},
  Hash $oneview_logical_interconnect_groups = {}
)
{
  $oneview_ethernet_networks.each | $k,$v | {
    oneview_ethernet_network { $k:                      # -> oneview-puppet resource
      * => $v,
    }
  }
  $oneview_logical_interconnect_groups.each | $k,$v | {
    oneview_logical_interconnect_group { $k:             # -> oneview-puppet resource
      require => Oneview_ethernet_network['VLAN0001']
      * => $v,
    }
  }
}

Пример Иеры:

---
oneviewconf::oneview_ethernet_networks:
  VLAN0001:
    ensure: present
    data:
      name: 'VLAN0001'
      vlanId: 0001
oneviewconf::oneview_logical_interconnect_groups:
  LIG_A:
    ensure: present
    data:
      name: 'LIG_A'
      networkUris: ['VLAN0001']

person rico_nem    schedule 26.09.2019    source источник
comment
Если причина, по которой второму ресурсу требуется первый, связана со значениями в ключе networkUris, вы можете сделать: require => Oneview_ethernet_network["${v['data']['networkUris']}"]. Это та логика, которую вы пытаетесь закодировать здесь?   -  person Matt Schuchard    schedule 26.09.2019
comment
Да спасибо. Но в некоторых случаях мне требуется другой ресурс, например require => Oneview_fc_network['SAN_A']. Я думал о более общем методе поиска в моих данных, если существует ресурс из networkUris.   -  person rico_nem    schedule 26.09.2019
comment
Если более общий метод означает встраивание ссылки на ресурс в ваши данные hiera, я призываю вас думать по-другому. Такая вещь будет представлять собой гораздо более тесную связь между данными и кодом Puppet, чем я бы советовал.   -  person John Bollinger    schedule 26.09.2019
comment
Спасибо за ваш совет. Мы их тоже различаем, но в моем случае наш текущий файл конфигурации не имеет дополнительной логики для создания, удаления или обновления одного ресурса, если этот ресурс требуется другим. Все, что я хочу, это некоторая безопасность, чтобы марионетка не падала, если ресурс имеет неправильные зависимости. Возможно, средство проверки зависимостей данных hiera является решением перед применением марионетки. -› Как уже было сказано, я новичок в марионетках.   -  person rico_nem    schedule 26.09.2019


Ответы (1)


Есть ли способ создать требуемый параметр с помощью hiera?

да.

Я пытался добавить параметр require в hiera, но там он будет интерпретироваться как строка.

Нет, если вы отформатируете его правильно. Если вы посмотрите на скомпилированный каталог Puppet, вы увидите, как ссылки на ресурсы кодируются в каталоге JSON, и это также говорит вам, как их нужно кодировать в файле Hiera YAML.

Возьмите такой манифест:

class test {
  notify { 'notify1':
    message => 'I am notify 1',
    require => Notify['notify2'],
  }
  notify { 'notify2':
    'message' => 'I am notify 2',
  }
}

Теперь скомпилируйте этот каталог и загляните внутрь него. Ты увидишь:

    {
      "type": "Notify",
      "title": "notify1",
...
      "parameters": {
        "message": "I am notify 1",
        "require": "Notify[notify2]"
      }
    },

В случае, если это не очевидно, в то время как манифесты требуют, чтобы заголовок ресурса был заключен в кавычки, например Notify['notify2'], эти кавычки вокруг заголовка ресурса удаляются в каталоге, и он становится Notify[notify2].

Таким образом, я могу таким же образом добавить параметр в Hiera и провести рефакторинг всего этого.

Иера:

---
notify_resources:
  notify1:
    message: I am notify 1
    require: Notify[notify2]
  notify2:
    message: I am notify 2

Манифесты:

class test {
  $notify_resources = lookup('notify_resources')
  $notify_resources.each |$k,$v| {
    notify { $k: * => $v }
  }
}

Однако стоит ли это делать? Я склонен согласиться с комментариями Джона Боллинджера о том, что ссылки на ресурсы в Hiera могут быть признаком того, что у вас слишком много связи данных/кода.

person Alex Harvey    schedule 26.09.2019
comment
Спасибо, это работает! Есть ли у вас какие-либо предложения по уменьшению связанности данных/кода для логики конфигурации? Я думаю, что это новый модуль для объединения всех ресурсов, которые обрабатывают их зависимости. - person rico_nem; 26.09.2019
comment
@rico_nem, это довольно сложный вопрос, чтобы ответить здесь, в комментариях. ;-) И мне нужно будет потратить некоторое время на просмотр вашего кода, прежде чем я смогу составить мнение о рефакторинге. - person Alex Harvey; 26.09.2019