《Cloudify3.1环境搭建和插件集成》

lihai1107 发布于 2015/05/21 22:28
阅读 2K+
收藏 6
《Cloudify3.1环境搭建和插件集成》
文档概述: 参考本文档会对cloudify整体有初步了解,熟悉搭建环境、蓝图管理、puppet插件集成,其中也介绍了puppet语法和简单的standalong模式操作(以便cloudify集成puppet standalong模式),这里搭建cloudify环境需要5步骤就可以了。
2了解Cloudify 
2.1Cloudify相关概念:
cloudify:云应用程序协调器,自动化执行管理应用程序流程,在云环境中或传统的数据中心,Blueprint是Cloudify的核心。
blueprint:Cloudify使用蓝图来描述整个应用程序编制,包括应用程序节点、工作流和关系。应用程序的编制计划,也是应用布署以及伸缩监控的所有的细节,本质上它是一个YAML文件。
YAML:遵守TOSCA规范的描述性语言,描述应用程序拓扑结构、工作流、策略、节点及其关系/依赖性,为每个节点配置(它文件包含Imports、Plugin declarations、Inputs and outputs、Types, nodes and relationships、Intrinsic functions、Workflows、Policies)。
TOSCA:TOSCA规范提供了一个语言描述服务拓扑结构,服务组件和它们之间的关系,描述创建或修改服务使用的管理程序编制过程(编排),任何拓扑和自动化的过程。
2.2Cloudify工作方式:
工作流程:上传蓝图---》部署蓝图(可以有多个部署)-》执行工作流—》应用启动
蓝图执行流程:cli上传、部署蓝图—》REST SERVER—》ES保存—》部署代理创建—》部署工作流代理创建
部署:蓝图的一个“实例”,一个实际的执行上下文和资源。使用蓝图来描述整个应用程序编制,包括应用程序节点、工作流和关系。
Execution:一个“运行”一个工作流对于一个给定的部署。
Workflows:工作流描述不同过程的自动化安装,升级等(默认情况下,蓝图将使用cloudify提供的内置工作流)。实现每个生命周期事件的每个节点的插件(YAML持有一个映射到实现事件),例如实现create、install、config、uninstall。Workflows (install, uninstall, scale, heal)
插件工作:Cloudify使用芹菜作为任务代理执行本地和远程操作,Cloudify通过芹菜的工作流引擎发送任务;任务通过通过RabbitMQ芹菜代理/工人将执行任务,然后与Cloudify通过REST调用REST服务
3Cloudify环境搭建
3.1安装要求
安装最低要求:操作系统64-bit,2G RAM,1CPU 和5GB空闲空间(1G内存基本认为是不够用的,安装成功几率非常小,会导致cpu达到100%,elasticsearch报错等各种异常问题)
官方推荐要求:4G RAM,4核CPU,内存大小可以根据运行的部署的数量,大量的并发日志,并发指标和event发送占用情况来确定 。
操作系统:如果使用引导Cloudify推荐Ubuntu 12.04 Precise ;
如果使用Docker镜像推荐Ubuntu 14.04或者Centos 6.5
端口要求:入传端口,出传端口一定要保证不被占用,不然安装不成功。
入传端口:
80(CLI和REST访问)
20(CLI引导)
5672 (代理经理交流,如果rabbitmq-server安装失败,可能是端口占用
/var/log/upstart/rabbit@puppetclient.log可以观察日志)
出传端口:
22(若基于Linux主机和远程代理安装是必需)
5985 (若运行Windows主机和远程代理安装是必需)


3.2创建管理用户
建议创建用户下安装cloudify,但不要建用户组(组下好像会出问题)。所有安装操作在用户登录下操作,不要使用root权限。Cloudify会不定时的对外发包,引起对外服务攻击,目前说是elasticsearch组件的版本过低引起,需要升级最新版本的elasticsearch,使用用户提升安全性。用户登录后操作之前最好更新,升级下系统。
command:
sudo apt-get update
sudo apt-get upgrade
useradd  user  -d  /home/user  -m -s  /bin/bash (需要给用户sudoers权限)


