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

Системные обновления для многих серверов

У нас много серверов, и мы все еще хотим их все обновить. Фактический способ состоит в том, что любой из системных администраторов переходит с сервера на сервер и выполняет aptitude update && aptitude upgrade - все равно не круто.

Сейчас я ищу решение, которое еще лучше и очень умно. Может ли марионетка выполнять эту работу? Как ты это делаешь?

Вы можете использовать exec типа, например:

exec { "upgrade_packages":
    command => "apt-get upgrade -q=2",
    path    => "/usr/local/bin/:/bin/:/usr/bin/",
    # path  => [ "/usr/local/bin/", "/bin/" ],  # alternative syntax
}

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

В apt-get upgrade команда интерактивна. Чтобы он работал тихо, вы можете добавить опцию -q=2 как показано выше.

если все ваши хосты являются debian, вы можете попробовать пакет unattended-updates.

http://packages.debian.org/sid/unattended-upgrades

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

Недавно наша команда тестирует инструмент mcollective для выполнения команд на всех серверах, но для использования mcollective необходимы навыки рубина.

[s] Guto

Я бы рекомендовал пойти на Puppet, facter и mCollective.

mCollective - очень хороший фреймворк, в котором вы можете запускать команды на нескольких хостах (параллельно), используя фактор в качестве фильтра.

Добавьте к этому локальный прокси / кеш, и вы будете хорошо настроены для управления серверами.

Используйте инструмент, предназначенный для запуска одной команды на нескольких серверах. И под этим я не имею в виду наличие kazillion терминалов, открытых с помощью Terminator или ClusterSSH, а вместо этого наличие одного терминала для сервера управления, на котором выполняется инструмент, подходящий для работы.

В этом контексте я бы порекомендовал func, Salt или mCollective. Если у вас уже есть Puppet, выберите mCollective (он прекрасно интегрируется в Puppet). Если вы этого не сделаете, и у вас есть старый Python на ваших машинах, вам может понравиться func. Если вы новичок в Python, попробуйте Salt. Все эти инструменты запускают команду, указанную в командной строке, асинхронно, что намного интереснее, чем последовательный цикл ssh или даже выполнение тех же команд aptitude в бесчисленных окнах Terminator на бесчисленном количестве серверов.

Ты обязательно люблю Поваренная соль.

Итак, я думаю, есть много вещей, которые способствуют хорошему решению:

  • Пропускная способность
  • Легкость администрирования
  • Подробное протоколирование на случай, если что-то напортачит.

Пропускная способность: В основном мне приходят в голову две альтернативы для экономии трафика:

  • Настройка зеркала Debian и настройка всех клиентов для использования этого зеркала см. http://www.debian.org/mirror/ Больше подробностей. (Я бы порекомендовал это)
  • Настройка прокси (apt-cacher, apt-proxy или Squid) и увеличение кеша, чтобы все ваши клиенты могли получать прибыль от этого кеша

Администрация: Я бы настроил параллельную оболочку вроде ПДШ,ПСШ,GNU Parallel и выполните команду на всех клиентах, если я ранее тестировал команду на примере машины. Тогда маловероятно, что он может вывести из строя все остальные. В качестве альтернативы вы можете рассмотреть возможность задания cron для всех клиентов, но тогда оно может выйти из строя автоматически, поэтому я бы предпочел первое решение.

Если вас беспокоит одновременность обновлений, вы можете запланировать свои команды с помощью at

логирование: Как и в случае с параллельными оболочками, у вас есть возможность перенаправить вывод, я бы объединил stderr и stdout и записал его в файл журнала.

