Считывает несколько хэш-ключей и сохраняет только уникальные значения

#puppet

#кукольный

Вопрос:

Если у меня есть данные в Hiera, подобные:

 resource_adapter_instances:
  'Adp1':
    adapter_plan_dir: "/opt/weblogic/middleware"
    adapter_plan:     'Plan_DB.xml'
  'Adp2':
    adapter_plan_dir: "/opt/weblogic/middleware"
    adapter_plan:     'ODB_Plan_DB.xml'
  'Adp3':
    adapter_plan_dir: "/opt/weblogic/middleware"
    adapter_plan:     'Plan_DB.xml'
  

И мне нужно преобразовать это в массив, подобный этому, отметив, что дубликаты удалены:

 [/opt/weblogic/middleware/Plan_DB.xml, /opt/weblogic/middleware/ODB_Plan_DB.xml]
  

Я знаю, что должен использовать карту Puppet, но я действительно борюсь с этим.

Я пробовал это:

 $resource_adapter_instances = hiera('resource_adapter_instances', {})
$resource_adapter_paths = $resource_adapter_instances.map |$h|{$h['adapter_plan_dir']},{$h['adapter_plan']}.join('/').uniq
notice($resource_adapter_instances)
  

Но это не работает и выдает синтаксические ошибки. Как мне это сделать?

Комментарии:

1. hiera.values.map { |h| [h[:adapter_plan_dir] , h[:adapter_plan]].join('/') }.uniq

2. Я удалил тег Ruby, ничего общего с Ruby.

3. @DaveShaw, вам нужно четко сказать, что вы на самом деле пытаетесь сделать, и, если возможно, исправить синтаксические ошибки и отступы, потому что мы не можем это прочитать. анализатор puppet проверяет ваш_файл.pp.

4. Кроме того, версия Puppet, которую вы используете, поскольку она кажется старой.

5. Спасибо @AlexHarvey — я не уверен, почему желаемый результат не ясен, хотя с удовольствием отредактирую его. Там написано «результат, который я ищу …» — мы используем puppet 5

Ответ №1:

Вы на правильном пути. Возможное решение заключается в следующем:

 $resource_adapter_instances = lookup('resource_adapter_instances', {})
$resource_adapter_paths =
  $resource_adapter_instances.map |$x| {
    [$x[1]['adapter_plan_dir'], $x[1]['adapter_plan']].join('/')
  }
  .unique
notice($resource_adapter_paths)
  

Еще несколько замечаний:

  • Функция hiera устарела, поэтому я переписал с помощью lookup, и вам следует сделать то же самое.

  • Функция map Puppet может немного сбивать с толку, особенно если вам нужно выполнить итерацию с ней через вложенный хэш, как в вашем случае. На каждой итерации Puppet передает каждую пару ключей и значений в виде массива в форме [key, value] . Таким образом, $ x [0] получает ваш хэш-ключ (Adp1 и т.д.), А $ x[1] Получает данные с правой стороны.

  • Уникальная функция Puppet не uniq такая, как в Bash, Ruby и т.д., Но на самом деле записывается как unique .

  • Обратите внимание, что я переписал его без слишком длинных строк. Это намного проще для чтения.

Если вы примените марионетку, вы получите:

 Notice: Scope(Class[main]): [/opt/weblogic/middleware/Plan_DB.xml,
  /opt/weblogic/middleware/ODB_Plan_DB.xml]
  

Комментарии:

1. Спасибо, Алекс. Я преобразовывал наши манифесты из hiera в lookup, где я с этим сталкивался. У нас на сайте довольно много старого кода. Также спасибо за указания. Очень признателен, я уже некоторое время работаю с puppet, но это первый раз, когда мне действительно пришлось копаться в подразделах. Я думаю, что требуется некоторое обучение в этой области. Еще раз спасибо!