+135 410 16684Mon. - Fri. 10:00-22:00

阿里云运维部署工具AppDeploy详细教程

阿里云运维部署工具AppDeploy详细教程

阿里云运维部署工具AppDeploy详细教程

AppDeploy是一个通过SSH实现的命令行工具,可完成应用部署和远程运维管理。当前工具实现为两个版本:普通版(伪代码描述语言)和Python版。Python版使用Python语法规则,可实现您的各种应用需求;普通版语法简单、容易上手,是对Python版本的精简。两个版本当前都是免费使用。下载地址如下:
普通版:
http://market.aliyun.com/products/53690006/cmgj000331.html?spm=5176.900004.4.2.iTWBiC
Python版:
http://market.aliyun.com/products/53690006/cmgj000321.html?spm=5176.9000004.0.0.8AlNTY

1 介绍一下AppDeploy的主要功能
1).远程应用部署:
    可以将本地应用安装部署到远程云服务器,软件包可以在本地编译打包好,也可以选择在云服务器编译安装;

2).远程运维管理:
    您可以使用AppDeploy远程执行shell脚本,让操作命令感觉在本地执行一般,大大的提高开发者的工作效率;

3).一键环境安装:
    一键安装Web环境,当前支持JavaNginxApacheTomcatPHPMysql等多款环境,可以根据具体业务选择适合工具的适合版本进行安装;

4).一键应用部署:
    可以一键编译、打包、部署常见的应用,支持MavenAnt等打包部署的安装方案;

5).一键式更新源:
    执行AppDeploy定义命令(update_source)更新系统源,支持UbuntuCentosRedhatOpensuseDebian等系统的主流版本;

6).文件上传下载:
    您可以使用AppDeploy在本地主机和远程服务器间实现上传、下载文件(夹)的功能;不仅实现了ftp的功能,还可以远程执行管理命令;

7).并发控制机器:
    基于软件的部署场景,提供同时在多台服务器部署的功能,且可以选择顺序执行或者并发执行的运行模式;上面叙述的功能都可以使用并发模式在多服务器间同时运行。

8).账号密码管理:
    提供灵活、易用的账号管理功能,用户可以设置免密码输入运行,且可为不同主机设置不同密码;

2.AppDeploy的安装& 配置
AppDeploy支持在WindowsLinuxMac系统下使用,远端服务器当前只支持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命令,若果能找到命令说明安装完成(下图表示安装成功);
    219_1171330362041663_47721b2b754e3f4
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子目录;
    219_1171330362041663_2a42f696783a100
5).根据向导直到安装完成;
6).设置环境变量:
  环境变量一般为自动设置,不过这里您可以确认一下,以保证正常运行;
  右键“计算机”选择属性选择“高级系统设置”选择高级选择“环境变量”:添加环境变量,名字(APPDEPLOY)值(C:\Python27\Lib\site-packages);在path系统变量中添加“C:\Python27;%APPDEPLOY%; C:\Python27;”,分别为Python2.7的安装目录和AppDeploy的安装目录;

7).验证:打开cmd命令行工具,
  输入:python,如果能运行,则说明python已经可用;
  输入:adep,如果显示下面日志,则说明安装成功;
219_1171330362041663_13417ebd963a822

Mac系统安装:(请预先安装好python2.7
1).下载AppDeploy-python-1.0.1.tar.gz,解压可以得到AppDeploy- python-1.0.1-Mac.zip 的压缩包,解压AppDeploy- python-1.0.1-Mac.zip,得到pycrypto-2.6.1.tar.gz& AppDeploy- python-1.0.1.tar.gz
2).若您系统中尚未安装pycrypto-2.6.1.tar.gz,解压后进入pycrypto-2.6.1,执行$ sudopython setup.py install若已经安装,直接进入步骤3

 

3).解压AppDeploy-python-1.0.1.tar.gz,进入appdeploy-python-1.0.1后执行$ sudo pythonsetup.py install

4).进入命令行执行$ adep,出现如下视图说明安装成功:

  219_1171330362041663_a01accf85543b40

3.基本使用方法
AppDeploy的使用格式是在命令行执行adep + 参数 的命令格式运行,其执行的任务依据是根据其当前工作目录下的appdeploy.py(默认)这个python文件作为执行描述文件,若用户有自定义的描述文件,可用”-f”参数指定。使用方式细分有两种:

