我觉得这很傻......
我不是shell脚本的专家,但我终于有足够的系统管理员角色,我想要正确地做到这一点。
我有一个托管webapp的生产服务器。这是我的惯例。
1 - ssh到服务器
2 - cd django_src / django_apps / team_proj
3 - svn更新
4 - sudo /etc/init.d/apache2重新启动
5 - 注销
我想为步骤2,3,4创建一个shell脚本。
我可以这样做,但它将是一个非常简单的bash脚本,只包含我在命令行输入的实际命令。
我的问题:在bash(Linux,Ubuntu)中为远程服务器编写这种重复过程的最佳方法是什么?
谢谢!
答案 0 :(得分:4)
最好的方法就像你建议的那样。你应该为你的脚本做的一些事情是:
set -e
放在脚本的顶部(在shebang之后)。如果任何命令失败,这将导致脚本停止。因此,如果它无法cd到目录,它将不会运行svn update
或重新启动apache。您可以通过在每个命令后面添加|| exit 0
来以编程方式执行此操作,但如果您正在执行此操作,则可以使用set -e
cd
命令具有相对路径。使用完整(绝对)路径,或使用类似$ HOME的环境变量。随着时间的推移,您可以添加功能并使用命令行参数来参数化脚本。但是不要在前面这么做。只需根据需要改进脚本。
答案 1 :(得分:4)
简单的bash脚本简单地包含您在命令行输入的实际命令没有任何问题。不要让它变得比必要的复杂。
答案 2 :(得分:2)
我自动设置了一个cron作业。
答案 3 :(得分:2)
由于您正在使用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
告诉我这不酷! : - )
答案 4 :(得分:1)
你可以使用shell(bash,ksh,zsh + ssh + tools)或编程语言(如Python,Perl(Ruby或PHP或Java)等)来实现这一点,基本上是一种支持SSH协议和操作系统功能的语言。 “最好”的是你更舒服并且掌握了知识的那个。如果你正在使用sysadmin,那么shell是你可以使用的最接近的东西。完成脚本后,可以使用crontab(cron)或at命令来安排任务。查看他们的手册页以获取更多信息
答案 5 :(得分:1)
您可以使用bash / Bourne等轻松完成上述操作。
但是,我会花时间和精力学习Perl(或类似功能强大的脚本语言)。为什么?
我特别选择Perl,因为它是针对这些任务设计的(可能设计对于Perl来说太强大了)。但是,您可能需要查看来自SO贡献者的Ruby / Python或其他建议。
答案 6 :(得分:1)
基本步骤请看camh的答案。如果您计划通过cron运行脚本,那么实现一些简单的日志记录,例如通过将带有退出代码的每个命令的开始时间附加到文本文件中,以后可以分析脚本的失败。
答案 7 :(得分:1)
期望 - 编写交互式应用程序脚本
Expect是一个自动化交互式应用程序的工具,如telnet,ftp,passwd,fsck,rlogin,tip等等。期望可以轻松完成各种其他任务非常困难的任务。你会发现Expect是一个绝对宝贵的工具 - 使用它,你将能够自动执行你以前从未想过的任务 - 并且你将能够快速,轻松地完成这种自动化。
奖金:您的税金在工作!
答案 8 :(得分:0)
我可能会做这样的事情......
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"
答案 9 :(得分:0)
只是添加另一个提示 - 您不应该让用户访问处于未知状态的某个应用程序。更新过程中svn up
可能会中断,用户可能会看到一半半新的页面,等等。如果您要一次部署整个应用程序,我建议您svn export
代替新目录然后mv current old ; mv new current
,或甚至保留current
作为您现在使用的目录的链接。仍然不完美,并没有阻止所有可能的竞争条件,但它确实比实时副本上的svn up
花费的时间更短。