#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, но это первый раз, когда мне действительно пришлось копаться в подразделах. Я думаю, что требуется некоторое обучение в этой области. Еще раз спасибо!