Я пытаюсь настроить виртуальные хосты 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.