/autoscaling_example.yaml
YAML | 216 lines | 208 code | 4 blank | 4 comment | 0 complexity | ed3babe1efc2aa919fada4aa4101dbc7 MD5 | raw file
- heat_template_version: 2013-05-23
- description: AutoScaling Wordpress
- parameters:
- image:
- type: string
- description: Image used for servers
- key:
- type: string
- description: SSH key to connect to the servers
- flavor:
- type: string
- description: flavor used by the web servers
- database_flavor:
- type: string
- description: flavor used by the db server
- network:
- type: string
- description: Network used by the server
- subnet_id:
- type: string
- description: subnet on which the load balancer will be located
- database_name:
- type: string
- description: Name of the wordpress DB
- default: wordpress
- database_user:
- type: string
- description: Name of the wordpress user
- default: wordpress
- external_network_id:
- type: string
- description: UUID of a Neutron external network
- resources:
- database_password:
- type: OS::Heat::RandomString
- database_root_password:
- type: OS::Heat::RandomString
- db:
- type: OS::Nova::Server
- properties:
- flavor: {get_param: database_flavor}
- image: {get_param: image}
- key_name: {get_param: key}
- networks: [{network: {get_param: network} }]
- user_data_format: RAW
- user_data:
- str_replace:
- template: |
- #!/bin/bash -v
- yum -y install mariadb mariadb-server
- systemctl enable mariadb.service
- systemctl start mariadb.service
- mysqladmin -u root password $db_rootpassword
- cat << EOF | mysql -u root --password=$db_rootpassword
- CREATE DATABASE $db_name;
- GRANT ALL PRIVILEGES ON $db_name.* TO "$db_user"@"%"
- IDENTIFIED BY "$db_password";
- FLUSH PRIVILEGES;
- EXIT
- EOF
- params:
- $db_rootpassword: {get_attr: [database_root_password, value]}
- $db_name: {get_param: database_name}
- $db_user: {get_param: database_user}
- $db_password: {get_attr: [database_password, value]}
- asg:
- type: OS::Heat::AutoScalingGroup
- properties:
- min_size: 1
- max_size: 3
- resource:
- type: lb_server.yaml
- properties:
- flavor: {get_param: flavor}
- image: {get_param: image}
- key_name: {get_param: key}
- network: {get_param: network}
- pool_id: {get_resource: pool}
- metadata: {"metering.stack": {get_param: "OS::stack_id"}}
- user_data:
- str_replace:
- template: |
- #!/bin/bash -v
- yum -y install httpd wordpress
- systemctl enable httpd.service
- systemctl start httpd.service
- setsebool -P httpd_can_network_connect_db=1
- sed -i "/Deny from All/d" /etc/httpd/conf.d/wordpress.conf
- sed -i "s/Require local/Require all granted/" /etc/httpd/conf.d/wordpress.conf
- sed -i s/database_name_here/$db_name/ /etc/wordpress/wp-config.php
- sed -i s/username_here/$db_user/ /etc/wordpress/wp-config.php
- sed -i s/password_here/$db_password/ /etc/wordpress/wp-config.php
- sed -i s/localhost/$db_host/ /etc/wordpress/wp-config.php
- systemctl restart httpd.service
- params:
- $db_name: {get_param: database_name}
- $db_user: {get_param: database_user}
- $db_password: {get_attr: [database_password, value]}
- $db_host: {get_attr: [db, first_address]}
- web_server_scaleup_policy:
- type: OS::Heat::ScalingPolicy
- properties:
- adjustment_type: change_in_capacity
- auto_scaling_group_id: {get_resource: asg}
- cooldown: 60
- scaling_adjustment: 1
- web_server_scaledown_policy:
- 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: [web_server_scaleup_policy, 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: 600
- evaluation_periods: 1
- threshold: 15
- alarm_actions:
- - {get_attr: [web_server_scaledown_policy, alarm_url]}
- matching_metadata: {'metadata.user_metadata.stack': {get_param: "OS::stack_id"}}
- comparison_operator: lt
- monitor:
- type: OS::Neutron::HealthMonitor
- properties:
- type: TCP
- delay: 5
- max_retries: 5
- timeout: 5
- pool:
- type: OS::Neutron::Pool
- properties:
- protocol: HTTP
- monitors: [{get_resource: monitor}]
- subnet_id: {get_param: subnet_id}
- lb_method: ROUND_ROBIN
- vip:
- protocol_port: 80
- lb:
- type: OS::Neutron::LoadBalancer
- properties:
- protocol_port: 80
- pool_id: {get_resource: pool}
- # assign a floating ip address to the load balancer
- # pool.
- lb_floating:
- type: OS::Neutron::FloatingIP
- properties:
- floating_network_id: {get_param: external_network_id}
- port_id: {get_attr: [pool, 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: [web_server_scaleup_policy, 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: [web_server_scaledown_policy, alarm_url]}
- pool_ip_address:
- value: {get_attr: [pool, vip, address]}
- description: The IP address of the load balancing pool
- website_url:
- value:
- str_replace:
- template: http://host/wordpress/
- params:
- host: { get_attr: [lb_floating, floating_ip_address] }
- description: >
- This URL is the "external" URL that can be used to access the
- Wordpress site.
- ceilometer_query:
- value:
- str_replace:
- template: >
- ceilometer statistics -m cpu_util
- -q metadata.user_metadata.stack=stackval -p 600 -a avg
- params:
- stackval: { get_param: "OS::stack_id" }
- description: >
- This is a Ceilometer query for statistics on the cpu_util meter
- Samples about OS::Nova::Server instances in this stack. The -q
- parameter selects Samples according to the subject's metadata.
- When a VM's metadata includes an item of the form metering.X=Y,
- the corresponding Ceilometer resource has a metadata item of the
- form user_metadata.X=Y and samples about resources so tagged can
- be queried with a Ceilometer query term of the form
- metadata.user_metadata.X=Y. In this case the nested stacks give
- their VMs metadata that is passed as a nested stack parameter,
- and this stack passes a metadata of the form metering.stack=Y,
- where Y is this stack's ID.