Как динамически обновлять значения для отдельных разделов соответствия в файле конфигурации sshd с помощью марионетки - PullRequest
0 голосов
/ 04 августа 2020

Я могу обновить значение в разделах «User foo» и «Host * .example. net», передав индекс. Если я передам индекс 1 или 2, соответствующее значение будет обновлено.

мой код:

$sections = ['Host *.example.net', 'User foo']

$sections.each |String $section| {
  sshd_config_match { "${section}":
    ensure => present,
  }
}

$settings = [['User foo', 'X11Forwarding yes', 'banner none'],['Host *.example.net', 'X11Forwarding no', 'banner none']]
$settings.each |Array $setting| {
  $setting_array = split($setting[1],/ /)
  sshd_config { "${setting_array[0]} ${setting[0]}":
    ensure    => present,
    key       => "${setting_array[0]}",
    condition => "${setting[0]}",
    value     => "${setting_array[1]}",
  }
}

текущий результат:

 Match Host *.example.net
      # Created by Puppet
      X11Forwarding no
     
    Match User foo
      # Created by Puppet
      X11Forwarding yes

Ожидаемые результаты:

Match Host *.example.net
  # Created by Puppet
  X11Forwarding no
  Banner none
Match User foo
  # Created by Puppet
  X11Forwarding yes
  Banner none

Я могу обновить только одно значение, указанное в индексе, но ищу способ обновить больше или все значения, упомянутые в списке.

1 Ответ

1 голос
/ 05 августа 2020

Неясно, какой модуль предоставляет ваши типы ресурсов sshd_config_match и sshd_config, и, следовательно, не совсем понятно, что они делают. Тем не менее, если мы рассмотрим этот код ...

$settings = [['User foo', 'X11Forwarding yes', 'banner none'],['Host *.example.net', 'X11Forwarding no', 'banner none']]
$settings.each |Array $setting| {
  $setting_array = split($setting[1],/ /)
  sshd_config { "${setting_array[0]} ${setting[0]}":
    ensure    => present,
    key       => "${setting_array[0]}",
    condition => "${setting[0]}",
    value     => "${setting_array[1]}",
  }
}

... мы увидим, что каждый элемент $settings представляет собой трехэлементный массив, из которых each call обращается только к элементам с индексами 0 и 1. Это похоже на результат, который вы видите, который не содержит ничего, соответствующего данным из элементов с индексом 2.

Вы могли перебирать внутренние элементы $setting, начиная с индекса 1, вместо того, чтобы рассматривать только этот элемент, но я бы предложил вместо этого реструктурировать данные более естественно и написать код, подходящий для реструктурированных данных. У вас есть данные разной значимости в ваших массивах, и вы напрасно смешиваете ключи и значения вместе, так что вам нужно приложить усилия, чтобы разбить их на части. Структурирование данных как ha sh хэшей вместо массива массивов может быть хорошим началом:

$settings = {
  'User foo'           => { 'X11Forwarding' => 'yes', 'banner' => 'none'},
  'Host *.example.net' => { 'X11Forwarding' => 'no',  'banner' => 'none'},
}

Это не только дает вам значительно улучшенную читаемость (в основном из форматирование), но он также обеспечивает гораздо большее удобство использования . То есть, хотя я здесь немного предполагаю, у вас должно получиться сделать что-то похожее на следующее:

$settings.each |String $condition, Hash $properties| {
  $properties.each |String $key, String $value| {
    sshd_config { "${condition} ${key}":
      ensure    => 'present',
      condition => $condition,
      key       => $key,
      value     => $value,
    }
  }
}

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

...