1)通过命令行,直接执行命令
格式:$ adep[options] — [shell command]

   Option:为命令选项定义执行参数;
  “”:双横线,为分割符将前面的参数和后面的shell命令分开;
    [shell command]shell命令,会被在远端服务器执行;

常用的option选项:
219_1171330362041663_19bfd3c7dde3712
例如:查看服务器nginx运行情况
$ adep -H ‘101.200.184.144’ -u root -p xxxx — ps-aux | grep nginx
    219_1171330362041663_31dc60efe538476
PS:上面方式使用方便,可以灵活、快速的执行您想执行的命令,但实现的功能相对简单,大部分情况下,您可以使用下面的方式实现您的具体任务;

2)通过编辑appdeploy.py文件,以任务方式执行
appdeploy.py文件中定义函数(任务的实现细节),并在命令行的当前目录下执行$ adeptask1 task2(文件中定义的函数名)的方式依次执行定义的任务;
appdeploy.py的编写规则:
    219_1171330362041663_7726e52d4c3b0d9

下面分别介绍AppDeploy自定义的环境变量、操作命令、修饰符、并发执行等细节。

4.获取设置Access Key
因为AppDeploy工具基于阿里云产品设计实现,其某些功能会基于阿里云OpenApi实现,所以需要设置Access Key的值以获取调用OpenApi的资格。


获取Access Key的方法请参考:http://bbs.aliyun.com/read/253666.html?spm=5176.7189909.0.0.l1LU3c&fpage=2
得到的Access KeyIDAccess Key Secret通过以下方式配置到AppDeploy中:

Appdeploy.py描述文件中设置env.ak_id(Access Key ID)env.ak_sec(AccessKey Secret)变量;如下图所示:

     219_1171330362041663_9d55655a8381c32
5.环境变量

AppDeploy工具通过自定义的环境变量来提高程序的可读性、以及描述文件的灵活性等;以下是常用的环境变量及其说明:
  219_1171330362041663_b12c240a84647ca
Hosts变量详细说明:
用来定义需要连接的服务器地址集,在执行appdeploy.py中任务时会在hosts定义的每个服务器上运行一遍;定义格式:
env.hosts = [‘host1′, ‘host2′]: 表示两个远端服务器,分别是host1host2.

env.hosts = [‘host1′, ‘user2@host2′, ‘host3′]: 表示一共三个远端服务器host1host2host3,其中host2使用user2用户名登录,host1host3的用户名使用env.user定义的值;

例如:在appdeploy.py中定义:
env.hosts = [‘host1′, ‘host2′]

def task1():
    run(ls)

 

则执行:$ adeptask1时,会在host1host2上分别执行ls命令;

 

User详细说明:
定义远程服务器的登录名,如果没有定义,则默认为本地机器的当前用户名;
例如:
env.user = ‘user1′
Password & Passwords详细说明:
首先推荐使用SSH提供的密钥管理机制来实现免密码输入模式,可查阅资料;这里着重介绍AppDeploy提供的密码管理方案。
AppDeploy提供了两层管理密码的机制:
如果您的servers的密码都相同,可以通过在env.password中设置统一密码;
如果每个server的密码不同,可以在env.passwords中设置hostpassword对应表(Json格式),对每个server设置单独的密码;host的格式:user@host:port
例如:

 

env.password=’xxxxx’ 统一密码;
env.passwords={‘root@101.200.184.144:22′:’xxx’, ‘root@123.57.228.240:22′:’yyy’}

 

parallel详细说明:
Parallel设置时表明指定的任务在不同的服务器之间并发执行;格式为在任务前面:@parallel(pool_size=5),其中pool_size指最多同时并发的个数,若不指定pool_size,则默认不加限制;
定义了parallel只是一个任务在多个服务器之间并行,但不同的任务之间还是顺序执行;
例如:
@parallel

def task1():
    pass
def task2():
    pass
$ adep -H host1,host2,host3 task1task2

 

