217 lines
7.4 KiB
YAML
217 lines
7.4 KiB
YAML
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.
|