Мы используем Puppet для управления установкой OpenStack. OpenStack состоит из ряда слабо связанных частей, все из которых обмениваются данными через AMQP. Некоторые части используют общий файл конфигурации (/etc/nova/nova.conf
), поэтому типичный сервисный ресурс выглядит так:
service { 'openstack-nova-network':
ensure => running,
enable => true,
subscribe => File['/etc/nova/nova.conf'],
}
Все это отлично работает.
Теперь мы используем Puppet для установки исправления в некоторый базовый код Python. Когда мы заменяем один из исходных файлов Python, мы хотели бы перезапустить службы, которые его используют. В общем, это точно такой же набор услуг, на которые подписаны /etc/nova/nova.conf
.
Я надеялся, что смогу воспользоваться существующими зависимостями, уведомив файл, вот так ...
file { '/path/to/some/file':
source => 'puppet:///.../',
notify => File['/etc/nova/nova.conf'],
}
... но, похоже, это не сработало. Помимо явного указания notify
записи для каждой службы, есть ли лучший способ сделать это?
ОБНОВИТЬ
Вы знаете, я начинаю подозревать, что мой вопрос не совсем ясен. Я хотел бы извиниться за недоразумение и попытаться сделать свой запрос более ясным:
Я понимаю, что могу сделать это с набором явных зависимостей, либо как subscribe
ценности услуг или notify
значения в установленных файлах. Проблема в том, что это означает поддержание матрицы зависимостей M * N. Представление нового файла означает либо:
service
ресурсы, илиfile
РесурсыТакого рода повторяющиеся операции копирования и вставки подвержены ошибкам, особенно когда за конфигурацию отвечают несколько человек.
Один из вариантов - вести централизованный список услуг:
$services = [ service1, service2, service ]
Потому что тогда я мог сделать это:
file { '/usr/lib/python/glance/notifier/notify_qpid.py':
notify => Service[$services],
}
Но это не сработает, потому что список сервисов на разных хостах разный. Возможно, я могу перевернуть это и поддерживать список файлов "исправлений":
$hotfix_files = [
'/usr/lib/python2.6/site-packages/glance/notifier/notify_qpid.py',
'/root/puppet/modules/openstack/files/nova/impl_qpid.py',
]
А затем обновите все определения сервисов один раз:
service { 'openstack-nova-network':
ensure => running,
enable => true,
subscribe => [
File['/etc/nova/nova.conf'],
File[$hotfix_files],
]
}
Но для этого по-прежнему необходимо вручную вести список измененных файлов.
Что я действительно хочу сделать, так это сказать: «уведомить все службы, на которые подписаны /etc/nova/nova.conf
".
Главное, что вам нужно, "уведомить все службы, которые подписаны на /etc/nova/nova.conf", не представляется возможным с file
-Ресурсы. Но это работает с exec
-ресурсы, с refreshonly
-параметр. (Просто протестировал аналогичную конфигурацию с Марионетка 2.7.11). Вы должны добавить манекен exec
-ресурс:
exec {'dummy-nova-refresh':
command => "/bin/true",
refreshonly => true,
}
Когда команда запущена, exec
рассылает уведомление всем своим подписчикам. И refreshonly
-parameter гарантирует, что команда запускается только при обновлении.
Подпишитесь на все услуги этого Exec:
service { 'openstack-nova-network':
ensure => running,
enable => true,
subscribe => Exec['dummy-nova-refresh'],
}
И использовать уведомление со всех файловых ресурсов. (Сделайте это также для /etc/nova/nova.conf
, или укажите его в списке подписок для каждого service
):
file { '/path/to/some/file':
source => 'puppet:///.../',
notify => Exec['dummy-nova-refresh'],
}
И готово. Изменение в любом файле вызывает обновление всех служб, на которые подписаны 'dummy-nova-refresh'
.
Я не особо разбираюсь ни в одной из этих технологий, но думаю, что вам нужно подписаться на службу, которую вы хотите перезапустить, на замененный файл. Что-то вроде:
configfile { "/etc/httpd/conf/httpd.conf":
source => "/httpd/httpd.conf",
mode => 644,
}
service { httpd:
running => true,
subscribe => file["/etc/httpd/conf/httpd.conf"]
}
Не уверен, правильно ли написан этот синтаксис, но я надеюсь, что вы поняли идею.
service { 'openstack-nova-network':
ensure => running,
enable => true,
subscribe => [
File['/etc/nova/nova.conf'],
File['/path/to/some/file'],
],
}
Это должно сработать.