Сценарий обновления веб-приложения - PullRequest
2 голосов
/ 01 февраля 2010

Я чувствую себя глупо, спрашивая это ...

Я не эксперт по написанию сценариев оболочки, но мне, наконец, достаточно роли сисадмина, и я хочу сделать это правильно.

У меня есть рабочий сервер, на котором размещено веб-приложение. Вот моя рутина.
1 - ssh на сервер
2 - cd django_src / django_apps / team_proj
3 - svn update
4 - sudo /etc/init.d/apache2 restart
5 - выход из системы

Я хочу создать сценарий оболочки для шагов 2,3,4.

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

Мой вопрос: Каков лучший способ написания таких повторяющихся процедур в bash (Linux, Ubuntu) для удаленного сервера?

Спасибо!

Ответы [ 10 ]

4 голосов
/ 01 февраля 2010

Нет ничего плохого в простом скрипте bash, который просто содержит реальные команды, которые вы вводите в командной строке. Не усложняй, чем нужно.

4 голосов
/ 01 февраля 2010

Лучший способ - просто, как вы предлагаете. Некоторые вещи, которые вы должны сделать для своего скрипта:

  • поставить set -e в верхней части сценария (после Шебанга). Это приведет к остановке вашего скрипта в случае сбоя любой из команд. Поэтому, если он не может перейти в каталог, он не будет запускать svn update или перезапускать Apache. Вы можете сделать это программно, поставив || exit 0 после каждой команды, но если это все, что вы делаете, вы также можете использовать set -e
  • Используйте полные пути в вашем скрипте. Не принимайте каталог, из которого запускается скрипт. В этом конкретном случае команда cd имеет относительный путь. Используйте полный (абсолютный) путь или переменную окружения, например, $ HOME.
  • Возможно, вы захотите настроить sudo, чтобы он мог запускать команду без запроса пароля. Это делает ваш скрипт неинтерактивным, что означает, что его можно запускать в фоновом режиме и из заданий cron и т. Д.

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

2 голосов
/ 02 февраля 2010

Поскольку вы используете python, посмотрите fabric - вы можете использовать его для автоматизации таких задач Первая установка ткани:

$ sudo easy_install fabric

, затем напишите свой скрипт для ткани:

from __future__ import with_statement
from fabric.api import *

def svnupdate():
    with cd('django_src/django_apps/team_proj'):
        run('svn update')
        sudo('/etc/init.d/apache2 restart')

Сохранить как fabfile.py, затем запустить с помощью команды fab:

$ fab -H hostname svnupdate

Скажи мне, что это не круто! : -)

2 голосов
/ 01 февраля 2010

Я бы настроил работу cron, делая это автоматически.

1 голос
/ 01 февраля 2010

Ожидайте - скриптовые интерактивные приложения

Expect - это инструмент для автоматизации интерактивных приложений, таких как telnet, ftp, passwd, fsck, rlogin, tip и т.д. Вы обнаружите, что Expect является абсолютно бесценным инструментом - с его помощью вы сможете автоматизировать задачи, о которых вы даже не думали раньше, - и вы сможете сделать эту автоматизацию быстро и легко.

http://expect.nist.gov

бонус: Ваши налоговые доллары на работе!

1 голос
/ 01 февраля 2010

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

1 голос
/ 01 февраля 2010

Вы можете легко сделать вышеупомянутое, используя bash / Bourne и т. Д.

Однако я бы потратил время и силы на изучение Perl (или некоторого такого же мощного языка сценариев).Почему?

  1. языковые конструкции гораздо более мощные
  2. нет конца библиотек для взаимодействия с системами / функциями, которые вы хотите написать
  3. из-заподдержка библиотек, вам не придется создавать разные команды для достижения желаемого (возможно, ценного в загруженной системе)
  4. вы можете разложить часто используемые скрипты на ваши собственные библиотеки для дальнейшего использования

Я выбираю Perl особенно потому, что он был разработан (возможно, разработанный - слишком сильное слово для Perl) для такого рода задач.Однако вы можете проверить Ruby / Python или другие предложения от участников SO.

1 голос
/ 01 февраля 2010

Вы можете сделать это с помощью оболочки (bash, ksh, zsh + ssh + tools) или языков программирования, таких как Python, Perl (Ruby или PHP или Java) и т. Д., В основном это язык, который поддерживает протокол SSH и функции операционной системы.,«Лучшим» является тот, в котором вы чувствуете себя более комфортно и обладаете знаниями. Если вы используете sysadmin, оболочка - это самая близкая вещь, которую вы можете использовать.Затем, выполнив сценарий, вы можете использовать crontab (cron) или команду at для планирования своей задачи.проверьте их справочную страницу для получения дополнительной информации

0 голосов
/ 02 февраля 2010

Просто добавьте еще один совет - вы не должны предоставлять пользователям доступ к некоторым приложениям в неизвестном состоянии. svn up может сломаться во время обновления, пользователи могут увидеть страницу, которая уже наполовину нова, и т. Д. Если вы развертываете все приложение сразу, я бы предложил вместо этого сделать svn export в новом каталоге, а затем либо mv current old ; mv new current, либо даже current в качестве ссылки на каталог, который вы используете сейчас. Все еще не идеален и не блокирует все возможные условия гонки, но это определенно занимает меньше времени, чем svn up на живой копии.

0 голосов
/ 02 февраля 2010

Я бы, наверное, сделал что-то подобное ...

project_update.sh


#!/bin/bash
#
# $1 - user@host
# $2 - project directory

[[ -z $1 || -z $2 ]] && { echo "usage: $(basename $0) user@host project_dir"; exit 1; }

declare host=$1 proj_dir=$2

ssh $host "cd $proj_dir;svn update;sudo /etc/init.d/apache2 restart" && echo "Success"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...