开发者社区> 问答> 正文

【阿里云运维部署工具AppDeploy详细教程】之2:使用方法


您还可以阅读其他章节:
【阿里云运维部署工具AppDeploy详细教程】之介绍安装
【阿里云运维部署工具AppDeploy详细教程】之高效技巧
【阿里云运维部署工具AppDeploy详细教程】之应用部署


阿里云AppDeploy 实现为两个版本,两个版本的基本功能是一致的,不同之处是:普通版的描述语言为伪代码描述,没有太多严格的语法格式。Python 版使用Python 语言描述,遵循python 对齐语法等规则。本文以Python 版本为例进行说明。


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


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

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

常用的option 选项:
  [attachment=81500]
例如:查看服务器nginx 运行情况
$ adep -H '101.200.184.144' -u root -p xxxx -- ps-aux | grep nginx
[attachment=81501]

PS :上面方式使用方便,可以灵活、快速的执行您想执行的命令,但实现的功能相对简单,大部分情况下,您可以使用下面的方式实现您的具体任务;


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

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


2.获取设置 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=81503]

3.环境变量
AppDeploy 工具通过自定义的环境变量来提高程序的可读性、以及描述文件的灵活性等;以下是常用的环境变量及其说明:
[attachment=81504]
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 出现两次,被合并;


4.执行命令
环境变量定义任务执行的相关环境参数:如用户名、密码等,而任务的具体执行是很多具体指令组成的,下面是AppDeploy 自定义的执行命令集;
[attachment=81505]
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) 设定输入的内容只能是整数;



5.修饰符
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,不能被执行



阿里云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-11 13:26:39 29322 0
3 条回答
写回答
取消 提交回答
  • Re【阿里云运维部署工具AppDeploy详细教程】之2:使用方法
    使用appdeploy远程执行linux服务命令不生效:
      1.appdeploy安装环境win7
      2.dept 执行appdeploy.txt下命令上传文件到服务没有问题
      3.appdeploy.txt中增加启动tomcat 服务的任务后不能启动tomcat
         在服务其中直接执行service tomcat start命令启动tomcat是没有问题的,
         然后想在appdeploy中启动tomcat
       @start_tomcat
    run('service tomcat start')
    执行:dept start_tomcat后会在window 命令行中打印启动信息,并且已经启动
    但是在linux服务器上没有tomcat进程,试过执行别服务都是这样的结果,
    本人是新手,不知道什么原因

    2015-10-19 14:16:43
    赞同 展开评论 打赏
  • 阿里云容器服务开发,专注Kubernetes、Docker、云存储;
    回1楼ivmmff的帖子
    我是你的粉丝`(*∩_∩*)′
    2015-08-11 13:45:58
    赞同 展开评论 打赏
  • 解决方案工程师,负责为企业规划上云迁移方案和云上架构设计,在网站建设开发和云计算领域有多年经验,专注于Linux平台的系统维护以及应用部署。致力于以场景化的方式让云计算,用更加通俗易懂的方式让更多人体验云计算,让云端的计算更质朴的落地。
    你是我偶像
    2015-08-11 13:37:02
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
可视化架构运维实践 立即下载
2021云上架构与运维峰会演讲合集 立即下载
MySQL 技术大全:开发、优化与运维实战 立即下载