3.3创建Virtualenv隔离环境
virtualenv可以隔离出一个完整的环境。CLI和使用python会在这个隔离环境工作。
Virtualenv:是Python开发常用的工具之一,它可以帮助开发者建立一个独立的虚拟的环境,开发者可以将自己需要用的python package装入到这个虚拟环境中,这样就和系统全局的其他package隔离了,不会影响系统的package布局,要使用这些安装在虚拟环境中的模块,只需要activate进行该环境,不激活的话就不能使用那些在虚拟环境中的模块,就像从没安装过一样。
sudo  apt-get  install  python-virtualenv
从Pypi先决条件编译安装,Cloudify CLI依赖性需要你的机器上编译,需要安装python-dev
sudo apt-get install  python2.7-dev
Git一个强大的分布式版本控制系统,安装git提供从Github 库下载蓝图
sudo apt-get install  git
virtualenv  virtual-env-name
source  virtual-env-name/bin/activate


3.4制作ssh-key文件
所有的Fabric 插件模式需要SSH配置,制作key在input.json传入参数,免除登录密码
Sudo  apt-get install  openssh-client
/usr/bin/ssh-keygen -t  rsa
cd ~/.ssh 
cat id_rsa.pub >> authorized_keys


3.5安装cloudify  CLI
安装Cloudify CLI(使用命令为cfy)客户端用来引导一个cloudify manager、upload blueprints、create deployments和execute workflows。
如果您已经安装了一个CLI的先前版本,确保删除干净之前的版本(如果使用用户登录创建,直接删除用户清除目录即可,这也是用户操作的一个好处)。


官方推荐2种安装方法:
第一种方法:二进制包安装(只能引导Openstack经理)
sudo dpkg -i <pkg.deb>


第二种方法:作为一个python包通过PyPi安装(可引导其他环境),必须使用virtualenv隔离环境,需要安装 Python 2.7以上版本(ubuntu12.04系统自带2.7.3,无需重复安装)和PIP(pip类似RedHat里面的yum,安装Python包非常方便)


command:
pip install cloudify(安装最稳当版本)
pip install cloudify –pre(安装最新版本)
pip install cloudify==3.1rc2(安装cloudify cli3.1版本,我们选择3.1版本安装)
也可以从Github安装(安装CLI从Github必须按照正确的顺序安装几个模块,这里不推荐)
安装完毕cloudify cli,运行cfy –version ,查看是否为3.1版本客户端
3.6CLI引导出manager
使用Cloudify  CLI引导出Cloudify manager,引导Cloudify manager是通过使用标准Manager Blueprints,这些都是Cloudify蓝图已构建的manager  server和拓扑结构,需要安装cloudify组件和插件。
步骤1:选择用户根目录(cd ~)作为Cloudify CLI初始化目录,初始化cli工作目录
cfy init


步骤2:使用官方的标准Manager Blueprints 3.1
git clone https://github.com/cloudify-cosmo/cloudify-manager-blueprints
cd cloudify-manager-blueprints
git checkout tags/3.1


步骤3:安装blueprint-specific依赖性,install-plugins功能必须在正常运行的virtualenv环境下才能运行,不然会报错。
cfy local install-plugins -p cloudify-manager-blueprints/simple/simple.yaml


如果不是沙箱环境,也可以这么安装
cfy local create-requirements -o requirements.txt -p /path/to/manager/blueprint/file
sudo pip install -r requirements.txt


步骤4:input.json文件将作为输入的配置管理器蓝图。编辑manager-blueprints提供inputs.json模板文件
{
    “public_ip”: “127.0.0.1”,
    “private_ip”: “127.0.0.1”,
    “ssh_user”: “user”,
    “ssh_key_filename”: “/home/gary/.ssh/id_rsa”,
    “agents_user”: “ubuntu”,
    “resources_prefix”: “”
}


步骤5:cfy引导出一个cloudify manager,simple不会创建基础设施,只安装经理给定主机上,
引导内部流程:cloudify manager进行验证->IaaS相关交互(认证,资源创建,网络,密钥对)->执行安装工作流->Cloudify管理器组件的安装(整个过程可以认为是CLI与IAAS的交互过程)
cfy bootstrap -p cloudify-manager-blueprints/simple/simple.yaml -i cloudify-manager-blueprints/


