记录一些关于Cloudify的一些理解和操作,便于后续查找和对接。
Cloudify社区提供了Docker容器镜像,名称为cloudifyplatform/premium
,或cloudifyplatform/premium-cloudify-manager-aio
,是封装好的装有Cloudify Manager的Docker镜像,包含Cloudify社区的各个版本,可以通过Tag指定下载的版本。查看Tag有两种方式:
1)登陆https://hub.docker.com/ 搜索镜像名称,点击Tag进行查看;
2)在Docker宿主机上编写如下脚本,通过执行脚本名.sh + 镜像名称
可以直接查询;
#!/bin/sh
repo_url=https://registry.hub.docker.com/v1/repositories
image_name=$1
curl -s ${repo_url}/${image_name}/tags | json_reformat | grep name | awk '{print $2}' | sed -e 's/"//g'
镜像下载到本地后,执行以下命令进行部署,将实例的80端口映射到本机,以提供外部访问功能
docker run -itd \
--restart unless-stopped \
--name meao \
--privileged=true \
-e "container=docker" \
-p 9090:80 \
cloudifyplatform/premium-cloudify-manager-aio \
usr/sbin/init
执行完成后即可在宿主机暴露的端口访问Cloudify Manager,默认账户名为admin
,密码为admin
注意:cloudidfy 4.6版本之后,使用Premium版本需要License,可以在创建好容器之后,在数据库的licenses
表中自行插入,插入完成后即可登录Cloudify Manager
#登录数据库
su - postgres
psql -h localhost -d cloudify_db -U cloudify
#密码:cloudify
INSERT INTO licenses (customer_id, expiration_date, license_edition, trial, cloudify_version, signature) VALUES ('test', '2219-08-20',1,false,5.0,'test');
问题记录:
1、Cloudify manager容器启动命令有待优化,当前启动方式没有挂载卷,容器重启之后会导致/etc和/opt目录下的文件丢失;
2、5.0.5版本的官网文档给出了高可用部署方案,但是当前容器镜像仍未发布;
Cloudify Manager主要有privarte ip
、public ip
、admin password
三个参数在部署时可能需要修改,由于是在容器中部署,privarte ip
和public ip
暂时不影响,但是默认密码过于简单,一定是要修改的。
默认密码的修改分为两部分,一部分是Cloudify REST接口及页面中的密码修改(数据库中密码发生变化),一部分是Cloudify CLI的密码更改(配置文件中密码发生变化):
1)首先通过cfy users
命令将admin
账户的密码进行更新
cfy users set-password admin -p 新密码
2)此时已经可以通过新密码访问Cloudify Manager的管理页面了,但是cfy的命令行操作都会显示unauthorized
,因为命令行的配置还没有更新,通过cfy profiles对命令行配置进行更新
cfy profiles set -p 新密码
此时默认密码都已更新为新密码,通过访问Cloudify Manager页面和执行cfy status
进行验证
此处先介绍REST后台和CLI相关的开发
第一步:修改Nginx路由
Cloudify restservice路由位置在/etc/nginx/conf.d/rest-location.cloudify
,在第一行加入新增的路由地址,如mepm,重启Nginx;
第二步:增加rest mapping
rest路由映射的位置在
/opt/manager/env/lib/python2.7/site-packages/manager_rest/rest/endpoint_mapper.py
,
在resouce_endpoint中加入路由映射,如'MEPM':'mepm'
第三步:创建对应的数据库表项
在增加数据库表项时,_tenant_id
、_storage_id
、_creator_id
、private_resouce
(新版本中改为visibility
),表项中的_storage_id
为主键,从1开始自增长,_tenant_id
关联租户,_creator_id关联用户
,示例如下:
登陆数据库
su - postgres
psql -h localhost -U cloudify -d cloudify_db -W
#默认密码是cloudify
创建数据表
CREATE TABLE mepm(
name text NOT NULL,
id text,
type text,
status text,
vendor text,
_tenant_id integer,
_creator_id integer,
private_reource boolean,
_storage_id integer NOT NULL,
created_at timestamp without time zone,
active boolean,
app_count integer DEFAULT 0
);
设置_storage_id
CREATE SEQUENCE mepm__storage_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE mepm__storage_id_seq OWNED BY mepm._storage_id;
ALTER TABLE ONLY mepm ALTER COLUMN _storage_id SET DEFAULT nextval('mepm__storage_id_seq'::regclass);
第四步:增加实现接口的类
1、定义接口增删改查
路径为 /opt/manager/env/lib/python2.7/site-packages/manager_rest/rest/resources_v1/
(resource有v1/v2/v2_1/v3/v3_1四个目录),新增mepm.py
2、引入接口类
在rest/resouces_v1/__init__.py
中引入接口实现类
from .mepm import (
MEPM,
MEPMId,
MEPMIdCommand,
)
3、定义数据结构
在storage/resource_models.py
中定义数据结构
class MEPM(SQLResourceBase):
__tablename__ = 'vnfms'
name = db.Column(db.Text)
type = db.Column(db.Text)
status = db.Column(db.Text)
active = db.Column(db.Boolean)
vendor = db.Column(db.Text)
app_count = db.Column(db.Integer)
4、引入数据结构
在storage/models.py
中引入定义的数据结构
5、实现增删改查
在resource_manager.py
实现增删改查方法(或者在resource目录下的mepm.py中实现)
def create_mepm(self, mepm_name, type, inputs, vendor):
new_mepm = models.MEPM(
id=mepm_name,
name=vnfm_name,
type=type,
param=inputs,
status='OK',
active = False,
vendor = vendor
)
self.sm.put(new_mepm)
return new_mepm
def delete_mepm(self, mepm_id):
current_app.logger.info('delete_mepm: delete mepm by id, vnfm_id=' + mepm_id)
mepm = self.sm.get(models.MEPM, mepm_id)
return self.sm.delete(mepm)
6、重启rest服务并排错
systemctl restart cloudify-restservice
REST服务日志目录为/var/log/cloudify/rest
问题记录
1、随着版本的更新,Cloudify manager本身的开发也发生了一些变化,掌握好目录结构后,可以通过参考Cloudify自带的接口程序进行开发;
2、前端页面的开发在官网文档有记录,基于后端接口开发一个个的Widget,传送门Cloudify页面开发
涉及的Github仓库有:
官方插件仓库(包含Openstack、k8s、utilities等插件)
大神插件仓库(包含proxy等)