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