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

Функция Puppet Split не работает

Проблема

Функция разделения марионетки не работает, так как марионетка была обновлена ​​до версии. 3.5.1, пока это работало, пока 3.4.3

Код

 1  $ports_regex = "80\\|443"
 2
 3  $ports_string       = regsubst($ports_regex, '\\\|', ',', 'G')
 4
 5  notify{"CP1 ${ports_string}":}
 6
 7  $ports_array = split($ports_string, ',')
 8
 9  notify{"CP2 ${ports_array}":}
10
11  each($ports_array) |$port| {
12      notify{"CP3 ${port}":}
13
14      file {"${port}":
15          path => "c:/temp/puppettest/${port}",
16          ensure => present;
17      }
18  }

Результат

3.4.3

Notice: /Stage[main]/Main/File[443]/ensure: created
Notice: CP2 80443
Notice: /Stage[main]/Main/Notify[CP2 80443]/message: defined 'message' as 'CP2 80443'
Notice: CP1 80,443
Notice: /Stage[main]/Main/Notify[CP1 80,443]/message: defined 'message' as 'CP1 80,443'
Notice: CP3 80
Notice: /Stage[main]/Main/Notify[CP3 80]/message: defined 'message' as 'CP3 80'
Notice: /Stage[main]/Main/File[80]/ensure: created
Notice: CP3 443
Notice: /Stage[main]/Main/Notify[CP3 443]/message: defined 'message' as 'CP3 443'

3.5.1

C:\Windows\system32>puppet apply --parser future --debug --verbose "C:\temp\puppettest\site.pp"
Error: Invalid tag cp2  at C:/temp/puppettest/site.pp:9 on node ...
Error: Invalid tag cp2  at C:/temp/puppettest/site.pp:9 on node ...

Вопрос

Как решить эту проблему?

Билет закрыт и помечен как «не исправит», см. https://tickets.puppetlabs.com/browse/PUP-2612

Хенрик Линдберг добавил комментарий - 19.05.2014 15:43 - отредактировал

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

Вы можете убедиться в этом, если сравните следующее с текущими и будущими парсерами:

$ a = [1,2,3]

обратите внимание, $ a

обратите внимание на "$ a"

Я не уверен, чего вы здесь пытаетесь достичь - похоже, что оригинал создал «CP 2 80443», а теперь вы получаете «CP2 [80, 443]», который затем включается. Затем, когда вы выполняете итерацию $ ports_array, вы получите $ port сначала 80, а затем 443 (когда регулярное выражение было исправлено с помощью 6 обратных косых черт). Это означает, что вы поместили 2 уведомления в каталог; «CP3 80», а затем «CP3 443», а затем создает 2 файловых ресурса, один с названием «80», а затем один с именем «443».

Реализация ресурса отвечает за интерпретацию строки заголовка и делает странные вещи, когда сталкивается с пунктуацией, пробелами, числами и скобками.

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

$ ports_regex = "80 \ | 443"

$ ports_string = regsubst ($ ports_regex, '\\\ |', ',', 'G').

обратите внимание: «ports_regex = '$ {ports_regex}'»

обратите внимание: "ports_string = '$ {ports_string}'"

$ ports_array = split ($ ports_string, ',')

обратите внимание: "ports_array = '$ {ports_array}'"

$ a = "CP1 $ {ports_string}"

обратите внимание, $ a

уведомить {$ a:}

$ b = "CP2 $ {ports_array}"

обратите внимание $ b

уведомить {$ b:}

Если вы хотите, чтобы все содержимое массива было просто объединено в одну строку без каких-либо разделителей, вам следует использовать функцию соединения в stdlib (т.е. join ($ ports_array, ''), но тогда вы можете просто сделать это с помощью отдельная замена запятых.

Вы также можете сделать это в другом порядке - например:

$ ports_array = $ ports_regex.split ('\\\ |')

$ ports_string = $ ports_array.join ('')

Первый разбивает строку на массив, а второй создает строку с числами, соединенными без знаков препинания и скобок. Затем вы можете использовать эту строку для вставки в заголовки, начинающиеся с CP.

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

$ ports_array = $ ports_regex.split (/ \ | /)

$ ports_string = $ ports_array.join ('')

надеюсь, это поможет