В Puppet, как использовать определенные переменные узла в предложении if - PullRequest
0 голосов
/ 12 сентября 2018

В классе кукол как мне проверить, установлена ​​ли переменная в узле?Я использую имя виртуальной машины (например, server1) и имя домена (например, example.org), где пользователи могут получить доступ к странице.«example.org» не будет передаваться через факт, поэтому мне нужно передать его через параметр класса.Я придумал этот способ, чтобы определить переменную в блоке узла и использовать ее в своем тестовом классе для своих настроек.

node "VM1" {
  class { 'test':
    domainname => "example.org",
  }

[...]

class test ($domainname) {
  ini_setting {
    'set_property':
      ensure  => present,
      path    => '/tmp/test.ini',
      section => 'main',
      setting => 'url',
      value   => "https://$domainname";
  }

[...]

Но теперь я хочу добавить условие, что если $domainname не установлен, то вместо него следует использовать факт $hostname.

ini_setting {
    'set_property':
    ensure  => present,
    path    => '/tmp/test.ini',
    section => 'main',
    setting => 'url',
    if $domainname !~ $hostname {
      value   => "https://$domainname";
    } else {
      value   => "https://$hostname";
    }

Но сейчасЯ получаю такую ​​ошибку каждый раз:

Ошибка: не удается получить каталог с удаленного сервера: ошибка 500 на сервере SERVER: ошибка сервера: синтаксическая ошибка в доменном имени

Что мне делать вместо этого?

1 Ответ

0 голосов
/ 12 сентября 2018

Сообщение об ошибке объясняет вам, что операторы if не могут появляться внутри объявлений ресурсов.Однако существует другая условная форма, называемая «селектором», которая может появляться внутри объявлений ресурсов .Это аналог Puppet троичного оператора ?:, который встречается в нескольких языках.

Стилистически, однако, обычно лучше сохранять декларации ресурсов как можно более простыми.Для этого вам, вероятно, следует установить переменную, условно, вне объявления ресурса, а затем использовать ее значение внутри.Используя ваше собственное условие, оно может выглядеть так:

  if $domainname !~ $hostname {
    $url_value = "https://$domainname";
  } else {
    $url_value = "https://$hostname";
  }

  ini_setting {
    'set_property':
      ensure  => present,
      path    => '/tmp/test.ini',
      section => 'main',
      setting => 'url',
      value   => $url_value;
  }

Кроме того, я отмечаю, что ваше конкретное условие, повторенное выше, весьма подозрительно.В последней версии Puppet (версия 4 и выше) вы должны использовать типы данных Puppet, чтобы как объявить параметры вашего класса, так и проверить их.В частности, если допустимо объявлять тест класса без предоставления параметра $domainname, вы должны объявить этот класс следующим образом:

# Using the Puppet v4+ type system
class test(
  Optional[String] $domainname = undef
) {
  # ...

и проверить, было ли предоставлено значение для $domainnameнапример, так:

  if $domainname =~ Undef {
    # ...
  }

Вы не можете использовать систему типов в более ранних версиях Puppet, но там вы можете полагаться на неопределенные переменные, которые расширяются до нуля при их интерполяции:

# Using the Puppet v3- behavior
class test(
  $domainname = undef
) {
  # ...

  if "$domainname" == "" {
    # ...
  }

  # ...
}
...