步骤6:安装完毕,查看Cloudify经理所需的提供者
cfy  status   会列出如下信息,那么证明cloudify环境以及安装成功。可以在浏览器输入http://127.0.0.1打开cloudify UI,查看cloudify界面。
Services:
+--------------------------------+---------+
|    service          |  status |
+--------------------------------+---------+
| Riemann             | running |
| Celery Managment     | running |
| RabbitMQ            | running |
| Cloudify Manager      | running |
| Elasticsearch          | running |
| SSH                 | running |
| Webserver           | running |
| Cloudify UI           | running |
| Syslog               | running |
| Logstash             | running |
+--------------------------------+---------+


4蓝图管理
4.1蓝图部署
这里部署一个官网给的酒窖的案例,来部署一个蓝图
步骤1:github库git一个cloudify-nodecellar-example到本地cfy工作目录,或者编织蓝图到cfy工作目录
git clone https://github.com/cloudify-cosmo/cloudify-nodecellar-example


步骤二:保持和cloudify3.1版本(切换到3.1版本)
cd  cloudify-nodecellar-example
git checkout tags/3.1


步骤三:上传singlehost-blueprint蓝图 
cfy blueprints upload -b nodecellar -p  cloudify-nodecellar-example/singlehost-blueprint.yaml
查看蓝图:cfy blueprints list 


步骤四:部署蓝图
cfy deployments create -b nodecellar-d nodecellar --inputs  /inputs/singlehost.json
查看部署:cfy deployments list 


步骤五:执行部署工作流(卸载过程执行的是另一个工作流,这里会有连接超时多次重试的过程)
cfy deployments create -b nodecellar -d  nodecellar


步骤六:验证蓝图
如果部署成功,可以打开http://127.0.0.1:8080/
也可以在cloudify Ui界面,查看部署情况。


步骤七:部署错误排查(也可以到工作目录环境查看相应蓝图工作流日志)
查看工作流: cfy executions list -d  nodecellar(查看异常状态的工作流)
获得ID日志:cfy events list --include-logs --execution-id  ID(获取工作流错误)
跟踪工作流ID状态:cfy executions get -e  ID
取消工作流:cfy executions cancel --execution-id  ID
终止工作流:cfy executions cancel -e ID  -f
4.2蓝图卸载
4.2.1自动卸载
步骤一:列出需要卸载的蓝图
部署蓝图列表:cfy deployments list 


步骤二:执行卸载工作流
cfy executions start -w uninstall -d nodecellar


步骤三:删除部署
cfy deployments delete -d nodecellar


4.2.2手动卸载
自动卸载有时候会出现问题,这时候需要手动卸载。
步骤一:停止celeryd服务
sudo service celeryd-nodecellar stop
sudo service celeryd-nodecellar_workflows stop


步骤二:删除目录
rm -rf ~/cloudify.nodecellar
rm -rf ~/cloudify.nodecellar_workflows


步骤三:删除executions
curl -XDELETE 'http://localhost:9200/cloudify_storage/execution/_query?pretty' -d '{"query": {"term": {"nodecellar": "nodecellar"}}}'


步骤四:删除deployment node instances
curl -XDELETE 'http://localhost:9200/cloudify_storage/node_instance/_query?pretty' -d '{"query": {"term": {"nodecellar": "nodecellar"}}}'


步骤五:删除deployment nodes
curl -XDELETE 'http://localhost:9200/cloudify_storage/node/_query?pretty' -d '{"query": {"term": {"nodecellar": "nodecellar"}}}'


步骤六:删除deployment
curl -XDELETE 'http://localhost:9200/cloudify_storage/deployment/nodecellar?pretty' -d ''
4.3蓝图存在7种状态
pending 执行是等待工人来启动它
started 执行当前正在运行
cancelling 目前正在执行取消
force_cancelling 目前正在执行强制取消
cancelled 执行已被取消
terminated 成功执行终止
failed 执行失败,执行与此状态下应该有一条错误消息可用字段执行对象的错误


