Могут ли инструменты управления конфигурацией (Puppet, Chef) поддерживать установленные пакеты в актуальном состоянии?

28

Это, вероятно, простой вопрос для тех из вас, кто уже использует инструменты управления конфигурацией. Являются ли инструменты управления конфигурацией, такие как Puppet или Chef, правильным подходом для обновления установленных пакетов?

Предположим, я использую несколько серверов, в основном на основе Debian и Ubuntu. Средства управления конфигурацией облегчают обновление пакетов, установленных из репозиториев, когда появляются обновления безопасности или исправления ошибок?

В настоящее время я запускаю «автоматические обновления», чтобы позволить системам автоматически устанавливать обновления безопасности, но мне все равно приходится подключаться к серверам и запускать их aptitude update && aptitude safe-upgradeтак часто. Естественно, чем больше серверов, тем скучнее, утомительнее и подвержен ошибкам.

Являются ли такие инструменты, как Puppet или Chef, правильным подходом для обновления установленных пакетов? Кто-нибудь из вас использует эти инструменты, чтобы избежать запуска вручную aptitudeили аналогичного на 15 серверах? Я совершенно уверен, что ответ на эти вопросы "Да, конечно!"

Но где я могу найти больше информации об этом конкретном случае использования? У меня еще не было времени, чтобы углубленно изучить Puppet или Chef, и в примерах поваренных книг или классов показаны только более или менее тривиальные примеры установки одного конкретного пакета, такого как ssh. Есть ли у вас какие-либо ресурсы, чтобы рекомендовать, кроме официальной документации (я, конечно, собираюсь изучать документы, как только узнаю, какой из инструментов, если таковые имеются, мне подходит).

Дафф
источник
Хороший вопрос, я прочитал некоторый урок [который я не могу найти], в котором говорится о том, как держать Debian в курсе последних событий, но сам никогда не пробовал. будет интересно увидеть ответы тех, кто использует это в производстве
pQd

Ответы:

9

Puppet (я уверен, что шеф-повар тоже) связывается с вашими репозиториями программного обеспечения apt-get / yum . Поскольку они занимаются выяснением того, какие пакеты доступны, это означает, что ensure => latestэто работает только для Ubuntu / CentOS / Debian и тому подобное. Если вы правильно настроили соответствующие файлы ( /etc/apt/sources.listи т. Д.).

Perlchild
источник
1
Ответы, касающиеся Puppet или аналогичного управления каждым пакетом, означают, что вы должны отслеживать все пакеты в Puppet, даже те, которые являются частью базовой установки дистрибутива Linux. Использование таких инструментов, как unattended-upgradesили yum-cronдля автоматизации обновлений, требует гораздо меньше усилий - просто используйте Puppet / Chef / Ansible для настройки этих инструментов.
RichVel
22

Вы можете сделать это с куклой, вы можете сделать:

ensure => latest,

или

ensure=> "1.0.2",

указать последнюю / требуемую версию. т.е.

package { apache2: ensure => "2.0.12-2" }
package { apache2: ensure => latest }

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

Запуск автоматических обновлений меня немного пугает, особенно если они обновляют критически важные пакеты, ядра, библиотеки mysql, apache и т. Д. Особенно, если сценарий установки может захотеть перезапустить службу!

Том О'Коннор
источник
Спасибо за ответ! Таким образом, кажется, что обновление пакетов, которые были установлены через Puppet, по крайней мере возможно. Хорошо знать. Но как насчет серверов, работающих под разными версиями пакетов? Как в Debian Lenny vs Ubuntu 8.04 и 9.10? Должен ли я заботиться о версиях вручную? Кажется, мне нужно еще кое-что исследовать. Я не уверен, чего я ожидал, возможно, что-то в духе ландшафта Canonical, которое предлагает веб-интерфейс и другие более или менее интересные вещи для обновления пакетов на нескольких серверах.
daff
Для серверов, работающих под разными версиями, это становится сложным. Вам нужно иметь различные блоки в вашем манифесте puppet, где он использует Facter для получения ключевого слова lsb_release или debian_version из / etc, а затем принимает решения на основе того, какой пакет установить. Я не видел пейзаж, используемый в гневе на производственных серверах, я полагаю, это довольно дорого.
Том О'Коннор
2
ensure => latestвсегда будет следить за тем, чтобы все было в соответствии с тем, что предоставляет ваш набор хранилищ.
Уомбл
18

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

