Иногда между пакетами возникают сложные взаимодействия. Чтобы избежать интерфейса класса с бесчисленными, казалось бы, не связанными параметрами, я думал об использовании тегов, defined(<resource>)
функция, позволяющая ресурсам немного изменять свое поведение на основе остальной конфигурации (а не фактов).
К сожалению, я не могу найти способ позволить Puppet сначала проанализировать класс, который может генерировать условия, и только затем проанализировать класс, поведение которого неявно (например, с помощью тегов) зависит от способа выполнения первого класса.
Предположим, что это класс, который управляет местом, где конкретный пользователь хранит свои конфиденциальные личные данные. Класс может, например, создать раздел (возможно, зашифрованный) или просто сохранить внешнюю папку (например, в / mnt / user). Или он может сохранить папки там, где они есть по умолчанию, то есть в / home / user (spurcetype => 'none')
class userdocs ( $sourcetype) {
case $sourcetype {
'cryptpartition' : {
tag 'dedicated_user_docs_partition'
...
}
'partition' : {
tag 'dedicated_user_docs_partition'
...
}
'none' : {
...
}
}
...
}
Помимо довольно стандартного набора папок, которые пользователь может захотеть перенаправить в свой раздел, существуют папки, существование которых зависит от конкретного запущенного программного обеспечения, например thunderbird или virtualbox. Создание ссылки (вместо папки), например, virtualbox должен выполняться только при соблюдении двух условий: а) пользователь управляет отдельным разделом (tagged('dedicated_user_docs_partition')
) и пользователь устанавливает VirtualBox.
Должно быть место, куда я могу поместить этот дополнительный код, который проверяет эти два условия. Я могу поместить его в класс, который управляет виртуальным боксом:
class vbox {
if tagged('dedicated_user_docs_partition') {
file { "${userhome}/.VirtualBox": ensure=>link, require=>Class['userdocs'] ...
}
} else {
file { "${userhome}/.VirtualBox": ensure=>directory, require=>Class['userdocs'] ...
}
}
...
}
Проблема в том, что, хотя я явно требую file
ресурс для исполнения перед то userdocs
класс, file
ресурс оценивается после что марионетка ошибочно предполагает, что у пользователя нет dedicated_user_docs_partition
и выполняет неправильную ветвь if
заявление.
Есть ли способ решить эту проблему?
Я разместил этот вопрос на ask.puppet.com.
Это ответ с использованием виртуальных ресурсов, который lavaman
предложил.
Мне не нравится тот факт, что это заставляет меня помещать код с VirtualBox в класс, который, как мне кажется, должен быть логически независим от него. Но я думаю, что это можно обойти, используя делегированные классы (например, userdocs :: virtualbox, полностью определенные в другом месте).
class userdocs ( $sourcetype) {
case $sourcetype {
'cryptpartition' : {
@file { "${userhome}/.VirtualBox": ensure=>link, ...
}
...
}
'partition' : {
@file { "${userhome}/.VirtualBox": ensure=>link, ...
}
...
}
'none' : {
@file { "${userhome}/.VirtualBox": ensure=>directory, ...
}
...
}
}
...
}
и
class vbox {
realize File["${userhome}/.VirtualBox"]
...
}
За этот ответ кредит достается пользователю lavaman
на ask.puppetlabs.com:
Предполагая, что вы также управляете программным обеспечением с помощью марионетки (как видно из примера кода), я бы использовал виртуальные ресурсы в программных модулях, которые собираются модулем, обрабатывающим монтирования.
Официальная документация: https://puppet.com/docs/puppet/latest/lang_virtual.html