5了解Puppet
5.1Puppet概念
puppet 是一种Linux、Unix、windows平台的集中配置管理工具,可管理配置文件、用户、cron任务、软件包、系统服务等,puppet把这些系统实体称之为资源,可对资源管理及处理资源间的依赖关系。
5.1.1Puppet两种模式
Standalone模式:
puppet在单机上使用,只安装puppet客户端,使用puppet apply运行puppet脚本,称之为standalone模式。直接运行单机puppetd file.manifest读取file.mainfest文件进行配置;
c/s结构模式:
在这种结构中puppet客户端只是指运行puppet的服务器,puppet服务器端是只运行puppetmaster的服务器. 当客户端连接上Puppet master后,定义在Puppet master上的配置文件会被编译,然后在客户端上运行。每个客户端默认每半个小时(可以设置runinterval=30)和服务器进行一次通信,确认配置信息的更新情况。如果有新的配置信息或者配置信息已经改变,配置将会被重新编译并发布到各客户端执行。也可以在服务器上主动触发一个配置信息的更新,强制各客户端进行配置。如果客户端的配置信息被改变了,它可以从服务器获得原始配置进行校正。
c/s结构使用puppetd --server puppetmaster.server.com是从服务端下载manifest进行配置。 
5.1.2Puppet资源
定义一个资源,需要指定资源的type(指定资源的类型)和资源的title(作用是让puppet能唯一标识这个资源),puppet的资源是由具体的系统管理任务抽象而来的,系统管理中遇到什么任务,就会有相应的资源类型,puppet的代码主要就是由这些资源和资源的属性构成。目前puppet支持的资源类型有:
file           文件/目录的管理
user   添加用户,
group   添加用户组,
package     软件包的管理(yum install|remove)
mount     挂载,
schedule、cron(定时任务的管理),
service     某服务的管理(start|restart|stop|status)
tidy       清理,
yumrepo (yum仓库),
sshkey       (ssh认证)等常用资源
exec           shell命令
notify         资源之间的通讯


puppet type:
augeas、computer、cron、exec、file、filebucket、group、host、interface、k5login、macauthorization、mailalias、maillist、mcx、mount、nagios_command、nagios_contact、nagios_contactgroup、nagios_host、nagios_hostdependency、nagios_hostescalation、nagios_hostextinfo、nagios_hostgroup、nagios_service、nagios_servicedependency、nagios_serviceescalation、nagios_serviceextinfo、nagios_servicegroup、nagios_timeperiod、notify、package、resource、router、schedule、selboolean、selmodule、service、ssh_auth、rized_key、sshkey、stage、tidy、user、vlan、yumrepo、zfs、zone、zpool
5.2Puppet工作流程
Puppet把每个客户端的主机名作为一个node,服务端puppetmaster也是根据这个node区分客户端。
Puppet的 C/S架构的配置管理工具,在中央服务器上安装puppet-server软件包(被称作Puppet master)。在需要管理的目标主机上安装puppet客户端软件(被称作Puppet Client)。
客户端通过ssl证书连接puppet服务器端。
1) puppetd调用facter(facter探测主机变量:主机名、内存大小、IP等)
2) pupppetd 把这些信息通过ssl连接发送到服务器端
3) puppetmaster检测客户端的主机名,到manifest里面对应的node配置,对这段内容进行解析,facter送过来的信息可以作为变量进行处理的,node牵涉到的代码才解析,其它的代码不不解析,解析分几个过程:语法检查、然后会编译配置代码生成一个中间的伪代码,然后再把伪代码发给客户机。
4) 客户端接收到伪代码之后就会执行,客户端再把执行结果发送给服务器
5) 服务器再把客户端的执行结果写入日志
6)客户端接收完整的catalog日志
5.3Puppet集群
在大规模的生成环境中,如果只有一台puppetmaster会忙不过来的,因为puppet是用ruby写 的,ruby是解析型语言,每个客户端来访 问,都要解析一次,当客户端多了就忙不过来,所以需要扩展成一个服务器组。puppetmaster可以看作一个web服务器,实际上也是由ruby提供 的web服务器模块来做的。因此可以利用web代理软件来配合puppetmaster做集群设置。


