文档章节

OpenStack Heat 模板学习

蓝狐乐队
 蓝狐乐队
发布于 2014/04/18 18:00
字数 3451
阅读 494
收藏 1

What's heat

Heat is the main project in the OpenStack Orchestration program. It implements an orchestration engine to launch multiple composite cloud applications based on templates in the form of text files that can be treated like code. A native Heat template format is evolving, but Heat also endeavours to provide compatibility with the AWS CloudFormation template format, so that many existing CloudFormation templates can be launched on OpenStack. Heat provides both an OpenStack-native ReST API and a CloudFormation-compatible Query API.


Heat 类似于AWS的CloudFormation, 是OpenStack Orchestration进程的一个项目,OpenStack Orchestration旨在创建一个人性化的服务去管理整个云架构,服务和应用的生命周期。heat实现了一种自动化的通过简单定义和配置就能实现的云部署方式。可以在heat模板中定义连串相关任务(例如用某配置开几台虚拟机,然后再去在其中一台中安装一个mysql服务,设定相关数据库属性,然后再配置几台虚拟机安装web服务集群等等),然后交由heat,由heat按照一定的顺序执行heat模板中定义的一连串任务。利用heat还可以连接到neutron来帮助编排负载均衡和其他网络功能。

How it works学习heat主要学习heat的template,heat的template描述了所用的所有组件资源以及组件资源之间的关系。 这些资源包括:servers,floating ips, volumes, security groups, users and others. Heat管理这些组件的生命周期,当你需要对现在的部署做一些修改的时候,你只需要对template做一些修改即可。Heat还可以与其他软件管理工具集成比如Puppet以及chef。

Getting Started GuidesInstall Heat with Devstack选择一个VM镜像,可以选择 http://cloud.fedoraproject.org/fedora-20.x86_64.qcow2F20,它包含了heat-cfntools包,当运行./stack.sh的时候Heat将会被加载到screen中前缀是h-. 假如需要使用Ceilometer Alarms功能你需要添加Ceilometer功能。需要做的是在devstack的localrc文件中添加如下:

CEILOMETER_BACKEND=mysql
enable_service ceilometer-acompute ceilometer-acentral ceilometer-collector ceilometer-api
enable_service ceilometer-alarm-notifier ceilometer-alarm-evaluator


