Проблема
Функция разделения марионетки не работает, так как марионетка была обновлена до версии. 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 ('')
надеюсь, это поможет