Murano Package是Murano部署应用的基础,Package本身不包含任何的安装包,只是描述了应用的一些基本属性等信息
标准的Murano Package长相如下:
drwxr-xr-x 2 root root 34 Jul 26 14:55 Classes
-rw-r--r-- 1 root root 33332 May 8 2015 logo.png
-rw-r--r-- 1 root root 1273 Apr 18 2017 manifest.yaml
drwxr-xr-x 3 root root 48 Apr 12 2017 Resources
drwxr-xr-x 2 root root 20 Jul 26 14:57 UI
[root@localhost Apache]# tree
.
├── Classes
│ └── ApacheHttpServer.yaml
├── logo.png
├── manifest.yaml
├── Resources
│ ├── DeployApache.template
│ └── scripts
│ └── runApacheDeploy.sh
└── UI
└── ui.yaml
https://docs.openstack.org/developer/murano/appdev-guide/developer_index.html
一、manifest.yaml
@1. Package的Type主要分为2类,Application和Library
这个比较好理解,
Library是以一个库,不能用来部署,主要包含了一些公共方法和属性,用于被Application继承和使用,Murano平台提供了很多已有的library可以直接使用
Application才是可以被Murano直接deploy的包
@2. FullName、Name、Description等都是描述Package的基本属性;
@3. Require表示Package之间的依赖,后续描述;
如下是Http Apache Package的manifest.yaml
二、$class.yaml
manifest.yaml中的Classes定义了对应的yaml文件,这个文件主要存放在Classes目录下
@1. namespaces
名称空间的声明,指定了可以在类体中使用的前缀,以使长类名称更短
举例说明不废话:
namespace中定义 –> std: io.murano
则在后面中的引用 –> std:Application 相当于是io.murano.Application
特殊说明: “=”相当于是current namespace, 所以MyClass相当于是com.awcloud.package.MyClass
@2. Name
@3. Extends
继承的Class, 目前基本上都是继承的io.murano.Application
@4. Properties
声明的参数,主要包含如下几部分
名称: – 参数名称
Contract: 声明类型,常见的包括如下,详细参考:http://muranotest.readthedocs.io/en/latest/articles/murano_pl.html#contract
类型 说明
$.int() 整形
$.string() 字符串
$.string().notNull() 非空字符串
$.bool() 布尔类型(true/false) 0会被转为false,其他转为true
$.class(ns:ClassName) 类
$.class(ns:ClassName).notNull() 非空类
Usage:声明作用域,包括如下
属性类型 说明
In 输入参数,该参数只能通过UI设置,不能在MuranoPL代码里面修改。这是类属性的默认类型。
Out 输出参数,该参数只能在MuranoPL代码里面修改,不能通过UI设置。
InOut 既能由UI设置,又能在MuranoPL代码修改的参数。
Const 和In类似,不同的是只能被用户设置一次。
Runtime 和Out类似,不同的是不会被序列化。
Default:默认值
@5. Method
声明的方法及实现, 默认必须包含的方法:
initialize: 初始化方法,主要是获取依赖的环境信息
deploy: 应用部署的主方法
Murano PL是一种用Python解释的类yaml的语言,它有如下的约束:
1. 赋值用冒号,且冒号后要跟空格
2. 等号表示判断
3. 逗号不能在字符串内使用
4. 变量要用$作为前缀
5. 单个$ 就是Java里面的this,而$xxx 表示变量xxx,$.xxx 表示类变量xxx
基本的用法:
1) if语句
-If:not$.getAttr(deployed, false)
Then:
-$.setAttr(deployed, true)
Else:
-$._environment.reporter.report($,"application has deployed")
每个环境只能部署一次,本段代码用于判断是否已经部署,防止重复部署
4) 并发执行(可指定并发数)
- Parallel:
- $.masterNode.deployInstance()
- $.minionNodes.take($.nodeCount).pselect($.deployInstance())
- $.gatewayNodes.take($.gatewayCount).pselect($.deployInstance())
5.)调用脚本
-$resources: new(sys:Resources)
-$template:$resources.yaml('DeployOrionChef.template').bind(dict( port => $.port))
-$result:$.instance.agent.call($template, $resources)
部署APP基本的步骤:
1. 新增安全组暴露应用的端口信息
2. 创建虚拟机
3. 在虚拟机中执行安装APP的脚本