#sudo apt-get install gitgit-review ctags
首先下载devstack
#git clone https://github.com/openstack-dev/devstack.git
然后准备localrc如下,灵活选择你感兴趣的项目,做减法处理。注意假如你的环境在proxy后面,而proxy又不支持git时,可以将stackrc中的GIT_BASE=${GIT_BASE:-git://git.openstack.org}改为GIT_BASE=${GIT_BASE:-https://github.com}

#The localrc is used to deploy a Neutron+OVS+heat+ceilometer+tempest development env
#OFFLINE True if no need to pull necessary packages again
#OFFLINE=True
#RECLONE True if all need a fresh repo environment
#RECLONE=True
ADMIN_PASSWORD=123
MYSQL_PASSWORD=123
RABBIT_PASSWORD=123
SERVICE_PASSWORD=123
SERVICE_TOKEN=123
Q_PLUGIN=openvswitch
disable_service n-net
#enable necessary network comps
ENABLED_SERVICES+=,neutron,q-svc,q-agt,q-dhcp,q-l3,q-meta
#enable advanced services
enable_service q-vpn q-lbaas q-fwaas
#enable tempest for learning tempest
enable_service tempest
#enable heat
enable_service heat h-api h-api-cfn h-api-cw h-eng
#enable ceilometer for Ceilometer Alarms
CEILOMETER_BACKEND=mysql
enable_service ceilometer-acompute ceilometer-acentral ceilometer-collector ceilometer-anotification
enable_service ceilometer-api
enable_service ceilometer-alarm-notifier ceilometer-alarm-evaluator

HOST_IP=<Host-IP>
#VM images
IMAGE_URLS="http://launchpad.net/cirros/trunk/0.3.0/+download/cirros-0.3.0-i386-uec.tar.gz"
#IMAGE_URLS+=",http://uec-images.ubuntu.com/pre ... img-amd64-disk1.img"
IMAGE_URLS+=",http://cloud.fedoraproject.org/fedora-20.x86_64.qcow2"

http_proxy=<http-proxy>
https_proxy=<https-proxy>
no_proxy=localhost,<Host-IP>

#for IPSec VPNaaS
IPSEC_PACKAGE=openswan

#LOG configure
SCREEN_LOGDIR=/opt/stack/screen-logs
SYSLOG=True

#DEST=/opt/stack/project

一切准备就绪,最好先update&upgrade一下,然后运行./stack.sh 可以部署openstack环境了。
模板https://github.com/openstack/heat-templates 提供一些templates参考例子来展示heat的一些核心功能。heat目前支持两种模板: 与CloudFormatior兼容的cnf目录下的模板以及自研的在hot目录下的HOT模板。 HOT模板基于YAML来展示,下面仅研究HOT模板。
写一个HOT hello world 模板hello template file:

heat_template_version: 2013-05-23

description: Simple template to deploy a single compute instance

resources:
  my_instance:
    type: OS::Nova::Server
    properties:
      key_name: heat_key
      image: cirros-0.3.0-i386-uec
      flavor: m1.tiny

“heat_template_version: 2013-05-23” 是必须制定的,标识当前heat的模板版本。Resources是必须的,其中一个resources内必须至少包含一个resource定义,在该例子中的key_name, image以及flavor都是hardcoded,该问题可以通过input parameters解决。
查找上面模板相关参数的CLI过程如下:

stack@vm:~/devstack$ . openrc admin admin
stack@vm:~/devstack$ cd
stack@vm:~$ nova keypair-add heat_key
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA5bONIrtYZju6CYa+QB8z+cV+6yDHwW1FH5KpMrHhK317b05D
G2q3gkE3TWZE5pHNlDDIOyG+6XVu+paFgkjsigsu5c3y4/43ArdSL/l47rauaQOb
/Lg/hpxe09P30IszhRIicl8sRYMceCpCmdnE+d4NHBqD8AEvFzZU+CVLuLimmkxj
TbcapVKbdGe0CBEypTifxDY/DXhlMlnGqMemP9rMig9SWxh1JS+EdsLfIBQ1NjTO
f8b6QnIiAx18RZc9LRjfQy63mPNKJEiyjPGdqkVDwVaM6QHaNblen5yTv17AoOi9
EZlN1FIGBH0LamUBn8FCCKvY0zgjhrlE5a5viQIDAQABAoIBAQC2mjUxjiNpKkPr
fM1TZjrIbaNGwglqkDYqMkoFffkVvKxawKmCayS1DKktA4b0kKYQD3Ot5lbBetSd
qvk5qEU6PEes8jsL2jTbGObiMn1br6gY3YCst7/wf/C2jsRraa2sNM1jhJtKKz9/
m4DUk5UOWeKsG7wVGKvZ1RxZJDT9A3OPqoNlKPcVXPfkZgyr9MujfNaBmGMwnJ5u
Kulu0CWPV1Q66/BOPJP6sy2iMBatvxAl6bJW8MG2kmaroy697kUs88pJQkOX6XAQ
BxW4pgBvE70sBNKGB3Q5krQAflF00k0JD73JSzEEnfYf/qiiliVVErlIxCX0m8q+
AvnDswgBAoGBAP7VIP7GkGEOw1OF1dLwJQw+sLmzmx1cRsR6atN4aebs97ELbqwR
iQdkjwi7QcloGSPvwNci9m69n5b4MDORfnyg6iEjnufjx0ETdU+WAYuHVKzo0jQc
CYscCInOWDDwfIQiKLaxJ8PHsr6PnLluVpqRYZj58OfmK8rg5A4pvJyJAoGBAObA
8sB9ZpKZ3cqKsFvWk9ZxatWEqyqILhHvxXDYDxEnjbbEW3pc22YSKNUixHjnKJ0A
ff+z8v3sZK+Ut9wyuSZ2RcChCR8+yRpH93+uhArRzvkmoCLfkEeCLnAenMn7Gn/G
5PtUnINc1/1aWR76nNoNCC38be4CJ2ZGRa4f3HsBAoGACyffYufkaCtSR7TDMJHM
vWV9LRP8xWNFwdIuHQXXdQGIslpyxNubqRQw4sv3zE5fU2Bqi8B/E0f/1YcV7RwA
copE1aCOk044adPlPc+uT6JkBZHHqfpUPJ/Ei+vZloLgoJQyPhUxTXPPkmINFV0M
M4YLxLukXTKJVj9UHH6dQCkCgYEAgZbYfXuvUCNzKF0s39ao3eSCD/laux8RaGdU
ZaQhCgxBjOPHT/e4CyGlptTIq/F9oHZ3TFP94daRUP3fJ52g11XSpHSLj+2NuOGz
wBP8+aqMZuXnRs5w04frlnHKsbAAWMQVMoR5BVjtv82ugTRTRC3Payv5fJHfGJPc
bAZepwECgYBdqWrp5vkF5ZWkWv/mAFs9FJ9l/U9Ac6Mwf70YWD2XaumeRHcbT7lN
K4Yb9yguT3tG39t7DcRxj/QopgIrI/eItiLI1UD2QiieFpT4NWSmRuBKJ24qlL2F
4ehCUJa0Pw1NVoTBsi3qjxqEHp41wJ5LDea5D8qltdA5Qln7wtbdBA==
-----END RSA PRIVATE KEY-----
stack@vm:~$ nova image-list
+--------------------------------------+-------------------------------+--------+--------+
| ID                                   | Name                          | Status | Server |
+--------------------------------------+-------------------------------+--------+--------+
| cd8dc967-6dea-4963-806a-715d52fb2721 | cirros-0.3.0-i386-uec         | ACTIVE |        |
| bbb040e9-2d35-403a-bf40-27b7213c0e1f | cirros-0.3.0-i386-uec-kernel  | ACTIVE |        |
| 31425245-56d6-424f-8089-cd363a90d210 | cirros-0.3.0-i386-uec-ramdisk | ACTIVE |        |
| 851fd3d9-ac4b-41b8-84a5-2fd169052d68 | fedora-20.x86_64              | ACTIVE |        |
+--------------------------------------+-------------------------------+--------+--------+
stack@vm:~$ nova flavor-list
+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+
| ID | Name      | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public |
+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+
| 1  | m1.tiny   | 512       | 1    | 0         |      | 1     | 1.0         | True      |
| 2  | m1.small  | 2048      | 20   | 0         |      | 1     | 1.0         | True      |
| 3  | m1.medium | 4096      | 40   | 0         |      | 2     | 1.0         | True      |
| 4  | m1.large  | 8192      | 80   | 0         |      | 4     | 1.0         | True      |
| 5  | m1.xlarge | 16384     | 160  | 0         |      | 8     | 1.0         | True      |
+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+


部署模板的CLI过程如下:

stack@vm:~/hot-files$ heat stack-create -f ./hello hello-stack
+--------------------------------------+-------------+--------------------+----------------------+
| id                                   | stack_name  | stack_status       | creation_time        |
+--------------------------------------+-------------+--------------------+----------------------+
| 2652f7da-aeb7-46a9-8832-a834142af6d4 | hello-stack | CREATE_IN_PROGRESS | 2014-03-31T07:52:19Z |
+--------------------------------------+-------------+--------------------+----------------------+
stack@vm:~/hot-files$ heat stack-list
+--------------------------------------+-------------+-----------------+----------------------+
| id                                   | stack_name  | stack_status    | creation_time        |
+--------------------------------------+-------------+-----------------+----------------------+
| 2652f7da-aeb7-46a9-8832-a834142af6d4 | hello-stack | CREATE_COMPLETE | 2014-03-31T07:52:19Z |
+--------------------------------------+-------------+-----------------+----------------------+
stack@vm:~/hot-files$ heat event-list hello-stack
+---------------+--------------------------------------+------------------------+--------------------+----------------------+
| resource_name | id                                   | resource_status_reason | resource_status    | event_time           |
+---------------+--------------------------------------+------------------------+--------------------+----------------------+
| my_instance   | 871b7361-fed2-4083-bd09-086e128cc6df | state changed          | CREATE_COMPLETE    | 2014-03-31T07:52:43Z |
| my_instance   | 9c192721-a7e3-4a0b-a4b1-a0131012d9fa | state changed          | CREATE_IN_PROGRESS | 2014-03-31T07:52:19Z |
+---------------+--------------------------------------+------------------------+--------------------+----------------------+
stack@vm:~/hot-files$ heat stack-show hello-stack
+----------------------+---------------------------------------------------------------------------------------------------------------------+
| Property             | Value                                                                                                               |
+----------------------+---------------------------------------------------------------------------------------------------------------------+
| capabilities         | []                                                                                                                  |
| creation_time        | 2014-03-31T07:52:19Z                                                                                                |
| description          | Simple template to deploy a single compute instance                                                                 |
| disable_rollback     | True                                                                                                                |
| id                   | 2652f7da-aeb7-46a9-8832-a834142af6d4                                                                                |
| links                | http://10.117.4.58:8004/v1/dee53 ... 9-8832-a834142af6d4 |
| notification_topics  | []                                                                                                                  |
| outputs              | []                                                                                                                  |
| parameters           | {                                                                                                                   |
|                      |   "OS::stack_name": "hello-stack",                                                                                  |
|                      |   "OS::stack_id": "2652f7da-aeb7-46a9-8832-a834142af6d4"                                                            |
|                      | }                                                                                                                   |
| stack_name           | hello-stack                                                                                                         |
| stack_status         | CREATE_COMPLETE                                                                                                     |
| stack_status_reason  | Stack CREATE completed successfully                                                                                 |
| template_description | Simple template to deploy a single compute instance                                                                 |
| timeout_mins         | 60                                                                                                                  |
| updated_time         | None                                                                                                                |
+----------------------+---------------------------------------------------------------------------------------------------------------------+


Template input parameters去硬编码,使模板更加灵活,需要加入parameters属性,这样调用模板时,可以输入相关参数,hello带input的模板如下:

heat_template_version: 2013-05-23

description: Simple template to deploy a single compute instance

parameters:
  key_name:
    type: string
    label: Key Name
    description: Name of key-pair to be used for compute instance
  image_name:
    type: string   
    label: Image Name
    description: Image to be used for compute instance
  instance_type:
    type: string
    label: Instance Type
    description: Type of instance (flavor) to be used

outputs:
    instance_ip:
        description: the ip addresss of the deployed instance_type
        value: {get_attr: [my_instance, first_address]}

resources:
  my_instance:
    type: OS::Nova::Server
    properties:
      key_name: { get_param: key_name }
      image: { get_param: image_name }
      flavor: { get_param: instance_type }

执行如下:

stack@vm:~/hot-files$ heat stack-create -f ./hello_input -P "key_name=heat_key;instance_type=m1.tiny;image_name=cirros-0.3.0-i386-uec" stack-vm2
+--------------------------------------+-------------+--------------------+----------------------+
| id                                   | stack_name  | stack_status       | creation_time        |
+--------------------------------------+-------------+--------------------+----------------------+
| 2652f7da-aeb7-46a9-8832-a834142af6d4 | hello-stack | CREATE_COMPLETE    | 2014-03-31T07:52:19Z |
| 73f79f9d-f5a4-46a4-a4d0-db0da7c646b2 | stack-vm2   | CREATE_IN_PROGRESS | 2014-03-31T08:36:36Z |
+--------------------------------------+-------------+--------------------+----------------------+
stack@vm:~/hot-files$ heat stack-list
+--------------------------------------+-------------+-----------------+----------------------+
| id                                   | stack_name  | stack_status    | creation_time        |
+--------------------------------------+-------------+-----------------+----------------------+
| 2652f7da-aeb7-46a9-8832-a834142af6d4 | hello-stack | CREATE_COMPLETE | 2014-03-31T07:52:19Z |
| 73f79f9d-f5a4-46a4-a4d0-db0da7c646b2 | stack-vm2   | CREATE_COMPLETE | 2014-03-31T08:36:36Z |
+--------------------------------------+-------------+-----------------+----------------------+

理解好了上面的两个例子,然后接下来就可以看【9】HOT的spec文档了,包括Structure,PGS,PS,RS,OS以及Intrinsic Functions
现在Heat支持的Resource类型可以在http://docs.openstack.org/developer/heat/template_guide/openstack.html上找到,下面主要探索advancedservices(LB,FW,VPN)的相关模板,需要在阅读[7]OpenStack Resource Types 以及[9]的前提下,才能了解下面模板的具体含义。
Loadbalancer 模板接下来首先根据[13]下手做一个Loadbalancer模板,网络拓扑图如下:



“””如上图所示,我们的服务器网络的网址范围为10.0.0.0/24,负载均衡器网络的网址范围是192.168.40.0/24,public网络链接办公网络,网址范围是192.168.10.224/28。路由器链接了所有三个网络。public网络和路由器是通过路由器的”网关臂(NeutronAPI中router的gateway)”相连的。路由器把服务器网络和负载均衡器网络的IP地址SNAT成路由器的”网关臂”在public网络的地址。这样他们就可以访问办公网络的IP啦。但是如果要想从办公网络访问服务器网络和负载均衡器网络,我们还需要动态地址(FloatingIP).”””引自[13]
Network 设备及拓扑

public_net: 192.168.10.224/28
lb_net:  192.168.40.0/24
server_net: 10.0.0.0/24
router: {
gateway: <from public_net>,
interface1: lb_net,
interface2: server_net
}
Router resource 要depends on public_net, lb_net以及server_net

根据以上信息:设置LB网络拓扑图模板network_topology.template如下,注意在这之前你可能需要清理网络拓扑环境,然后设置合适的br-ex配置(sudo ifconfig br-ex 192.168.10.225netmask 255.255.224.0 up),式能够访问public_net:

heat_template_version: 2013-05-23

description: >
    network topology deployment HOT template reference to
    http://www.ustack.com/blog/neutron_loadbalance/

parameters:
    public_net_name:
        type: string
        label: Public Network Name
        default: public_net
    lb_net_name:
        type: string
        label: Loadbalancer Network Name
        default: lb_net
    server_net_name:
        type: string
        label: Web Servers Network Name
        default: server_net
    public_subnet_name:
        type: string
        label: Public Subnet Name
        default: public_subnet
    public_subnet_cidr:
        type: string
        label: Public Subnet CIDR
        default: 192.168.10.224/28
    lb_subnet_name:
        type: string
        label: Loadbalancer Subnet Name
        default: lb_subnet
    lb_subnet_cidr:
        type: string
        label: Loadbalancer Subnet CIDR
        default: 192.168.40.0/24
    server_subnet_name:
        type: string
        label: Web Servers Subnet Name
        default: server_subnet
    server_subnet_cidr:
        type: string
        label: Web Servers Subnet CIDR
        default: 10.0.0.0/24
    router_name:
        type: string
        label: The Router Name
        default: router

outputs:
    lb_subnet_gateway:
        description: Loadbalancer Subnet Gateway
        value: {get_attr: [lb_subnet, gateway_ip]}
    lb_subnet_cidr:
        description: Loadbalancer Subnet CIDR
        value: {get_attr: [lb_subnet, cidr]}
    server_subnet_gateway:
        description: Web Servers Subnet Gateway
        value: {get_attr: [server_subnet, gateway_ip]}
    server_subnet_cidr:
        description: Web Servers Subnet CIDR
        value: {get_attr: [server_subnet, cidr]}


resources:
    public_net:
        type: OS::Neutron::Net
        properties:
            name: {get_param: public_net_name}
            shared: True
            value_specs: {"router:external": True}
    lb_net:
        type: OS::Neutron::Net
        properties:
            name: {get_param: lb_net_name}
    server_net:
        type: OS::Neutron::Net
        properties:
            name: {get_param: server_net_name}
    public_subnet:
        type: OS::Neutron::Subnet
        depends_on: public_net
        properties:
            name: {get_param: public_subnet_name}
            cidr: {get_param: public_subnet_cidr}
            network_id: {get_resource: public_net}
            enable_dhcp: False
    lb_subnet:
        type: OS::Neutron::Subnet
        depends_on: lb_net
        properties:
            name: {get_param: lb_subnet_name}
            cidr: {get_param: lb_subnet_cidr}
            network_id: {get_resource: lb_net}
    server_subnet:
        type: OS::Neutron::Subnet
        depends_on: server_net
        properties:
            name: {get_param: server_subnet_name}
            cidr: {get_param: server_subnet_cidr}
            network_id: {get_resource: server_net}
    router:
        type: OS::Neutron::Router
        depends_on: [public_net, public_subnet]
        properties:
            name: {get_param: router_name}
            external_gateway_info: {"network": {get_resource: public_net}}
    lb_interface:
        type: OS::Neutron::RouterInterface
        depends_on: [lb_subnet, router]
        properties:
            router_id: {get_resource: router}
            subnet_id: {get_resource: lb_subnet}
    server_interface:
        type: OS::Neutron::RouterInterface
        depends_on: [server_subnet, router]
        properties:
            router_id: {get_resource: router}
            subnet_id: {get_resource: server_subnet}

然后运行如下CLI命令,则自动生成相应的网络拓扑,省去不少命令行敲字,而且实验结束,直接heatstack-delete 掉即可。
#heat template-validate--template-file ./network_topology.template
#heat stack-create -f./network_topology.template lb-net-topology
网络拓扑用到的Resource资源如下:

OS::Neutron::Net: http://docs.openstack.org/developer/heat/template_guide/openstack.html#OS::Neutron::Net
OS::Neutron::Subnet:
http://docs.openstack.org/developer/heat/template_guide/openstack.html#OS::Neutron::Subnet
OS::Neutron::Router:
http://docs.openstack.org/developer/heat/template_guide/openstack.html#OS::Neutron::Router

接下来开始部署LB了, 主要有下面个资源:

Pool:
VIP:
Floating IP for VIP
HealthMonitor:
2 Pool Member instances (内部运行简单的web server):

根据以上信息设计LB模板如下:

heat_template_version: 2013-05-23

description: >
    LB service deployment HOT template reference to
    http://www.ustack.com/blog/neutron_loadbalance/

parameters:
    image_name:
        type: string   
        label: Image Name
        description: Image to be used for compute instance
        default: cirros-0.3.0-i386-uec
    instance_type:
        type: string
        label: Instance Type
        description: Type of instance (flavor) to be used
        default: m1.tiny
    health_monitor_type:
        type: string
        label: Type of HealthMonitor
        constraints:
            - allowed_values: [PING, TCP, HTTP, HTTPS]
        default: HTTP
    pool_name:
        type: string
        label: The Name of Pool
        default: pool
    lb_method:
        type: string
        label: The Algorithm used to distribute load between the memebers of pool
        constraints:
            - allowed_values: [ROUND_ROBIN, LEAST_CONNECTIONS, SOURCE_IP]
        default: ROUND_ROBIN
    pool_protocol:
        type: string
        label: Protocol for Pool Balancing
        constraints:
            - allowed_values: [HTTP, HTTPS, TCP]
        default: HTTP
    lb_subnet_id:
        type: string
        label: Loadbalancer Subnet uuid
    vip_name:
        type: string
        label: Name of VIP
        default: vip
    vip_address:
        type: string
        label: Address of VIP which must be within lb_subnet
    session_persistence_type:
        type: string
        label: Session Persistence Type
        constraints:
            - allowed_values: [SOURCE_IP, HTTP_COOKIE, APP_COOKIE]
        default: HTTP_COOKIE
    vip_protocol_port:
        type: number
        label: VIP protocol port
        default: 8080
    member_protocol_port:
        type: number
        label: Member protocol port
        default: 8080
    public_net_id:
        type: string
        label: Public Network uuid
    server_net_id:
        type: string
        label: Web Servers Network uuid


outputs:
    vip_floating_ip:
        description: FloatingIP of VIP
        value: {get_attr: [floatingip, floating_ip_address]}
    member1_ip_address:
        description: IP address of member1
        value: {get_attr: [member1, first_address]}
    member2_ip_address:
        description: IP address of member2
        value: {get_attr: [member2, first_address]}
    vip:
        description: VIP info
        value: {get_attr: [pool, vip]}
    lb_keypair_private_key:
        description: private key of KeyPair for 'ssh-add use'
        value: {get_attr: [lb_keypair, private_key]}


resources:
    lb_keypair:
        type: OS::Nova::KeyPair
        properties:
            name: lb_keypair
            save_private_key: True
    health_monitor:
        type: OS::Neutron::HealthMonitor
        properties:
            delay: 10
            expected_codes: "200"
            http_method: GET
            max_retries: 3
            timeout: 20
            type: {get_param: health_monitor_type}
            url_path: /
    pool:
        type: OS::Neutron:ool
        depends_on: health_monitor
        properties:
            admin_state_up: False
            name: {get_param: pool_name}
            lb_method: {get_param: lb_method}
            protocol: {get_param: pool_protocol}
            monitors: [{get_resource: health_monitor}]
            subnet_id: {get_param: lb_subnet_id}
            vip:
                session_persistence:
                    type: {get_param: session_persistence_type}
                name: {get_param: vip_name}
                address: {get_param: vip_address}
                protocol_port: {get_param: vip_protocol_port}
    member1:
        type: OS::Nova::Server
        properties:
            name: server1
            key_name: {get_resource: lb_keypair}
            image: {get_param: image_name}
            flavor: {get_param: instance_type}
            networks:
                - {network: {get_param: server_net_id}}
    member2:
        type: OS::Nova::Server
        properties:
            name: server2
            key_name: {get_resource: lb_keypair}
            image: {get_param: image_name}
            flavor: {get_param: instance_type}
            networks:
                - {network: {get_param: server_net_id}}
    pool_member1:
        type: OS::Neutron:oolMember
        depends_on: [pool, member1]
        properties:
            address: {get_attr: [member1, first_address]}
            pool_id: {get_resource: pool}
            protocol_port: {get_param: member_protocol_port}
            weight: 100
    pool_member2:
        type: OS::Neutron:oolMember
        depends_on: [pool, member2]
        properties:
            address: {get_attr: [member2, first_address]}
            pool_id: {get_resource: pool}
            protocol_port: {get_param: member_protocol_port}
            weight: 100
    floatingip:
        type: OS::Neutron::FloatingIP
        depends_on: pool
        properties:
            fixed_ip_address: {get_param: vip_address}
            floating_network_id: {get_param: public_net_id}
            port_id: {get_attr: [pool, vip, port_id]}

然后运行如下命令部署lb模板:
stack@vm:~/hot-files$  heat stack-create lbaas -f ./lbaas.template -P"public_net_id=842a7996-b8ca-4f75-8bfa-72d930780694;lb_subnet_id=f33b03a9-0f39-4c25-a9fa-94d63042f206;server_net_id=33c2e2db-121f-489e-bdc0-06d091472727;vip_address=192.168.40.3"
Note: 可能注意到了现在Poo的admin_state_up是False状态,这是由于LBaaS Haproxy的一个bug,如果不设置,会导致vip直接返回Error,导致Heat模板运行中断,所以暂时设置为False,等部署好后,再打开admin_state_up,打开后发现Member是INACTIVE状态的,因为现在member还没有开启web server,我用很多方法试图用String,template,以及get_file将user_data注入到VM中,但不知道为什么都失败了,所以你只能自己进到VM中启动一个简单的web服务器了,我的如下所示:

$ while true
> do
> echo -e 'HTTP/1.0 200 OK\r\n\r\n<serverX>' | nc -l -p 8080
> done

启动后就看到Member变为ACTIVE状态了。
拿到VIP的floatingIP,然后就可以测试LB的运行状态了,结果如下:


LB成功运行!

另外: Keypair的用法:你可以import a keypair,将你的操作console的public key引入,也可以像上面lb模板创建一个keypair,然后将lb_private_key保存到一个文件(lb_private_key.pem)中,然后给VM加一个floatingIP

#eval `ssh-agent`
#ssh-add lb_private_key.pem

然后你就可以通过ssh访问VM了,其他可以进noVNC界面对VM进行相关操作。
LB模板用到的resources有: OS::Nova::Server, OS::Nova::KeyPair, OS::Neutron:ool, OS::Neutron:oolMember, OS::Neutron::HealthMonitor, OS::Neutron::FloatingIP
VPNaaS模板未完待续。。。
FWaaS模板未完待续。。。
用到的不方便的地方
1.      Template查错功能有待提高,阐释不清楚或者错误张冠李戴
2.      没有类似于action-continue –force的功能,比如LBaaS创建的VIP状态返回error是由于haproxy内部的一个bug,这类人类可控的错误希望能够just 忽略掉然后继续运行。
3.      不知道为什么,用heat一直不能把user_data注入VM中
Link[1] Heat Wiki:https://wiki.openstack.org/wiki/Heat
[2] OpenStack G 版孵化项目heat介绍:http://blog.csdn.net/wangyish201201/article/details/8933581
[3] OpenStack Heat进阶:http://blog.csdn.net/lynn_kong/article/details/17195047
[4] OpenStack heat getting started guides: http://docs.openstack.org/developer/heat/getting_started/index.html
介绍安装heat的几种方法以及如何构建JEOS镜像(os with heat-cfntools package)
[5] *Heat 开发者文档:http://docs.openstack.org/developer/heat/
[6] Heat 术语表:http://docs.openstack.org/developer/heat/glossary.html
[7] *template Guide: http://docs.openstack.org/developer/heat/template_guide/index.html
[8] HOT template Guide: http://docs.openstack.org/developer/heat/template_guide/hot_guide.html
[9] *HOT template spec in detail: http://docs.openstack.org/developer/heat/template_guide/hot_spec.html
[10] Yaml: http://www.ibm.com/developerworks/cn/xml/x-1103linrr/
[11] My first OpenStack heat template: http://openstack.prov12n.com/my-first-openstack-heat-template/
[12] 龚永生:Neutron防火墙:http://www.ustack.com/blog/neutron-firewall/
[13] 龚永生: Neutron负载均衡:http://www.ustack.com/blog/neutron_loadbalance/
[14] CirrOS: https://www.eucalyptus.com/blog/2014/02/02/cirros-perfect-machine-image-eucalyptus-cloud-debugging

本文转载自:

蓝狐乐队
粉丝 107
博文 325
码字总数 94335
作品 0
昌平
程序员
私信 提问
Openstack Juno新版功能

openstack维持了六个月发布版本的周期。10月16日Openstack将发布Juno版本,包含几个新的项目以及大量新的特性。本文不做全面介绍,对新功能只是浅尝辄止。Nova作为Openstack的核心功能,Nov...

Inchin
2014/10/10
1K
0
[openstack]Kolla项目介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/halcyonbaby/article/details/44035653 声明: 本博客欢迎转发,但请保留原作者信息! 博客地址:http://blog...

寻觅神迹
2015/03/03
0
0
重启openstack的服务命令集合

实际生产环境是juno版本,参考了官网的文档《openstack-ops-manual》,文档上是先servcie stop,后start,挺麻烦的,直接restart,整理后的重启命令如下: 1 补充:rabbitmq服务状态查看命令...

mecisery
2017/11/02
735
0
OpenStack Heat 如何来实现和支持编排

OpenStack Heat 介绍 Heat 是一个基于模板来编排复合云应用的服务。 它目前支持亚马逊的 CloudFormation 模板格式,也支持 Heat 自有的 Hot 模板格式。模板的使用简化了复杂基础设施,服务和...

hNicholas
2018/10/15
0
0
OpenStack 的分页查询

Heat 在 Havana 版本首次成为正式模块,为 OpenStack 提供了令人兴奋的资源编排功能,但是和成熟项目相比,它缺失了某些小特性,比如不支持分页查询。随着用户的 instance、volume 和 stack ...

koala bear
2014/03/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ZhaoWei-2020-01-18

Redis官方文档 简介 Redis是开源的(BSD许可)内存数据结构存储,用作数据库,缓存和消息代理。它支持数据结构,例如 字符串,哈希,列表,集合,带范围查询的排序集合,位图,超日志,带有半...

SuSheePark
19分钟前
11
0
替换字符串C#中的换行符

如何在C#中替换字符串中的换行符? #1楼 由于新行可以用\\n , \\r和\\r\\n分隔,因此我们首先将\\r和\\r\\n替换为\\n ,然后才拆分数据字符串。 以下几行应转到parseCSV方法: function p...

javail
20分钟前
6
0
快递物流上门取件api接口对接指南(中通圆通申通韵达百世)

1.常用快递API 支持顺丰、EMS、申通、圆通、韵达、汇通、中通、天天、德邦、全峰等主流快递公司。 上门取件,是电商平台为寄件用户提供的通过一键下单到快递员,并在2小时上门取件的寄件服务...

程序的小猿
24分钟前
6
0
WebFlux系列(十一)WebClient 日志

#Java#Spring#WebClient#WebFlux#log#日志# WebClient 日志 视频讲解 : https://www.bilibili.com/video/av83627944/ WebfluxConsumerApplication.java package com.example.webfluxconsumer......

潘文海
27分钟前
6
0
使用LINQ来获取一个List <>中的项目,而不是另一个List <>中的项目

我会假设有一个简单的LINQ查询可以做到这一点,但我不确定该如何做。 给出这段代码: class Program{ static void Main(string[] args) { List<Person> peopleList1 = new...

技术盛宴
36分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部