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

Как избежать дублирования манифеста Puppet

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

Вот упрощенный пример файловой структуры:

/home/bob/config/files.cfg
/home/bob/config/settings.cfg

/home/sue/config/files.cfg
/home/sue/config/settings.cfg

/home/ann/config/files.cfg
/home/ann/config/settings.cfg

А вот манифест, который я написал.

class config-generic {
    file { "/home/$name/config/files.cfg":
        owner =>    $name,
        group =>    $name,
        source =>   "puppet://puppet.domain.com/files/home/$name/config/files.cfg",
        mode =>     644,
    }
    file { "/home/$name/config/settings.cfg":
        owner =>    $name,
        group =>    $name,
        source =>   "puppet://puppet.domain.com/files/home/$name/config/settings.cfg",
        mode =>     644,
    }
}

При первом использовании класса работает нормально.

node "client1", "client2" {
    class {'config-generic':
        name  => 'bob',
    }
}

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

(Ошибка 400 на СЕРВЕРЕ: повторяющееся определение: класс [config-generic] уже определен)

node "client1", "client2" {

    class {'config-generic':
        name  => 'bob',
    }

    class {'config-generic':
        name  => 'sue',
    }
}

Вопрос: Я понимаю проблему - но как лучше уменьшить количество репликаций в моих манифестах? Я пытаюсь избежать определения "файл'запись для каждого пользователя для каждого файла.

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

define config-generic ($ensure=present) {
    file { "/home/$name/config/files.cfg":
        ensure  =>  $ensure,
        owner   =>  $name,
        group   =>  $name,
        source  =>  "puppet://puppet.domain.com/files/home/$name/config/files.cfg",
        mode    =>  '0644',
    }
    file { "/home/$name/config/settings.cfg":
        ensure  =>  $ensure,
        owner   =>  $name,
        group   =>  $name,
        source  =>  "puppet://puppet.domain.com/files/home/$name/config/settings.cfg",
        mode    =>  '0644',
    }
}

и назовите его:

node "client1", "client2" {

    config-generic {
      'bob':;    
      'sue':;
    }
}

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