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

Можно ли уведомить ресурс File [] в Puppet и активировать ресурсы, подписанные на этот файл?

Мы используем 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. Представление нового файла означает либо:

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

Один из вариантов - вести централизованный список услуг:

$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'],
               ],
}

Это должно сработать.