5.4Puppet语法
puppet把需要管理的内容抽象成为资源,每种资源有不同的属性,因此puppet语言就是描述这些资源的属性以及资源之间关系的语言。
5.4.1Puppet基本语法
puppet的代码主要就是由资源和资源的属性构成. 每个资源都包含有类型(type),标题(title)和一些其他属性的列表。每个资源的定义都具有标题、类型,以及一系列的属性。每个资源在Puppet中名称必须唯一。
资源:资源可以是文件、服务、软件包、自定义脚本等。
属性:资源需要定义相关的属性值,否则毫无意义。
类: 将多个资源组织起来进行重新定义。
模块:多个类的合集。
变量:Puppet与其他语言类似,同样支持变量。
参数:又称参变量。
节点:Puppet每一个客户端,即主机(Host)。
5.4.2Puppet实战


5.5Puppet安装
Puppet Standalone模式安装执行安装客户端就好了,无需配置既可以使用命令来执行puppet脚本文件。C/S模式安装稍微复杂,这里不做介绍。
Puppet Standalone模式安装
步骤1:修改主机名(尽管单机模式,还是建议修改主机名,以后都不要再做修改)
hostname  puppetclient
步骤2:安装puppet和facter
apt-get install puppet facter
步骤3:安装存储库
wget https://apt.puppetlabs.com/puppetlabs-release-precise.deb 
sudo dpkg -i puppetlabs-release-precise.deb 
sudo apt-get update
步骤4:安装puppet客户端
sudo apt-get install puppet
步骤5:检测是否成功安装
puppet –version
puppet apply test.pp
6puppet插件集成
pupppet插件集成cloudify,可以使用映射节点生命周期操作运行Puppet manifest执行.pp脚本,puppet插件运行要求安装Python2.7以上版本。
6.1.1puppet插件集成方式
puppet 集成cloudify有两种方式,允许运行Puppet agent 和Puppet standalone。
使用哪种模式,会根据properties > puppet_config自动选择,如果properties > puppet_config>server>puppet服务端主机名,就使用agent模式,如果没有server就是用standalone模式。这里目前只介绍standalone模式插件集成。
6.1.2puppet插件standalone集成
Puppet standalone通过插件安装安装Puppet、通过- puppetlabs-apache 安装Puppet modules,并将每个操作运行manifests代码,执行puppet脚本来管理应用或执行操作。安装完成后manifests,modules会在cloudify工作根目录自动生成:
cloudify/puppet/manifests, 
cloudify/puppet/modules
在蓝图实现生命周期接口是,也会直接调用这些目录里面的puppet脚本,和manifests安装文件。
imports:
  - http://getcloudify.org/spec/puppet-plugin/1.1/plugin.yaml
node_templates:
  example_web_server:
    type: cloudify.puppet.nodes.WebServer
    properties:
      puppet_config:
        ...
        modules:
          - puppetlabs-apache
          - puppetlabs-concat
          - puppetlabs-stdlib
          - puppetlabs-vcsrepo


也可以在蓝图文件执行写puppet脚本。能够执行的工作原理是,在执行部署蓝图的工作流后,会把puppet_config下面所有的内容生成一个json文件,供给puppet执行。
imports:
  - http://getcloudify.org/spec/puppet-plugin/1.1/plugin.yaml
node_templates:
  example_web_server:
    type: cloudify.puppet.nodes.WebServer
    properties:
      puppet_config:
        modules:
          ...
          - puppetlabs-vcsrepo
        execute:
          configure: |
            package{'git':}
            ->
            vcsrepo{$cloudify_local_repo:
              ensure => present,
              provider => git,
              source   => 'https://github.com/example-com/our-manifests.git',
            }
          start: |
            class{'my_hello_world':
            }


提供manifests ,有3种提供
1.使用puppet代码获取manifests,文件必须是.tar.gz
1. imports:
  - http://getcloudify.org/spec/puppet-plugin/1.1/plugin.yaml
node_templates:
  example_web_server:
    type: cloudify.puppet.nodes.WebServer
    properties:
      puppet_config:
        download: http://manifests.example.com/
        manifest:
          start: manifests/site.pp


2.蓝图内嵌Puppet manifests文件必须是.tar.gz
imports:
  - http://getcloudify.org/spec/puppet-plugin/1.1/plugin.yaml
node_templates:
  example_web_server:
    type: cloudify.types.puppet.web_server
    properties:
      puppet_config:
        download: /path/to/manifests.tgz
        manifest:
          start: manifests/site.pp