Я делаю это, чтобы поддерживать выделенное репозиторий Yum (для Redhat / Fedora / CentOS; репозиторий APT для Debian / Ubuntu), который содержит пакеты, которые мне нужны для определенного сайта. Как правило, это будут зависимости самого приложения (Ruby, PHP, Apache, Nginx, библиотеки и т. Д.) И пакетов, критичных для безопасности.

После того, как вы это настроите (обычно вы можете просто зеркально отразить требуемые пакеты из репозитория upstream), вы можете использовать синтаксис Puppet «sure => latest», чтобы убедиться, что все ваши машины будут обновлены по репо.

Было бы разумно использовать «промежуточное» хранилище, чтобы вы могли тестировать обновленные версии пакетов, прежде чем без промедления развернуть их в производство. Это легко сделать с помощью Puppet без дублирования кода с помощью шаблонов репозитория.

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

Все эти советы в равной степени относятся к драгоценным камням Ruby, яйцам Python и другим системам пакетов, которые вы можете использовать.

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

Джон Арундел
источник
5

В то время как Puppet / Chef являются возможными претендентами на эту функцию, для того, чтобы они обновляли все в системе, требуются либо пользовательские типы, либо список каждого пакета (включая базовые системные библиотеки, такие как libc6) в качестве ресурсов ensure => latest. В конкретном случае автоматических обновлений пакетов вы можете посмотреть на cron-aptпакет, который также делает то, что вы хотите.

romble
источник
или просто выполним задание exec "yum update" с большим временем воспроизведения. У меня все равно работает.
Sirex
5

Этот вопрос старый, но я думал, что отвечу самым современным образом, так как существующий в то время ответ был недоступен.

Если вы используете марионетку или шеф-повара, посмотрите на mcollective. Это очень хороший инструмент от ребят из puppetlabs, который позволяет отправлять команды группам серверов. http://docs.puppetlabs.com/mcollective/

Он также имеет подключаемый модуль apt, который можно использовать для обновления apt на любом количестве серверов: http://projects.puppetlabs.com/projects/mcollective-plugins/wiki/AgentApt

Уолтер Хек
источник
4

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

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

Вот фрагмент обещания из моей конфигурации cfengine:

    packages:
            "apache2"
                    package_method => "apt",
                    package_policy => "update";

Надеюсь это поможет.

Джонатан Кларк
источник
2

Я согласен с Джонатаном. Подход Cfengine 3 хорош, потому что вы можете контролировать все аспекты управления пакетами без необходимости перекодирования на низком уровне.

SAnnukka
источник
1

Вы также можете использовать инструменты управления пакетами, такие как Canonicals Landscape, которая предназначена для управления и мониторинга систем Ubuntu / Debian. Он управляет несколькими системами, позволяет обновлять их одновременно и предоставляет некоторые основные возможности мониторинга.


источник
0

Обновления безопасности

Обычно я думаю, что проще всего использовать Ansible или аналогичный для установки надежного пакета автоматических обновлений для Ubuntu / Debian (или yum-cronдля RHEL / CentOS). Вы можете использовать Puppet, Chef или другие инструменты, но я буду обсуждать Ansible здесь.

  • unattended-upgrades может использоваться для одновременного внесения обновлений, не связанных с безопасностью, что намного проще, чем ежедневное выполнение команды через Ansible.

  • unattended-upgradesзаботится об автоматических обновлениях каждый день и обычно ограничивается только обновлениями безопасности (для повышения стабильности). Если после обновления сервер нуждается в перезагрузке, этот инструмент может автоматически перезагрузиться в определенное время.

Если ваши перезагрузки являются более сложными, unattended upgradesмогут отправить вам электронное письмо, и это также создает /var/run/reboot-required, так что Ansible (или аналогичный) может управлять перезагрузками в подходящее время (например, непрерывные перезагрузки кластера веб-серверов или серверов БД, чтобы избежать простоев, ожидая каждого сервер должен быть доступен на определенном порту TCP, прежде чем продолжить).

Вы можете использовать роли Ansible, такие как jnv.unattended-upgrades для систем Ubuntu / Debian, или простой, но эффективный geerlingguy.security , который также охватывает RHEL / CentOS (и укрепляет конфигурацию SSH).

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

Общие обновления

Обновления, отличные от безопасности, должны проходить обычную непрерывную интеграцию и процесс тестирования, чтобы гарантировать, что вещи не сломаются

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

RichVel
источник