heat_template_version: 2013-05-23 description: AutoScaling Wordpress parameters: image: type: string description: Image used for servers default: 7f4bdc18-cb48-46b5-8d9c-6cabaa4270d6 key: type: string description: SSH key to connect to the servers default: mykey flavor: type: string description: flavor used by the web servers default: m1.small database_flavor: type: string description: flavor used by the db server default: m1.small subnet_id: type: string description: subnet on which the load balancer will be located default: 99baadc0-a4c5-4141-b201-aba51e6ac586 database_name: type: string description: Name of the wordpress DB default: wordpress database_user: type: string description: Name of the wordpress user default: wordpress public_net_id: type: string description: > ID of public network for which floating IP addresses will be allocated default: 3a72a0a0-156a-4650-934b-13f29587969a private_net_id: type: string description: ID of private network into which servers get deployed default: 1e2e0ea5-3f85-435a-af8d-93f377d52560 resources: database_password: type: OS::Heat::RandomString database_root_password: type: OS::Heat::RandomString db: type: OS::Nova::Server properties: name: Server1 image: { get_param: image } flavor: { get_param: flavor } key_name: { get_param: key } networks: - port: { get_resource: server1_port } user_data_format: RAW config_drive: "true" 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]} web_server_group: type: OS::Heat::AutoScalingGroup properties: min_size: 1 max_size: 3 resource: type: My::lb::Server properties: flavor: {get_param: flavor} image: {get_param: image} key_name: {get_param: key} 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: web_server_group} 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: web_server_group} 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} server1_port: type: OS::Neutron::Port properties: network_id: { get_param: private_net_id } fixed_ips: - subnet_id: { get_param: subnet_id } security_groups: [{ get_resource: server_security_group }] server1_floating_ip: type: OS::Neutron::FloatingIP properties: floating_network_id: { get_param: public_net_id } port_id: { get_resource: server1_port } server_security_group: type: OS::Neutron::SecurityGroup properties: description: Add security group rules for server name: security-group rules: - remote_ip_prefix: 0.0.0.0/0 protocol: tcp port_range_min: 22 port_range_max: 22 - remote_ip_prefix: 0.0.0.0/0 protocol: icmp outputs: server1_private_ip: description: IP address of server1 in private network value: { get_attr: [ server1, first_address ] } server1_public_ip: description: Floating IP address of server1 in public network value: { get_attr: [ server1_floating_ip, floating_ip_address ] } 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 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.