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

Избегайте объявления операторов регулярного выражения if при использовании экспортированных ресурсов в Puppet

Избегайте добавления хоста вручную

class::define {  [
    'host1.domain',
    'host2.domain'
  ]:
    attribute  => 'hello',
    attribute2 => 'world'
}

class::define {  [
    'host3.domaintwo',
    'host4.domaintwo'
  ]:
    attribute  => 'apple',
    attribute2 => 'orange'
}

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

if $fqdn =~ /^.*\.domain$/ {
  @@class::define { $fqdn:
    attribute  => 'hello',
    attribute2 => 'world',
    tag => 'test'
  }
}

if $fqdn =~ /^.*\.domaintwo$/ {
  @@class::define { $fqdn:
    attribute  => 'apple',
    attribute2 => 'orange',
    tag => 'test2'
  }
}

Class::define <<| tag == 'test' and tag == 'test2' |>> 

работает как положено.

Вопрос

Можно ли опустить операторы if для получения того же результата?

Сделав экспорт безусловным, вы спровоцируете конфликт, потому что в манифесте теперь объявляется экспортируемый ресурс.

Class::Define[$fqdn]

дважды (с разными атрибутами).

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

@@class::other_define {
    "hello-$fqdn":
        fqdn => $fqdn,
        attribute  => 'hello',
        attribute2 => 'world',
        tag => 'test';
    "fruit-$fqdn":
        fqdn => $fqdn,
        attribute  => 'apple',
        attribute2 => 'orange',
        tag => 'test2';
}

Просто убедитесь, что использовать в fqdn фактически в заголовках ресурсов, так что экспорт от разных агентов не будет конфликтовать.

Кстати, я не уверен, почему вы выбираете разные теги и почему импортируете только ресурсы, у которых есть обе теги работают «как положено». Фактически, я ожидал, что это ничего не импортирует.