Параметры Elide Puppet на основе условных
У меня есть следующий ресурс объявлен в Puppet define
, Некоторые параметры начинаются с auth_*
этот контроль аутентификации. Я хотел бы иметь возможность передавать этот блок параметров или не передавать их, основываясь на значении логической переменной, т.е. $use_authentication
,
Кажется, что if
оператор здесь не сработает, и я не думаю, что "селектор" тоже это сделает. У Феликса Фрэнка был действительно полезный ответ на очень тесно связанный вопрос " условно внутри определения в марионетке", но я не думаю, что стратегия будет работать здесь, потому что параметры, которые должны быть выбраны, вложены в два уровня.
apache::vhost { "$name-non-ssl":
servername => $vhost_name,
docroot => $document_root,
port => 80,
access_log_file => 'access.log',
access_log_format => 'vhost_common',
error_log_file => 'error.log',
directories => [
{path => $document_root,
auth_type => 'Basic',
auth_name => "$name",
auth_user_file => '/somefile.pwd',
auth_require => 'valid-user',
rewrites => [
{
comment => "rule1",
rewrite_base => "/",
rewrite_rule => ['^index\.html$ - [L]']
},
{
comment => "rule2",
rewrite_cond => ['%{REQUEST_FILENAME} !-f', '%{REQUEST_FILENAME} !-d'],
rewrite_rule => ['. /index.html [L]']
}
]}
],
}
Следующее дает синтаксическую ошибку: Syntax error at 'if'; expected '}'
apache::vhost { "$name-non-ssl":
... same as previous ...
directories => [
{path => $document_root,
if $use_authentication {
auth_type => 'Basic',
auth_name => "$name",
auth_user_file => '/somefile.pwd',
auth_require => 'valid-user',
}
rewrites => [
...same as before...
]}
],
}
1 ответ
С этим трудно справиться, потому что вы хотите динамически заполнять некоторые пары ключ / значение в хэше, который является элементом массива, который является значением параметра.
Вариант 1. Создайте хеш вне объявления ресурса.
$auth_settings = {
auth_type => 'Basic',
auth_name => "$name",
auth_user_file => '/somefile.pwd',
auth_require => 'valid-user',
}
$base_dir1 = {path => $document_root,
rewrites => [
{
comment => "rule1",
rewrite_base => "/",
rewrite_rule => ['^index\.html$ - [L]']
},
{
comment => "rule2",
rewrite_cond => ['%{REQUEST_FILENAME} !-f', '%{REQUEST_FILENAME} !-d'],
rewrite_rule => ['. /index.html [L]']
}
]
}
if $use_authentication {
$real_dir1 = merge($base_dir1, $auth_settings)
}
else {
$real_dir1 = $base_dir1
}
apache::vhost { "$name-non-ssl":
servername => $vhost_name,
docroot => $document_root,
port => 80,
access_log_file => 'access.log',
access_log_format => 'vhost_common',
error_log_file => 'error.log',
directories => [ $real_dir1 ],
}
Конечно, это немного сходит с ума с переменными.
Вариант 2. Создание пользовательской функции
Напишите функцию, которая принимает то, что $base_dir1
выше и логическое значение для $use_authentication
и возвращает объединенный хеш, если необходимо.
apache::vhost { "$name-non-ssl":
servername => $vhost_name,
docroot => $document_root,
port => 80,
access_log_file => 'access.log',
access_log_format => 'vhost_common',
error_log_file => 'error.log',
directories => [ add_auth($use_authentication, { ... }) ],
}
Вариант 3: встроить это
Вы можете небрежно выполнить слияние прямо в объявлении ресурса. Используйте селектор, чтобы решить, что объединить. Читаемость вне окна с этим.
apache::vhost { "$name-non-ssl":
servername => $vhost_name,
docroot => $document_root,
port => 80,
access_log_file => 'access.log',
access_log_format => 'vhost_common',
error_log_file => 'error.log',
directories => [ merge({path => $document_root,
rewrites => [
{
comment => "rule1",
rewrite_base => "/",
rewrite_rule => ['^index\.html$ - [L]']
},
{
comment => "rule2",
rewrite_cond => ['%{REQUEST_FILENAME} !-f', '%{REQUEST_FILENAME} !-d'],
rewrite_rule => ['. /index.html [L]']
}
]
}, $use_authentication ? {
true => {
auth_type => 'Basic',
auth_name => "$name",
auth_user_file => '/somefile.pwd',
auth_require => 'valid-user',
},
default => {}
}
)
],
}
Я не стал проверять этого монстра. Даже не уверен, что брекеты выстраиваются.
Вы можете избежать компромисса между (1) и (3), но, пожалуйста, наклонитесь к первому.