рефакторинг ensure_packages для переключения версии установленных пакетов

#puppet

#кукольный

Вопрос:

Я успешно устанавливаю несколько модулей PHP по версии с помощью puppet в Debian Linux следующим образом:

   $php_version = '7.3'

  ensure_packages([
    "php$php_version-xml",
    "php$php_version-zip",
    "php$php_version-curl",
    "php$php_version-mbstring",
    "libapache2-mod-php$php_version",
  ],
    {
      'ensure' => 'present',
    }
  )
  

теперь я хочу подготовиться к обновлению с PHP 7.3 до 7.4. Это в основном работает, но пакеты 7.3 остаются установленными. Я хотел бы адаптировать код для удаления старых пакетов. Я ищу способ повторно использовать список пакетов модулей для удаления.

Я имею в виду такую подпись

 class profile::software::apache (
  $php_version    = '7.4',
  $php_remove     = ['7.0‘, ‘7.3'],
  #...
) {

$myPackages = [
    "php$php_version-xml",
    "php$php_version-zip",
    "php$php_version-curl",
    "php$php_version-mbstring",
    "libapache2-mod-php$php_version",
  ]

ensure_packages($myPackages,
    {
      'ensure' => 'present',
    }
  )

  $php_remove.each | String $php_version | { 
    ensure_packages($myPackages,
      {
        'ensure' => 'absent',
      }
    )
   }
}
  

Есть ли способ решить эту проблему?

спасибо

Ответ №1:

Я смог решить эту проблему, используя итерационные функции puppet.

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

 class profile::software::apache (
  $php_version    = '7.4',
  $php_remove     = ['7.0‘, ‘7.3'],
  #...
) {
  # build a hash of PHP Versions with a value of either present or absent
  # and iterate over it with each
  $phpInstallHash = { $php_version => 'present' }
  #notify { "Value of phpRemove: ${php_remove}": }
  if $php_remove {
    # We have the array, use the map function to build remove hash
    $phpRemoveHash = $php_remove.map |$version| {
      { $version => 'absent' }
    }
    $phpFullHash = $phpInstallHash   $phpRemoveHash
  } else {
    $phpFullHash = $phpInstallHash
  }
  #notify { "phpHash to iterate over to install/uninstall: ${phpFullHash}": }

  #iterate over the result installing/uninstalling
  $phpFullHash.each | $php_version, $ensure_value | {
    ensure_packages([
      "php$php_version-xml",
      "php$php_version-zip",
      "php$php_version-curl",
      "php$php_version-mbstring",
      "libapache2-mod-php$php_version",
    ],
      {
        'ensure' => $ensure_value,
        require  => [Class['apt::update'],
          Apt::Source['source_php_sury'],
        ],
        notify   => Class['apache::service'],
      }
    )

  }
}
  

hth