6.1.3puppet集成安装
步骤1:编写完整的puppet集成蓝图,例如:
注意在YAML中不能使用tab打出空格,再上传之前一定要使用4个空格来替换tabl键空格。
下面的download中 /代表蓝图的根目录,下载完成的puppet.tar.gz会自动解压并放到cloudify/puppet目录下


tosca_definitions_version: cloudify_dsl_1_0
imports:
  - http://www.getcloudify.org/spec/cloudify/3.1/types.yaml
  - http://getcloudify.org/spec/puppet-plugin/1.1/plugin.yaml
inputs:
    host_ip:
    agent_user:
    agent_private_key_path:
node_types:
    mysql_database:
        derived_from: cloudify.puppet.nodes.DBMS
    tomcat_server:
        derived_from: cloudify.puppet.nodes.WebServer
    nodecellar_app:
        derived_from: cloudify.puppet.nodes.ApplicationModule
relationships:
    node_connected_to_mysql:
        derived_from: cloudify.relationships.connected_to
    node_contained_in_tomcat:
        derived_from: cloudify.relationships.contained_in
node_templates:
    host:
        type: cloudify.nodes.Compute
        properties:
            ip: { get_input: host_ip }
            cloudify_agent:
                user: { get_input: agent_user }
                key: { get_input: agent_private_key_path }          
    mysql:
        type: mysql_database
        properties:
            puppet_config:
                download: /puppet/puppet.tar.gz
                manifest:
                    start: manifests/mysql/start.pp
config: manifests/mysql/config.pp
stop: manifests/mysql/stop.pp
delete: manifests/mysql/delete.pp
        relationships:
            - type: cloudify.relationships.contained_in
              target: host
    tomcat:
        type: tomcat_server
        properties:
            puppet_config:
                download: /puppet/puppet.tar.gz
                manifest:
                    start: manifests/tomcat/start.pp
config: manifests/tomcat/config.pp
stop: manifests/tomcat/stop.pp
delete: manifests/tomcat/delete.pp
        relationships:
            - type: cloudify.relationships.contained_in
              target: host
    nodecellar:
        type: nodecellar_app
        properties:
          puppet_config:
                download: /puppet/puppet.tar.gz
                manifest:
                    start: manifests/app/start.pp
config: manifests/app/config.pp
stop: manifests/app/stop.pp
delete: manifests/app/delete.pp
        relationships:
            - target : mysql
              type: node_connected_to_mysql
            - target: tomcat
              type: node_contained_in_tomcat
outputs:
  endpoint:
    description: Web application endpoint
    value:
      ip_address: { get_property: [ host, ip ] }


步骤2:安装插件,这里会安装puppet插件,在执行工作流时,会在根目录建立cloudify/puppet/
cfy  local  install -plugins  -p  cloudify-puppet-local / puppet.yaml


步骤3:是修复依赖关系,系统上有某个package不满足依赖条件,这个命令就会自动修复,安装那个package依赖的(不执行导致在安装puppet时报错,会提示让修复儿失败)
packagesudo apt-get install -f 


步骤4:上传蓝图,部署蓝图,执行工作流(这3个步骤和nodecellar部署相同)
cfy blueprints upload -b puppet -p cloudify-puppet-local/puppet.yaml
cfy deployments create -b puppet -d puppet --inputs cloudify-puppet-local/inputs/input.json
cfy executions start -w install -d puppet
7安装总结
1.安装过程中会有很多官方链接,特别是插件和安装包的下载,大多情况下会下载很慢导致安装重试或者直接失败(官方安装第一次下载了4个小时)。所需包要先下载下来,提供正常的下载链接,来替换对应的simple.yaml插件和代理链接。
2.安装过程一定要在隔离沙箱的环境下安装,不然会报一些莫名的错误。
3.安装前必须的端口一定要校验,如果被占用安装失败。
4.安装完成由于ElasticSearch低版本远程执行命令漏洞,cloudify会不定时对外发包,
紧急应对措施elasticserach.yml中加入script.groovy.sandbox.enabled: false
5.安装内存要求不要低于2G,不然安装会报错误。


加载中
返回顶部
顶部