Моя собственная параллельная оболочка ssh: класс является альтернативой различным инструментам параллельного и кластерного ssh.

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

  • Его чрезвычайно просто установить и использовать: один файл .py без внешних зависимостей, кроме стандартных библиотек Python 2.5.
  • В своих пределах он чрезвычайно надежен. Я использую его каждый рабочий день, часто почти 100 раз в день и обычно для наборов от сотен до нескольких тысяч целей на команду. (Я тестировал его на целевых списках более чем 25 тысяч серверов одновременно). Он никогда не запускался, не завершался и не приводил к неопределенному поведению. (Единственные ограничения, связанные с ограничениями Python subprocess.communicate() method --- так что вы можете получить только около 64 КБ стандартного вывода и, например, отдельно до 64 КБ стандартного вывода; также любой удаленный процесс, который пытается читать со своего стандартного ввода, просто остановится, пока локальный подпроцесс ssh не будет убит автоматически классобработка тайм-аута)
  • Очень просто написать собственный сценарий на Python, чтобы использовать classh.py как модуль. Так что очень легко написать что-то вроде:

    
        !#/bin/env python
        import classh
        job = classh.SSHJobMan(cmd, targets)
        job.start()
        while not job.done():
            completed = job.poll()
            for i in completed:
                # do something with the classh.JobRecord object referenced by i
        # done

    # You can optionally do post-processing on the dictionary of JobRecords here # keyed off the target strings (hostnames) </code></pre>

Это все, что нужно сделать. Например, во вложенном завершенном цикле вы можете собрать список всех тех, которые вернули определенный статус выхода или сканировать определенные сообщения об ошибках, и настроить последующие задания для их обработки. (Задания будут запускаться одновременно, по умолчанию 100 заданий в любое время, пока каждое из них не будет завершено; поэтому простая команда на нескольких сотнях хостов обычно выполняется за несколько секунд, а очень сложный сценарий оболочки в одной длинной командной строке. ... скажем, около пятидесяти строк ... можно завершить несколько тысяч хостов примерно за 10 минут ... около 10 тысяч хостов в час в моей среде, причем многие из них расположены на разных континентах).

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

Ответ с использованием exec очень полезен.

Однако, согласно руководству по apt-get, не рекомендуется использовать -q = 2 таким образом (хотя я использовал его в течение многих лет без проблем)

-q, --quiet
       Quiet; produces output suitable for logging, omitting progress indicators. More q's will produce more quiet up to a maximum of 2. You can also use -q=# to set the
       quiet level, overriding the configuration file. Note that quiet level 2 implies -y, you should never use -qq without a no-action modifier such as -d, --print-uris or
       -s as APT may decided to do something you did not expect. Configuration Item: quiet.

Я сам много лет использовал сценарий, выполняя команду apt-get следующим образом:

ssh example.org "apt-get update && apt-get -y upgrade && apt-get -y dist-upgrade && apt-get clean"

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

В течение многих лет я с удовольствием обновлял и устанавливал пакеты, используя умелый. Это легкий и эффективный инструмент для удаленного управления пакетами. Оно использует screen, sudo и ssh.
Для управления пакетами умелый может быть более простым решением, чем инструменты управления конфигурацией.
умелый удобен для централизованного управления пакетами в различных вариантах GNU / Linux, таких как Debian и CentOS.

ты можешь использовать Ткань. Fabric - это библиотека Python (2.5–2.7) и инструмент командной строки для оптимизации использования SSH для развертывания приложений или задач системного администрирования.

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

Или

Использовать кластерный ssh

Или

ПСШ

Другое решение, если все ваши хосты работают под Debian (или его производными), - это использовать cron-apt пакет. Но, как указано в документации, следует соблюдать осторожность.

В настоящее время я использую cron-apt на десятке серверов для автоматического и автоматического выполнения всех обновлений безопасности. Чтобы избежать нежелательных обновлений, я использую cron-apt только на серверах, на которых работает стабильный дистрибутив Debian, и я обязательно настроил свои источники apt, поэтому используйте имя дистрибутива, хриплый, а не его псевдоним (стабильный).

Конкретная конфигурация cron-apt, которую я использую, обобщена в одном файле действий: /etc/cron-apt/action.d/5-install

dist-upgrade -y -o APT::Get::Show-Upgraded=true -o Dir::Etc::SourceList=/etc/apt/sources.list.d/security.list -o Dir::Etc::SourceParts="/dev/null"

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