当前位置: 首页 > 工具软件 > Cloudify > 使用案例 >

Cloudify开发

仲孙飞文
2023-12-01

前言

记录一些关于Cloudify的一些理解和操作,便于后续查找和对接。

一、部署相关

1、容器化部署

1.1 镜像下载&部署

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版本的官网文档给出了高可用部署方案,但是当前容器镜像仍未发布;

1.2 定制化修改

Cloudify Manager主要有privarte ippublic ipadmin password三个参数在部署时可能需要修改,由于是在容器中部署,privarte ippublic 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进行验证

1.3 定制化开发

此处先介绍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_idprivate_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等)

 类似资料: