Параметры 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), но, пожалуйста, наклонитесь к первому.

Другие вопросы по тегам