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

Доступ к переменной узла в классе и использование ее в условном

Я пытаюсь настроить виртуальные хосты Apache с помощью Puppet и пробовал разные вещи без особого успеха.

Я определил узел следующим образом:

node 'test1.cob' inherits serveurClient {
        $smcvhost = 'all'
}

Класс serveurClient включает класс apache. Это отлично работает, поскольку Apache устанавливается и вся конфигурация применяется правильно, кроме виртуальных хостов.

Конфигурация, относящаяся к виртуальным хостам, следующая:

class apache::config {
    File{
        require => Class["apache::install"],
        notify  => Class["apache::service"],
        ensure  => present,
        owner   => "www-data",
        group   => "www-data",
        mode    => 755
    }
    ...
    if ( $smcvhost == 'belleville' ) or ( $smcvhost == 'all' ) {
        apache::smcvhost{'belleville':
            client => 'belleville',
        }
    }
    ...
}

В apache :: smcvhost определение работает правильно, потому что, если я укажу его прямо в узле без условия, виртуальный хост будет создан правильно, без ошибок. Если я удалю оператор if, он также будет создан правильно. Я попытался указать только второе условие, но это не помогло.

Когда это не удается выполнить, я не получаю никаких ошибок. В марионеточном отчете эта часть конфигурации просто игнорируется.

Я думаю, что это своего рода проблема с областью видимости переменных, но из того, что я прочитал, эта практика кажется правильной, и я полагаю, что марионетка выдала бы мне некоторую ошибку, если бы я попытался оценить несуществующую переменную.

Puppet не предупреждает вас об отключенных переменных (за исключением шаблонов, как ни странно), и, когда вы устанавливаете переменную, только указанные после это затронуто. Так:

node 'test1.cob' inherits serveurClient {
        # Nothing above this line knows $smcvhost
        $smcvhost = 'all'
        # Stuff from this line until "}" knows $smcvhost
}
        # Stuff from this point on don't know $smcvhost

Если вы посмотрите примечания к выпуску для последних версий Puppet, вы увидите, что динамическая область видимости находится на пути к прекращению использования. Мой совет - по возможности избегать использования переменных для передачи информации - используйте параметры, например, в определениях или классах с параметрами.

Вместо того:

узел 'test1.cob' наследует serveurClient {$ smcvhost = 'all'}

если вы это сделаете:

node 'test1.cob' {$ smcvhost = 'all' include serveurClient}

тогда ваша переменная будет существовать в области serveurClient, где, как я предполагаю, имеется ссылка на ваш класс apache.