+86 13541016684Mon. - Fri. 10:00-22:00

AWS appspec.yml文件解析

AWS appspec.yml文件解析

AWS appspec.yml文件解析

appspec.yml是YAML格式、用于定于CodeDeploy服务在整个阶段所做的操作和文件拷贝路径和权限等。首先,这个文档名称必须是appspec.yml,而且文档中的空格个数也有严格的要求,文章最后面会讲到。
appspec.yml文档结构:

version: 0.0
os: operating-system-name
files:
  source-destination-files-mappings
permissions:
  permissions-specifications
hooks:
  deployment-lifecycle-event-mappings

version这里,类似于aws api的版本号,目前只能写0.0
os这里可接受的选项是linux和windows,全小写
files段,定于文件映射关系,例如下面这段

files:
   - source: Config/config.txt
     destination: /webapps/Config
   - source: source
     destination: /webapps/myApp

source文件路径是是相对于本版包的相对路径,如果是/,表示本版包里的全部文件和目录
destination这里是被部署服务器的完整路径(绝对路径)

permission段:用于定义和描述被拷贝到目标服务器上的文件拷贝后的权限
例如下面这个例子

permissions:
   - object: /home/webapp/tomcat/webapps/cms-front
     pattern: "**"
     except: /home/webapp/tomcat/webapps/cms-front/version.ini
     owner: webapp
     group: webapp
     mode: 644
     acls: 
       - u:read-only:r
       - u:wangfei:rw
     context:
       user: unconfined_u
       type: httpd_sys_content_t
       range: s0
     type:
       - file

object是必选项,也就是你的版本包部署路径
pattern是可选项,用于匹配想要赋权的文件,"**"和不填,表示匹配所有文件(可选项)
except就是排除在pattern中被匹配的文件(可选项)
owner和group好理解,改变文件属主(可选项)
mode这里可接受类似644和755这样的权限,或者4755这样的带粘滞位的赋权(可选项)
acls中设置Access Control List,这里我们可以给read-only用户只读权限(可选项)
context是给SELinux用的,不熟悉(可选项)
type可选项是file和directory,用于表述被赋权对象类型,只是文件,还是只是目录,不填表示版本包里的所有文件和目录

hooks区段就是定义各个阶段执行的操作
先介绍下CodeDeploy整个部署过程
1. Start,不可自定义操作
2. ApplicationStop,可定义停服过程
3. DownloadBundle,下载版本包,不可自定义该阶段操作,linux系统下,版本包会被下载到/opt/codedeploy-agent/deployment-root/deployment-group-id/deployment-id/deployment-archive,windows系统会被下载到C:\ProgramData\Amazon\CodeDeploy\deployment-group-id\deployment-id\deployment-archive
4. BeforeInstall,定义版本包文件复制到目标目录之前的操纵,这里可定义备份操作
5. Install,该过程不可被hook,只能通过appspec.yml中的路径和权限等来定义,例如file区段,定义文件拷贝路径
6. AfterInstall,文件复制完之后的操作,可以吧permisson中的定义在此处用脚本来实现
7. ApplicationStart,可被hook来进行起服前的自定义行为
8. ValidateService,部署被验证完成之后可被hook,可用于定义完成之后清理现场。
9. End,结束,不可被hook

hooks:
   deployment-lifecycle-event-name
     - location: script-location
       timeout: timeout-in-seconds
       runas: user-name

hook里面的deployment-lifecycle-event-name,可选项为:
ApplicationStop,BeforeInstall,AfterInstall,ApplicationStart,ValidateService
location写该阶段需要执行的脚本文成和路径,相对版本包的相对路径,例如scripts/full_backup.sh,location可以写多个,每行一个。
timeout时间为超时的秒数,超过指定时间脚本还没完成就算部署失败,默认是1800秒。注意hook阶段的总超时时间是1小时,也就是说在该阶段所有脚本的执行时间必须在1小时内完成,否则会被认为是失败了。
runas,可选项,定义脚本执行的身份

关于文件中的空格必须是指定的个数,例如下面例子中,[4]表示4个空格,不能多也不能少

version:[1]version-number
os:[1]operating-system-name
files:
[2]-[1]source:[1]source-files-location
[4]destination:[1]destination-files-location
permissions:
[2]-[1]object:[1]object-specification
[4]pattern:[1]pattern-specification
[4]except:[1]exception-specification
[4]owner:[1]owner-account-name
[4]group:[1]group-name
[4]mode:[1]mode-specification
[4]acls: 
[6]-[1]acls-specification 
[4]context:
[6]user:[1]user-specification
[6]type:[1]type-specification
[6]range:[1]range-specification
[4]type:
[6]-[1]object-type
hooks:
[2]deployment-lifecycle-event-name:
[4]-[1]location:[1]script-location
[6]timeout:[1]timeout-in-seconds
[6]runas:[1]user-name

解析出来就是这样

version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/html/WordPress
hooks:
  BeforeInstall:
    - location: scripts/install_dependencies.sh
      timeout: 300
      runas: root
  AfterInstall:
    - location: scripts/change_permissions.sh
      timeout: 300
      runas: root
  ApplicationStart:
    - location: scripts/start_server.sh
      timeout: 300
      runas: root
  ApplicationStop:
    - location: scripts/stop_server.sh
      timeout: 300
      runas: root