AppDeploy是一个通过SSH实现的命令行工具,可完成应用部署和远程运维管理。当前工具实现为两个版本:普通版(伪代码描述语言)和Python版。Python版使用Python语法规则,可实现您的各种应用需求;普通版语法简单、容易上手,是对Python版本的精简。两个版本当前都是免费使用。下载地址如下:
普通版: Python版: 1 介绍一下AppDeploy的主要功能 1).远程应用部署: 可以将本地应用安装部署到远程云服务器,软件包可以在本地编译打包好,也可以选择在云服务器编译安装; 2).远程运维管理: 您可以使用AppDeploy远程执行shell脚本,让操作命令感觉在本地执行一般,大大的提高开发者的工作效率; 3).一键环境安装: 一键安装Web环境,当前支持Java、Nginx、Apache、Tomcat、PHP、Mysql等多款环境,可以根据具体业务选择适合工具的适合版本进行安装; 4).一键应用部署: 可以一键编译、打包、部署常见的应用,支持Maven、Ant等打包部署的安装方案; 5).一键式更新源: 执行AppDeploy自定义命令(update_source)更新系统源,支持Ubuntu、Centos、Redhat、Opensuse、Debian等系统的主流版本; 6).文件上传下载: 您可以使用AppDeploy在本地主机和远程服务器间实现上传、下载文件(夹)的功能;不仅实现了ftp的功能,还可以远程执行管理命令; 7).并发控制机器: 基于软件的部署场景,提供同时在多台服务器部署的功能,且可以选择顺序执行或者并发执行的运行模式;上面叙述的功能都可以使用并发模式在多服务器间同时运行。 8).账号密码管理: 提供灵活、易用的账号管理功能,用户可以设置免密码输入运行,且可为不同主机设置不同密码; 2.AppDeploy的安装& 配置 AppDeploy支持在Windows、Linux、Mac系统下使用,远端服务器当前只支持Linux系统。根据不同系统分别介绍安装步骤(以Python版为例,普通版类似): Linux系统平台安装: 请预先安装好python2.7;(一般安装在/usr/local/lib/python2.7) 1).通过下载AppDeploy源码安装包 - AppDeploy-Python-1.0.0.tar.gz; 2).解压:$ tar –zvxf AppDeploy-Python-1.0.0.tar.gz;得到AppDeploy-Python-1.0.0-Linux.tar.gz; 解压:$ tar –zvxf AppDeploy-Python-1.0.0-Linux.tar.gz; 3).执行:$ cd AppDeploy-Python && sudo python setup.py install 安装appdeploy; 4).执行:$ adep命令,若果能找到命令说明安装完成(下图表示安装成功); Windows系统安装: 预先安装好python2.7;(一般安装在C:/Python27); 1).通过下载AppDeploy windows安装包 - AppDeploy-Python-1.0.1.zip; 2).解压:$ tar –zvxf AppDeploy-Python-1.0.1.tar.gz ->AppDeploy-Python-1.0.1-Windows.tar.gz; 3).解压:$ tar –zvxf AppDeploy-Python-1.0.1-Windows.tar.gz;解压后可以发现一个安装文件setup.exe安装包,即为AppDeploy的安装文件; 4).双击setup.exe,双击setup.exe(确定预先安装python2.7),出现如下AppDeploy的安装视图,安装目录应该选择Python2.7的安装目录下的Lib\site-packets子目录; 5).根据向导直到安装完成; 6).设置环境变量: 环境变量一般为自动设置,不过这里您可以确认一下,以保证正常运行; 右键“计算机” – 选择属性– 选择“高级系统设置”– 选择高级– 选择“环境变量”:添加环境变量,名字(APPDEPLOY)值(C:\Python27\Lib\site-packages);在path系统变量中添加“C:\Python27;%APPDEPLOY%; C:\Python27;”,分别为Python2.7的安装目录和AppDeploy的安装目录; 7).验证:打开cmd命令行工具, 输入:python,如果能运行,则说明python已经可用; 输入:adep,如果显示下面日志,则说明安装成功;
4).进入命令行执行$ adep,出现如下视图说明安装成功:
3.基本使用方法 AppDeploy的使用格式是在命令行执行adep + 参数 的命令格式运行,其执行的任务依据是根据其当前工作目录下的appdeploy.py(默认)这个python文件作为执行描述文件,若用户有自定义的描述文件,可用”-f”参数指定。使用方式细分有两种: 1)通过命令行,直接执行命令 格式:$ adep[options] -- [shell command]
Option:为命令选项定义执行参数; “--”:双横线,为分割符将前面的参数和后面的shell命令分开; [shell command]:shell命令,会被在远端服务器执行; |
常用的option选项: 例如:查看服务器nginx运行情况 $ adep -H '101.200.184.144' -u root -p xxxx -- ps-aux | grep nginx PS:上面方式使用方便,可以灵活、快速的执行您想执行的命令,但实现的功能相对简单,大部分情况下,您可以使用下面的方式实现您的具体任务; 2)通过编辑appdeploy.py文件,以任务方式执行 在appdeploy.py文件中定义函数(任务的实现细节),并在命令行的当前目录下执行$ adeptask1 task2(文件中定义的函数名)的方式依次执行定义的任务; appdeploy.py的编写规则:
4.获取设置Access Key 因为AppDeploy工具基于阿里云产品设计实现,其某些功能会基于阿里云OpenApi实现,所以需要设置Access Key的值以获取调用OpenApi的资格。 获取Access Key的方法请参考: 得到的Access KeyID和Access Key Secret通过以下方式配置到AppDeploy中:
5.环境变量
env.hosts = ['host1', 'host2']: 表示两个远端服务器,分别是host1和host2. env.hosts = ['host1', 'user2@host2', 'host3'] : 表示一共三个远端服务器host1 、host2 、host3 ,其中host2 使用user2 用户名登录,host1 和host3 的用户名使用env.user 定义的值; |
env.hosts = ['host1', 'host2'] def task1(): run(ls) |
@parallel def task1(): pass def task2(): pass $ adep -H host1,host2,host3 task1task2 |
env.roledefs = { 'apphosts': [‘host1', 'host2', 'host3'], 'webhosts': ['host3', 'host4'] } @roles('apphosts') @hosts('host3', 'host5') def task1(): run('ls/var/www') |
6.执行命令 环境变量定义任务执行的相关环境参数:如用户名、密码等,而任务的具体执行是很多具体指令组成的,下面是AppDeploy自定义的执行命令集;
get('/path/to/remote_file.txt', 'local_dir') | 新建local_dir 并保存文件; |
get('/var/log/apache2/access.log', '%(path)s') | 下载access.log 的文件,保存在相同目录; |
get('/var/log', '%(path)s') | 递归下载/var/log 下面所有文件; |
get('/var/log', ‘%(host)s/%(path)s’) | 多个host 时,保存在不同目录; |
put('/path/test.txt', '/root/') 将本地文件test.txt上传到指定的服务器/root下; put('/path/test', '/root/') 将本地文件夹下面所有文件上传到指定服务器/root 下; put('/path/test.txt', '/root/') 将本地文件test.txt 上传到指定的服务器/root 下,并设置权限; |
env = prompt('Please specify target environment: ')可以在运行时输入内容,并保存在env中; prompt('Specify dish: ', 'dish', default='spam & eggs') 设置默认输入内容,不输入是用默认值; prompt('Please specify level: ', key='nice', validate=int) 设定输入的内容只能是整数; |
7.修饰符
env.hosts = [‘host1’, ‘host2’] @parallel def task1(): pass |
@task def task1(): run("ls") def task2(): run("pwd") $ adep –list |
以上内容从AK设置、环境变量、自定义命令、修饰符等方面描述了AppDeploy的使用方法,下面以一个具体例子将上面内容展现出来。
# -*- coding: utf-8 -*- from src.api import * env.ak_id="xxx" env.ak_sec="xxx" env.user = 'root' env.password='xxx' env.hosts = ['101.200.184.144','root@123.57.53.193:22'] env.roledefs = { 'apphosts': ['101.200.184.144'], 'webhosts': ['root@123.57.53.193:22'] } @task def file_copy(): put('./test', '/root/') get('/root/test', './test') @task @roles('webhosts') def remote_exec(cmd): local('echo "run your cmd on remote hosts"') run(cmd) def useless(): run('pwd') | # Access Key ID # Access Key Secret # 统一用户名 # 统一密码 # 定义hosts变量 # 定义不同用户组 # 表明这个函数可以被执行 # 上传文件夹 # 下载文件夹 # 指定服务器集群 # 本地执行命令 # 远程执行命令 # 没有@task,不能被执行 |
8.上传下载文件(夹) AppDeploy对文件的上传、下载提供两种实现方式: 一种方式:是在appdeploy.py中定义文件上传下载的任务,然后再命令行执行$ adep task以实现文件的上传下载功能。这种方式可以实现复杂逻辑的上传下载功能,例如:上传不同目录下、不同服务器的文件,但使用稍微繁琐,简单的上传下载功能参考方式二。 另一种方式:直接使用adep 的命令行,格式如下: $ adep put:local_file,remote_dir $ adep get:remote_file,local_dir 注意上述命令中没有空格,若目录中空格,可以用引号扩起来。下面是一些例子供参考: 1)将本地文件a.txt上传到服务器/root/目录下; 2)本地”D:\ProgramFiles\”目录下的b.txt上传到服务器/root/目录下; 3)将服务器/root/b.txt文件下载到本地; 4)将本地的./test/目录(及包含文件)上传到服务器/root/下面; 5)下面服务器/root/test目录到本地的./test1/目录下; 9.远程执行命令 AppDeploy工具内置了run指令做远程执行命令,在编辑appdeploy.py中的任务时使用run命令可以轻松实现远程执行,而在命令行想执行一个远程命令如何实现呢? AppDeploy提供了两种实现方式: 一种方式:在命令行执行$ adep [options] -- [shell command], option为命令的参数。 例如:查看服务器/root/test/文件夹里的文件列表; 另一种方式:在命令行中使用 $ adep run:”shell command”,需要注意的是run和后面的shell 命令之间用“:”连接,且无空格,如果shell命令有空格,请用引号将其引起来。 10.一键更新源站 买好了ECS机器,安装完了系统,大部分用户都需要更新系统源这个任务。AppDeploy为大家搜集了阿里云服务器上最常用、高效的源站链接,并提供一键更新的功能。此功能已经支持Ubuntu、Centos、Fedora、Opensuse、Debain等Unix系统。 更新源站命令: $ adep update_source 11.并发执行
此类命令是基于用户工作习惯的总结,如果您有想新添加的功能或快捷方式,请与我们联系,我们会考虑将您需要的功能添加到工具的下个版本。 AppDeploy设计之初的重点研究对象就是应用部署,然而工具在开发初期更多的侧重于底层信息流的互通和通用功能的实现。当前AppDeploy工具对应用部署的支持还不是很全面,这正是我们近期需要加强的地方。 应用的部署相关工作可分为:服务器端的运行环境安装、应用的编译打包、应用的上传部署; 12.服务器端的运行环境安装 当前[font=&]AppDeploy更多侧重w[font=&]eb服务器安装,[font=&]AppDeploy支持常用W[font=&]eb环境的一键安装功能,支持的环境和版本见下表: 然而上述有些环境在不同操作系统上依赖库、安装细节等都不相同,所以当前无法保证以上工具能在所有操作系统环境安装无误,若出现安装失败,请查看错误日志或联系我们的邮箱。 安装步骤如下: 1)编辑appdeploy.py文件,输入希望运行的web环境组件。 2)定义一个任务,任务中调用appdeploy的内置函数:install_runtime(para),参数para为想要安装的web组件细节,使用json格式输入。 3)在命令行执行执行:$adep runtime即可。 例子1:服务器上安装Jdk-1.7.0和Tomcat-7.0.63的运行环境 1)在appdeploy.py中定义任务runtime,并调用install_runtime(compontens)函数,参数为要安装的jdk、tomcat版本号,用json格式输入。
def runtime(): componets={"jdk" :"1.7.0", "tomcat" :"7.0.63" } install_runtime(componets) |
2)在命令行执行:$ adep runtime执行安装过程, 3)IE中输入访问地址,验证安装结果,下图表明tomcat已经安装成功。 [attachment=81519] 例子2:服务器上安装apache和Tomcat-7.0.63的运行环境 1)在appdeploy.py中定义任务runtime,并调用install_runtime(compontens)函数,参数为要安装的Apache、PHP版本号,用json格式输入。
def runtime(): componets={" apache" : " 2.2.31", "php" : "5.0", } install_runtime(componets) |
2)在命令行执行:$ adep runtime执行安装过程, [attachment=81520] 3)IE中输入访问地址,验证安装结果,下图表明PHP已经安装成功(hello.php是环境安装后放到php指定目录下的文件); [attachment=81521] 13.应用打包部署 例子1:将本地Java应用部署到服务器。 结合上面环境安装的例子(1),将本地一个java应用部署到服务器。 1)在appdeploy.py中添加如下任务,任务中定义:打包工具、本地项目目录、服务器端的web应用目录,并调用打包、部署命令package和deploy接口。
def pack_deploy(): componets={"package_tool": "maven", "project_dir" : "/home/xxx/src/example/maven/myFirstWebApp", "web_dir" :"/alidata/server/tomcat/webapps" } package(componets) deploy(componets) |
2)在命令行输入命令:$ adep pack_deploy执行打包部署任务,如下: [attachment=81522] 3)在IE上输入应用地址,检查部署效果。下图表示应用部署成功: [attachment=81523] 应用部署是AppDeploy以后重点研究方向,我们深知当前做的还很有限,也正是借此机会和广大开发者交流,希望您能把工具的不足之处和您自己的需求发送给我们,一起把应用部署方案做到更新、更方便使用。
普通版: Python版:
阿里云运维部署工具AppDeploy详细教程|云虚拟主机 - 开发者论坛