开发者社区> 问答> 正文

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

本帖在ECS板块分开发过几个帖子,现在整合在一个帖子里,希望对大家有所帮助。


欢迎大家使用阿里云运维部署工具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 环境,当前支持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 命令,若果能找到命令说明安装完成(下图表示安装成功);
    [attachment=81615]
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 子目录;
    [attachment=81616]
5). 根据向导直到安装完成;
6). 设置环境变量:
  环境变量一般为自动设置,不过这里您可以确认一下,以保证正常运行;
  右键“计算机” – 选择属性– 选择“高级系统设置”– 选择高级– 选择 “环境变量”:添加环境变量,名字(APPDEPLOY )值(C:\Python27\Lib\site-packages );在path 系统变量中添加“C:\Python27;%APPDEPLOY%; C:\Python27; ”, 分别为Python2.7 的安装目录和AppDeploy 的安装目录;


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


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 ,出现如下视图说明安装成功:
  [attachment=81618]

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


1)通过命令行,直接执行命令
格式:$ adep[options] -- [shell command]
   Option:为命令选项定义执行参数;
  “--”:双横线,为分割符将前面的参数和后面的shell命令分开;
    [shell command]:shell命令,会被在远端服务器执行;

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


2) 通过编辑appdeploy.py 文件,以任务方式执行
在appdeploy.py 文件中定义函数(任务的实现细节),并在命令行的当前目录下执行 $ adeptask1 task2 (文件中定义的函数名)的方式依次执行定义的任务;
appdeploy.py 的编写规则:
    [attachment=81621]
下面分别介绍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 KeyID 和Access Key Secret 通过以下方式配置到AppDeploy 中:
在Appdeploy.py 描述文件中设置 env.ak_id(Access Key ID)env.ak_sec(AccessKey Secret) 变量;如下图所示:

     [attachment=81622]
5.环境变量
AppDeploy 工具通过自定义的环境变量来提高程序的可读性、以及描述文件的灵活性等;以下是常用的环境变量及其说明:
  [attachment=81623]
Hosts 变量详细说明:
用来定义需要连接的服务器地址集,在执行appdeploy.py 中任务时会在hosts 定义的每个服务器上运行一遍;定义格式:
env.hosts = ['host1', 'host2']: 表示两个远端服务器,分别是host1和host2.
env.hosts = ['host1', 'user2@host2', 'host3'] : 表示一共三个远端服务器host1 、host2 、host3 ,其中host2 使用user2 用户名登录,host1 和host3 的用户名使用env.user 定义的值;

例如:在appdeploy.py 中定义:
env.hosts = ['host1', 'host2']
def task1():
    run(ls)

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

User 详细说明:
定义远程服务器的登录名,如果没有定义,则默认为本地机器的当前用户名;
例如:
env.user = 'user1'

Password & Passwords 详细说明:
首先推荐使用SSH 提供的密钥管理机制来实现免密码输入模式,可查阅资料;这里着重介绍AppDeploy 提供的密码管理方案。

AppDeploy 提供了两层管理密码的机制:
如果您的servers 的密码都相同,可以通过在env.password 中设置统一密码;
如果每个server 的密码不同,可以在env.passwords 中设置host 与password 对应表(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 实现格式。
Roles 与Hosts 一样,都可以指定服务器地址集合,只是Roles 引用的服务器地址是经过Roledefs 定义的组名。
例如:
env.roledefs = {
   'apphosts': [‘host1', 'host2', 'host3'],
   'webhosts': ['host3', 'host4']
}
@roles('apphosts')
@hosts('host3', 'host5')
def task1():
    run('ls/var/www')

执行:$ adeptask1

会在host1 、host2 、host3 、host5 依次执行,host3 出现两次,被合并;


6.执行命令
环境变量定义任务执行的相关环境参数:如用户名、密码等,而任务的具体执行是很多具体指令组成的,下面是AppDeploy 自定义的执行命令集;
  [attachment=81624]
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 中的任务,常用的修饰符有:hosts 、parallel 、roles 、serial 、task 等,分别用例子描述他们的使用方法;
Hosts 修饰符:
hosts 即为环境变量的名字,也可以用作修饰符来定义任务目标服务器。


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

执行$ adeptask1 时,task1 会在host1 、host2 上同时执行;
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/ 目录下;
   [attachment=81625]
2) 本地”D:\ProgramFiles\” 目录下的b.txt 上传到服务器/root/ 目录下;
   [attachment=81626]
3) 将服务器/root/b.txt 文件下载到本地;
   [attachment=81627]
4) 将本地的./test/ 目录(及包含文件)上传到服务器/root/ 下面;
   [attachment=81628]
5) 下面服务器/root/test 目录到本地的./test1/ 目录下;
   [attachment=81629]
9.远程执行命令
AppDeploy 工具内置了run 指令做远程执行命令,在编辑appdeploy.py 中的任务时使用run 命令可以轻松实现远程执行,而在命令行想执行一个远程命令如何实现呢?
AppDeploy 提供了两种实现方式:


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


更新源站命令: $ adep update_source
       [attachment=81632]
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=&]AppDeploy 更多侧重w[font=&]eb 服务器安装,[font=&]AppDeploy 支持常用W[font=&]eb 环境的一键安装功能,支持的环境和版本见下表:
      [attachment=81633]
然而上述有些环境在不同操作系统上依赖库、安装细节等都不相同,所以当前无法保证以上工具能在所有操作系统环境安装无误,若出现安装失败,请查看错误日志或联系我们的邮箱。 安装步骤如下:
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 执行安装过程,
    [attachment=81634]

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

旺旺账号: 阿云开发者效率
邮箱: aliyun-developers-efficiency@list.alibaba-inc.com

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

普通版:
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

展开
收起
阚俊宝 2015-08-12 09:28:31 20575 0
1 条回答
写回答
取消 提交回答
  • 一个程序员,欢迎骚扰!!!
    很详细、不过太长了、感觉看起来真是费劲的。
    2015-08-14 19:52:03
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
企业运维之云原生和Kubernetes 实战 立即下载
可视化架构运维实践 立即下载
2021云上架构与运维峰会演讲合集 立即下载