heat_template_version: 2015-10-15
description: add lbaas resource 
parameters:
  app_port:
    type: number
    default: 80
    description: Port used by the servers
  lb_port:
    type: number
    default: 80
    description: Port used by the load balancer
  image:
    type: string
    default: ubuntu
    description: Image used for servers
    constraints:
    - custom_constraint: glance.image
  flavor:
    type: string
    default: smile
    description: Flavor used for servers
    constraints:
    - custom_constraint: nova.flavor
  public_network:
    type: string
    default: c6bc83b9-1bde-4a8b-bfe5-090f98f89118
    description: Network used by the load balancer
    constraints:
    - custom_constraint: neutron.network
  networks:
    type: string
    default: 6bcf7324-99d9-4940-8c65-4a5312e8e864
    description: Network used by the servers
    constraints:
    - custom_constraint: neutron.network
  subnet:
    type: string
    default: 6041f625-224d-4111-8305-65730e6172a4
    description: Subnet on which the load balancer will be located
    constraints:
    - custom_constraint: neutron.subnet
resources:
  asg:
    type: OS::Heat::AutoScalingGroup
    properties:
      min_size: 1
      max_size: 5
      resource:
#        type: file:///root/hot/lbaasv2/lb_server.yaml
        type: lb_server.yaml
        properties:
          flavor: {get_param: flavor}
          image: {get_param: image}
          metadata: {"metering.stack": {get_param: "OS::stack_id"}}
          networks: {get_param: networks}
          subnet: {get_param: subnet}
          pool: {get_resource: pool}
          app_port: {get_param: app_port}
  scaleup:
    type: OS::Heat::ScalingPolicy
    properties:
      adjustment_type: change_in_capacity
      auto_scaling_group_id: {get_resource: asg}
      cooldown: 60
      scaling_adjustment: 1
  scaledown:
    type: OS::Heat::ScalingPolicy
    properties:
      adjustment_type: change_in_capacity
      auto_scaling_group_id: {get_resource: asg}
      cooldown: 60
      scaling_adjustment: -1
  cpu_alarm_high:
    type: OS::Ceilometer::Alarm
    properties:
      description: Scale-up if the average CPU > 50% for 1 minute
      meter_name: cpu_util
      statistic: avg
      period: 60
      evaluation_periods: 1
      threshold: 50
      alarm_actions:
        - {get_attr: [scaleup, alarm_url]}
      matching_metadata: {'metadata.user_metadata.stack': {get_param: "OS::stack_id"}}
      comparison_operator: gt
  cpu_alarm_low:
    type: OS::Ceilometer::Alarm
    properties:
      description: Scale-down if the average CPU < 15% for 10 minutes
      meter_name: cpu_util
      statistic: avg
      period: 60
      evaluation_periods: 1
      threshold: 15
      alarm_actions:
        - {get_attr: [scaledown, alarm_url]}
      matching_metadata: {'metadata.user_metadata.stack': {get_param: "OS::stack_id"}}
      comparison_operator: lt
  monitor:
    type: OS::Neutron::LBaaS::HealthMonitor
    properties:
      delay: 3
      type: HTTP
      timeout: 3
      max_retries: 3
      pool: { get_resource: pool }
  pool:
    type: OS::Neutron::LBaaS::Pool
    properties:
      lb_algorithm: ROUND_ROBIN
      protocol: HTTP
      listener: { get_resource: listener }
  listener:
    type: OS::Neutron::LBaaS::Listener
    properties:
      loadbalancer: { get_resource: loadbalancer }
      protocol: HTTP
      protocol_port: { get_param: lb_port }
  loadbalancer:
    type: OS::Neutron::LBaaS::LoadBalancer
    properties:
      vip_subnet: { get_param: subnet }
  floating_ip:
    type: OS::Neutron::FloatingIP
    properties:
      floating_network: { get_param: public_network }
      port_id: { get_attr: [loadbalancer, vip_port_id ]}
outputs:
  scale_up_url:
    description: >
      This URL is the webhook to scale up the autoscaling group.  You
      can invoke the scale-up operation by doing an HTTP POST to this
      URL; no body nor extra headers are needed.
    value: {get_attr: [scaleup, alarm_url]}
  scale_dn_url:
    description: >
      This URL is the webhook to scale down the autoscaling group.
      You can invoke the scale-down operation by doing an HTTP POST to
      this URL; no body nor extra headers are needed.
    value: {get_attr: [scaledown, alarm_url]}
  server_list:
    description: >
      List of server names that are part of the group.
    value: {get_attr: [asg, outputs_list, name]}
  lburl:
    description: URL of the loadbalancer
    value:
      str_replace:
        template: http://IP_ADDRESS:PORT
        params:
          IP_ADDRESS: { get_attr: [ floating_ip, floating_ip_address ] }
          PORT: { get_param: lb_port }
    description: >
      This URL is the "external" URL that can be used to access the
      load balancer.
# lb_server.yaml
heat_template_version: 2013-05-23
description: A Group of Load Balanced Servers
parameters:
  app_port:
    type: number
    description: Port used by the servers
  image:
    type: string
    description: Image used for servers
    constraints:
    - custom_constraint: glance.image
  flavor:
    type: string
    description: Flavor used for servers
    constraints:
    - custom_constraint: nova.flavor
  pool:
    type: string
    description: Pool to contact
  metadata:
    type: json
  networks:
    type: string
    description: Network used by the server
  subnet:
    type: string
    description: Subnet on which the load balancer will be located
    constraints:
    - custom_constraint: neutron.subnet
resources:
  server:
    type: OS::Nova::Server
    properties:
      flavor: {get_param: flavor}
      image: {get_param: image}
      metadata: {get_param: metadata}
      networks: [{network: {get_param: networks} }]
  pool_member:
    type: OS::Neutron::LBaaS::PoolMember
    properties:
      pool: { get_param: pool }
      address: { get_attr: [ server, first_address ]}
      protocol_port: { get_param: app_port }
      subnet: { get_param: subnet }
outputs:
  server_ip:
    description: IP Address of the load-balanced server.
    value: { get_attr: [server, first_address] }
  lb_member:
    description: LB member details.
    value: { get_attr: [pool_member, show] }
 - ½ºÅÃÀÌ »ý¼ºµÇ°í ¼¹ö Áõ°¨¼Ò ¾ÈµÇ´Â °æ¿ì°¡ °£È¤ ÀÖ´Ù.