У нас много серверов, и мы все еще хотим их все обновить. Фактический способ состоит в том, что любой из системных администраторов переходит с сервера на сервер и выполняет 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 на бесчисленном количестве серверов.
Ты обязательно люблю Поваренная соль.
Итак, я думаю, есть много вещей, которые способствуют хорошему решению:
Пропускная способность: В основном мне приходят в голову две альтернативы для экономии трафика:
Администрация: Я бы настроил параллельную оболочку вроде ПДШ,ПСШ,GNU Parallel и выполните команду на всех клиентах, если я ранее тестировал команду на примере машины. Тогда маловероятно, что он может вывести из строя все остальные. В качестве альтернативы вы можете рассмотреть возможность задания cron для всех клиентов, но тогда оно может выйти из строя автоматически, поэтому я бы предпочел первое решение.
Если вас беспокоит одновременность обновлений, вы можете запланировать свои команды с помощью at
логирование: Как и в случае с параллельными оболочками, у вас есть возможность перенаправить вывод, я бы объединил stderr и stdout и записал его в файл журнала.
Моя собственная параллельная оболочка ssh: класс является альтернативой различным инструментам параллельного и кластерного ssh.
Возможно, вам это нравится больше, а может вы это ненавидите. Я упоминаю об этом только по трем причинам:
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"
Любое другое обновление выполняется вручную, с помощью экрана или другого подходящего средства, так как во время обновления может потребоваться вмешательство вручную.