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

Марионетка: условное определение типов

Я не знаю, как сформулировать эти вопросы, поэтому, пожалуйста, предложите правку, если вы считаете ее неуместной.

Я пытаюсь расширить существующие модули марионеток с поддержкой разных ОС. Я столкнулся с небольшой проблемой, которую я не знаю, как решить ее элегантным способом. В params.pp В файле есть такое определение пакетов для конкретной ОС, которые нужно установить:

case $::osfamily {
  'RedHat': {
    $package_server = 'mariadb-server'
    $package_client = 'mariadb'
    $php_package_name = 'php-mysql'
  }
...

Модуль написан таким образом, что вся конфигурация зависит от наличия $php_package_name установлены. Я хочу расширить этот модуль для другой ОС, в которой нет отдельного пакета mysql для php, поэтому я установил $php_package_name переменная для undef. Это создает проблему, которую марионетка пытается установить Package[undef].

Что было бы хорошим способом предотвратить это? Мои мысли до сих пор считают войну ложной и имеют полное определение $php_package_name только огонь if $php_package_name != false. Может есть способ получше?

Ага, это кажется разумным подходом. Я бы предложил небольшой вариант этого, добавив новый параметр, который определяет, package ресурс, который использует $php_package_name следует применять вообще:

case $::osfamily {
  'RedHat': {
    $package_server = 'mariadb-server'
    $package_client = 'mariadb'
    $php_package_name = 'php-mysql'
    $php_package_install = true
  }
  'otherOS': {
    $package_server = 'mariadb-server'
    $package_client = 'mariadb'
    $php_package_install = false
  }
  ...

Тогда где ресурс:

if $thismodule::params::php_package_install {
  package { $thismodule::params::php_package_name:
    ensure => present,
    ...
  }
}

Имейте в виду, что способ выполнения всех специфичных для вашей ОС вещей в params.pp может не оказаться более чистым, если ресурсы, необходимые для установки в новой ОС, сильно отличаются; это может просто превратить ваш файл манифеста в нечитаемое крысиное гнездо условий и параметров. В этом случае не бойтесь просто разделить разные ОС в отдельный класс (например, install_el.pp для семьи RedHat и install_otheros.pp для новой семьи, с правильным из init.pp или params.pp).