Cloudify 是一个开源的云应用编排系统,它允许使用DSL来描述应用的拓扑结构,并部署到任意环境中。本文大量参考了 官方教程 从零开始搭建并管理一个cloudify 3.3.1集群。
我们需要先安装 virtualBox 和 vagrant 。通过vagrant来驱动virtualBox搭建一个虚拟测试环境。首先在本地任意路径新建一个空文件夹比如 test
,运行以下命令:
mkdir test
cd test
vagrant init minimum/ubuntu-trusty64-docker
vi Vagrantfile
里面应该有一句 config.vm.box = "minimum/ubuntu-trusty64-docker"
,注释掉并在它的下面添加如下几行代码,相当于给它分配两台虚拟机,一台叫做 manager ,它的IP是 192.168.33.17 ;另一台叫做 agent ,它们的IP是 192.168.33.18 。
config.vm.define "manager" do | host |
host.vm.box = "cloudify-virtualbox_3.3.0-ga-b300.box"
host.vm.box_url = "http://repository.cloudifysource.org/org/cloudify3/3.3.0/ga-RELEASE/cloudify-virtualbox_3.3.0-ga-b300.box"
host.vm.hostname = "manager"
host.vm.network "private_network", ip: "192.168.33.17"
host.vm.provider "virtualbox" do |v|
v.memory = 2048
end
end
config.vm.define "agent" do | host |
host.vm.box = "minimum/ubuntu-trusty64-docker"
host.vm.hostname = "agent"
host.vm.network "private_network", ip: "192.168.33.18"
end
虚拟机agent所用的vagrant镜像已经在ubuntu的基础上帮我们安装了docker,用起来很方便。虚拟机manager用的远程镜像是cloudify官方镜像,提供了cloudify manager功能。然后分别在两个终端运行以下命令启动并连接两台虚拟机。
vagrant up
vagrant ssh manager
vagrant ssh agent
在Ubuntu上安装cloudify很简单,在agent上运行以下命令即可:
wget -c http://repository.cloudifysource.org/org/cloudify3/get-cloudify.py
sudo python get-cloudify.py
安装完了之后,运行以下命令可以看到cloudify命令行的版本及帮助文档:
cfy --version
cfy -h
Cloudify的应用被称为 蓝图 (blueprint),这个名字很好地诠释了它在主页上声称的“从蓝图到生产环境(From Blueprint to Production)”。官方已经为我们的第一次使用准备了一个Hello World,让我们先下载下来:
wget -c https://github.com/cloudify-examples/simple-python-webserver-blueprint/archive/master.zip
sudo apt-get install -f unzip
unzip master.zip
cd simple-python-webserver-blueprint-master/
接下来初始化下载的蓝图并传入端口等参数:
cfy local init --blueprint-path blueprint.yaml --inputs '{"webserver_port": "8000", "host_ip":"localhost"}'
Cloudify使用工作流(workflow)来管理应用程序。现在启动install工作流来部署一个python的web服务器:
cfy local execute --workflow install
curl localhost:8000
也可以在启动vagrant虚拟机的主机上访问: http://192.168.33.18:8000 :
短短几步,我们便顺利部署了一个应用。通过以下命令可以看到一些运行的参数:
cfy local outputs
我们看到的内容称之为模型(model)。蓝图是应用的模板,蓝图的实例称为部署(deployment),部署就是模型的内容之一。蓝图里的每个实体称之为节点(node),节点在部署里称为节点实例(node-instances),它们是一对多的关系。但是在这个例子里,我们有两个节点,每个节点各有一个节点实例。可以用以下命令查看节点实例:
cfy local instances
我们能看到这两个节点实例分别是host和http_web_server,其中http_web_server运行在host之上。可以用以下命令来结束部署:
cfy local execute -w uninstall
现在让我们看一看刚才所用的蓝图的结构:
cat blueprint.yaml
这就是一个yaml格式的文件,里面都是cloudify的DSL。文件分为以下五个部分:
其中包括了三个内置函数(Intrinsic Functions),分别是 get_input
, get_property
和 concat
,只能在蓝图里使用。它们的意思也都比较明显,可以从函数名推断出来。所有的内置函数可以在 这里 查看到。
Cloudify通过 docker插件 来支持docker。这个插件依赖于Docker Python API库,而不是Docker CLI,所以体验上有所不同。比如说, docker run
将会被分解为 docker create
和 docker start
。接下来让我们来尝试部署一个tomcat容器。首先需要生成一个tomcat容器的蓝图:
mkdir ../docker
cd ../docker
cat << EOF > blueprint.yaml
tosca_definitions_version: cloudify_dsl_1_2
imports:
- http://www.getcloudify.org/spec/cloudify/3.4m3/types.yaml
- http://www.getcloudify.org/spec/docker-plugin/1.3.1/plugin.yaml
inputs:
host_ip:
description: >
The ip of the host the application will be deployed on
default: 127.0.0.1
tomcat_container_port_bindings:
description: >
A dict of port bindings for the node container.
default:
8080: 8080
node_templates:
host:
type: cloudify.nodes.Compute
properties:
install_agent: false
ip: { get_input: host_ip }
tomcat_container:
type: cloudify.docker.Container
properties:
name: tomcat
image:
repository: tomcat
tag: 8.0.30-jre8
interfaces:
cloudify.interfaces.lifecycle:
create:
implementation: docker.docker_plugin.tasks.create_container
inputs:
params:
stdin_open: true
tty: true
start:
implementation: docker.docker_plugin.tasks.start
inputs:
params:
port_bindings: { get_input: tomcat_container_port_bindings }
relationships:
- type: cloudify.relationships.contained_in
target: host
outputs:
http_endpoint:
description: Tomcat web server endpoint
value: { 'http://localhost:8080' }
EOF
这个蓝图需要docker的插件,所以必须先安装一下,然后就可以初始化蓝图(这次不传参数,使用默认值):
cfy local create-requirements -o requirements.txt -p blueprint.yaml
sudo pip install -r requirements.txt
cfy local init -p blueprint.yaml
现在可以运行啦。由于第一次运行需要下载镜像,可能会比较慢:
cfy local execute -w install
docker ps
docker images
总算是可以访问了:
curl localhost:8080
也可以在启动vagrant虚拟机的主机上访问: http://192.168.33.18:8080 。查看运行参数和节点实例:
cfy local outputs
cfy local instances
可以用以下命令来结束部署:
cfy local execute -w uninstall
docker ps -a
看起来容器会被删除。感觉怎么样?你愿意天天这样来部署docker么?
除了命令行以外,cloudify也支持使用管理器来部署应用。Cloudify管理器有自己的用户界面,提供历史记录、授权和鉴权等功能,并且支持并行运行工作流。下面我们来试着安装一个cloudify管理器。启动cloudify管理器就像是启动一个普通的蓝图一样。可是安装需要下载一大堆的依赖,比较繁琐,有兴趣的童鞋可以参考 官方教程 。官方另外还提供了一个 vagrant镜像 ,里面已经配置好了整个Cloudify管理器,因为我们启动vagrant的时候就已经导入了,直接用它更方便。只要虚拟机启动起来(按照本教程的话,现在是起来的状态),可以直接访问 http://192.168.33.17/ 来打开cloudify管理器的页面了:
接下来我们来上传一个官方的蓝图,这是nodejs调用mongodb的应用:
cd blueprints
git clone https://github.com/cloudify-cosmo/cloudify-nodecellar-example
cd cloudify-nodecellar-example/
git checkout tags/3.3
cfy blueprints upload -b nodecellar -p simple-blueprint.yaml
-b
参数的nodecellar是这个蓝图的名字。刷新蓝图的界面,我们就能看到一个名为nodecellar的蓝图。点击进去,还能看到更详细的拓扑结构、节点信息等。甚至还可以点击图上的各个组件查看详细信息:
这里有4个节点:
接下来让我们生成一个部署对象:
sed -i 's/host_ip: .*/host_ip: 192.168.33.17/' ../inputs/nodecellar-singlehost.yaml cfy deployments create -b nodecellar -d nodecellar --inputs ../inputs/nodecellar-singlehost.yaml
-d
参数的nodecellar是这个部署的ID。页面上点击左边的Deployments,我们就能看到ID为nodecellar的部署了。而Logs & Events里面也生成了好几页日志和事件。与此同时,最左下的Nodes也出现了4条记录。接下来,真正地开始部署:
cfy executions start -w install -d nodecellar
部署需要一些时间,在笔者的mac上大约5分钟。这时如果刷新部署页面,就能看到Action显示Install,旁边还有一个 ×
号,可以通过点击它来取消本次部署。点击部署页面上nodecellar的ID,就能看到一系列详细信息,甚至还有监控:
部署完成后,就可以直接访问 http://192.168.33.17:8080/ 来打开这个nodejs酒窖的网站了:
还可以用以下命令来停止nodecellar的部署,并删除这个部署:
cfy executions start -w uninstall -d nodecellar cfy deployments delete -d nodecellar
值得一提的是,刚才我们输入的命令,都可以通过cloudify manager的界面来操作。如果需要停止cloudify manager,可以用以下命令:
cfy teardown -f