结果:
Task1 on host1, host2, andhost3
Task2 on host1
Task2 on host2
Task2 on host3
Roledefs & Roles详细说明:
AppDeploy可以为服务器地址定义组,用户可以基于不同组完成不同集群的部署,这样用户可以根据自己的业务定义不同的组群。格式为JSON实现格式。
RolesHosts一样,都可以指定服务器地址集合,只是Roles引用的服务器地址是经过Roledefs定义的组名。
例如:
env.roledefs = {

   ‘apphosts': [‘host1′, ‘host2′, ‘host3′],
   ‘webhosts': [‘host3′, ‘host4′]
}
@roles(‘apphosts’)
@hosts(‘host3′, ‘host5′)
def task1():
    run(‘ls/var/www’)

 

执行:$ adeptask1

 

会在host1host2host3host5依次执行,host3出现两次,被合并;

6.执行命令
环境变量定义任务执行的相关环境参数:如用户名、密码等,而任务的具体执行是很多具体指令组成的,下面是AppDeploy自定义的执行命令集;
  219_1171330362041663_5c2ec18556495e3

Get命令详细说明:
Get命令的功能是下载远端服务器上的文件或文件夹,根据不同常见可以如下格式:
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命令详细说明:
Put命令功能是将本地的文件、文件夹上传到远端服务器(一台或多台);
put(‘/path/test.txt’, ‘/root/’) 将本地文件test.txt上传到指定的服务器/root下;

put(‘/path/test’, ‘/root/’) 将本地文件夹下面所有文件上传到指定服务器/root下;
put(‘/path/test.txt’, ‘/root/’) 将本地文件test.txt上传到指定的服务器/root下,并设置权限;

 

Prompt命令详细说明:
Prompt命令为用户提供一种交互式的选择功能,可以在程序运行时跳出选项供选择:
env = prompt(‘Please specify target environment: ‘)可以在运行时输入内容,并保存在env中;

prompt(‘Specify dish: ‘, ‘dish’, default=’spam & eggs’)设置默认输入内容,不输入是用默认值;
prompt(‘Please specify level: ‘, key=’nice’, validate=int)设定输入的内容只能是整数;

 

7.修饰符

AppDeploy通过定义修饰符来灵活的执行appdeploy.py中的任务,常用的修饰符有:hostsparallelrolesserialtask等,分别用例子描述他们的使用方法;
Hosts修饰符:
hosts即为环境变量的名字,也可以用作修饰符来定义任务目标服务器。

 

@hosts(‘user1@host1′, ‘host2′,’user3@host3′)
def task1():
    pass
上例表明task1会在host1host2host3三个服务器上执行,其中在host1host3上分别用user1user3登录,host2上用env.user定义的用户名登录。
Parallel修饰符
@parallel修饰符表明修饰的任务会在多个服务器之间并发执行;
env.hosts = [‘host1’, ‘host2’]

@parallel
def task1():
    pass

 

执行$ adeptask1时,task1会在host1host2上同时执行;
Task修饰符:
@task含义是:如果一个appdeploy.py中使用了@task,则所有函数都不再默认为任务(不对adep命令可用),除非其前面标示了@task标示。如果appdeploy.py中没有任务前面使     用@task标示,则所有函数都会默认为任务,可以被用户调用;
例如:
@task

def task1():
   run(“ls”)
def task2():
    run(“pwd”)
$ adep –list

 

结果是:task2被看作appdeploy.py的内部函数,不被暴漏给用户使用。
Available commands:
    task1
serial修饰符:

 

@serial的含义和@parallel相反,作用是:如果全局设置了并发执行,但某个任务前面使用了@serial参数,则这个任务依然用顺序执行模式。

以上内容从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/目录下;
   219_1171330362041663_e8b52d80b53d9e7
2)本地”D:\ProgramFiles\”目录下的b.txt上传到服务器/root/目录下;
   219_1171330362041663_35b7b997284aa92
3)将服务器/root/b.txt文件下载到本地;
   219_1171330362041663_ebf6b61fe1e5b5d
4)将本地的./test/目录(及包含文件)上传到服务器/root/下面;
   219_1171330362041663_b91449782b68db6
5)下面服务器/root/test目录到本地的./test1/目录下;
   219_1171330362041663_96ca80096752ddf
9.远程执行命令
AppDeploy工具内置了run指令做远程执行命令,在编辑appdeploy.py中的任务时使用run命令可以轻松实现远程执行,而在命令行想执行一个远程命令如何实现
AppDeploy提供了两种实现方式:

一种方式:在命令行执行$ adep [options] — [shell command] option为命令的参数。
例如:查看服务器/root/test/文件夹里的文件列表;
    219_1171330362041663_348604fedf323a2
另一种方式:在命令行中使用 $ adep run:”shell command”,需要注意的是run和后面的shell 命令之间用“:”连接,且无空格,如果shell命令有空格,请用引号将其引起来。
    219_1171330362041663_4dfcfbf5532e5c7
10.一键更新源站
买好了ECS机器,安装完了系统,大部分用户都需要更新系统源这个任务。AppDeploy为大家搜集了阿里云服务器上最常用、高效的源站链接,并提供一键更新的功能。此功能已经支持UbuntuCentosFedoraOpensuseDebainUnix系统。

更新源站命令: $ adep update_source
219_1171330362041663_8e73809adefbe20
11.并发执行

Appdeploy默认是串行执行所有命令的。但在设定参数的情况下可以实现并发执行任务。
AppDeploy有两种方式并发执行任务:
1)在命令行执行任务时添加-P 选项,则执行的所有任务都会在不同的服务器之间并发执行,但不同任务之间依然按照顺序执行进行;
例如:

 

$ adep -P -H host1,host2update reload
执行结果
update on host1 and host2
reload on host1 and host2
2)通过在appdeploy.py文件中的任务前面添加@parallel来表明某个任务会被并行执行;
例如:

 

def task1():
    pass
@parallel
def task2():
    pass
$adep -H host1,host2,host3 task1 task2
结果:
Task1 on host1
Task1 on host2
Task1 on host3
Task2 on host1,host2, and host3
$adep -P -H host1,host2,host3 task1 task2
结果:(-P参数会覆盖appdeploy中的定义)
Task1 on host1,host2, and host3
Task2 on host1,host2, and host3

此类命令是基于用户工作习惯的总结,如果您有想新添加的功能或快捷方式,请与我们联系,我们会考虑将您需要的功能添加到工具的下个版本。

AppDeploy设计之初的重点研究对象就是应用部署,然而工具在开发初期更多的侧重于底层信息流的互通和通用功能的实现。当前AppDeploy工具对应用部署的支持还不是很全面,这正是我们近期需要加强的地方。

应用的部署相关工作可分为:服务器端的运行环境安装、应用的编译打包、应用的上传部署;

12.服务器端的运行环境安装
当前[font=&amp]AppDeploy更多侧重w[font=&amp]eb服务器安装,[font=&amp]AppDeploy支持常用W[font=&amp]eb环境的一键安装功能,支持的环境和版本见下表:
219_1171330362041663_1f7e191c7503463
然而上述有些环境在不同操作系统上依赖库、安装细节等都不相同,所以当前无法保证以上工具能在所有操作系统环境安装无误,若出现安装失败,请查看错误日志或联系我们的邮箱 安装步骤如下:
1)编辑appdeploy.py文件,输入希望运行的web环境组件。
2)定义一个任务,任务中调用appdeploy的内置函数:install_runtime(para),参数para为想要安装的web组件细节,使用json格式输入。
3)在命令行执行执行:$adep runtime即可。

例子1服务器上安装Jdk-1.7.0Tomcat-7.0.63的运行环境
1)appdeploy.py中定义任务runtime,并调用install_runtime(compontens)函数,参数为要安装的jdktomcat版本号,用json格式输入。

def runtime():   componets={“jdk”    :”1.7.0″,
           “tomcat”  :”7.0.63″  }
    install_runtime(componets)

2)在命令行执行:$ adep runtime执行安装过程,
    219_1171330362041663_3b2ff6a43d36bd1

3)IE中输入访问地址,验证安装结果,下图表明tomcat已经安装成功
    [attachment=81519]
例子2服务器上安装apacheTomcat-7.0.63的运行环境
1)appdeploy.py中定义任务runtime,并调用install_runtime(compontens)函数,参数为要安装的ApachePHP版本号,用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应用目录,并调用打包、部署命令packagedeploy接口。

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以后重点研究方向,我们深知当前做的还很有限,也正是借此机会和广大开发者交流,希望您能把工具的不足之处和您自己的需求发送给我们,一起把应用部署方案做到更新、更方便使用。
 

欢迎下载使用阿里云AppDeploy,期待您的反馈和建议!!