Создайте изменяемую строку из итерации хеша - PullRequest
0 голосов
/ 06 декабря 2018

Я застрял на следующем марионеточном коде из дней, не могли бы вы дать мне руку?

В hiera у меня есть следующая структура:

my_list::servers:
  server1.subnet.env.com:
    id: 0
  server2.subnet.env.com:
    id: 1
  server3.subnet.env.com:
    id: 2
  server4.subnet.env.com:
    id: 3

Где различные server1..n (n => 2) - полное доменное имя серверов в конкретной среде.Идентификатор всегда в порядке, но начиная с 0.

Мне нужно создать строку, содержащую список строк через запятую, как broker-${id}-check, где идентификатор отличается от полного доменного имени сервера, на котором яя запускаю puppet, поэтому, например, если я запускаю скрипт на server2.subnet.env.com, строка должна быть broker-0-check,broker-2-check,broker-3-checkЕсли я использую server1.subnet.env.com, это будет broker-1-check,broker-2-check,broker-3-check и т. Д.

Мое последнее предположение:

$servers_list = hiera('my_list::servers',  {"${::fqdn}" => {'id' => 0 } })
$list_broker=''
$servers_list.each |$key, $value| {
  if $key != $::fqdn {
    $list_broker="${list_broker},broker-${value['id']}-check"
  }
}
notify {"******* ${list_broker}": }

, но list_broker все еще пуст, и тогда я будунужно исправить начальную запятую.

Есть ли лучший способ сделать это?

Я использую Puppet 4.

1 Ответ

0 голосов
/ 06 декабря 2018

Проблема в том, что хотя в Puppet есть функция итерации, она не позволяет переназначать переменные ( ref ).

По этой причине в Puppet много функционального программирования.функции, которые позволяют вам решать подобные проблемы без необходимости переназначения переменных.

Это работает (Puppet <5.5), где <code>join() происходит из stdlib:

$list_broker = join(
  $servers_list
    .filter |$key, $value| { $key != $::fqdn }
    .map    |$key, $value| { "broker-${value['id']}-check" },
  ','
)

Или в Puppet>= 5.5 (как предлагается в комментариях), где команда объединения является встроенной, объединение также может быть объединено в цепочку:

$list_broker = $servers_list
  .filter |$key, $value| { $key != $::fqdn }
  .map    |$key, $value| { "broker-${value['id']}-check" }
  .join(',')

Если вы предпочитаете это в следующих шагах:

$filtered = $servers_list.filter |$key, $value| { $key != $::fqdn } 
$mapped = $filtered.map |$key, $value| { "broker-${value['id']}-check" }
$list_broker = join($mapped, ',')

Объяснение:

  • Функция filter выбирает элементы из массива или хеша на основе некоторых критериев.
  • *Функция 1026 * выполняет преобразование для всех элементов массива или хэша и возвращает массив преобразованных данных.
  • Функция join (которая до Puppet 5.5 происходила изstdlib) объединяет массив строк.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...