Add lampstack terraform scripts for workload test

Change-Id: Ibc4529b5a0ba6f0069090233eb3e3002f4801b8f
This commit is contained in:
Tong Li 2016-08-06 10:04:09 -04:00
parent 4f524b4675
commit 78614de330
7 changed files with 368 additions and 0 deletions

9
.gitignore vendored Executable file
View File

@ -0,0 +1,9 @@
/onvm/conf/nodes.conf.yml
/onvm/conf/ids.conf.yml
/onvm/conf/hosts
/onvm/lampstack/openrc
*.out
*/**/*.log
*/**/.DS_Store
*/**/._
*/**/*.tfstate*

162
terraform/lampstack/README.md Executable file
View File

@ -0,0 +1,162 @@
# LAMPstack Terraform deployments
## Status
This will install a 3 node lampstack by defulat. Two nodes will be used as
web servers and one node will be used as database node.
Once the script finishes, a set of URL will be displayed at the end for
verification.
## Requirements
- [Install Terraform](https://www.terraform.io/intro/getting-started/install.html)
- Make sure there is an Ubuntu image available on your cloud.
## Terraform
Terraform will be used to provision all of the OpenStack resources required to
LAMP stack and all required software.
### Prep
#### Deal with ssh keys for Openstack Authentication
Ensure your local ssh-agent is running and your ssh key has been added.
This step is required by the terraform provisioner. Otherwise, you will have
to use a key pair without passphrase.
```
eval $(ssh-agent -s)
ssh-add ~/.ssh/id_rsa
```
#### General Openstack Settings
Terraform OpenStack provider requires few environment variables to be set
before you can run the scripts. In general, you can simply export OS
environment varialbes like the following:
```
export OS_REGION_NAME=RegionOne
export OS_PROJECT_NAME=demo
export OS_IDENTITY_API_VERSION=3
export OS_PASSWORD=secret
export OS_DOMAIN_NAME=default
export OS_USERNAME=demo
export OS_TENANT_NAME=demo
export OS_PROJECT_DOMAIN_NAME=default
export OS_AUTH_URL=http://9.30.217.9:5000/v3
```
The values of these variables should be provided by your cloud provider. When
use keystone 2.0 API, you will not need to setup domain name.
#### LAMP Stack Settings
You most likely will need to specify the name of your Ubuntu `glance` image,
flavor, lamp stack size (how many nodes in the stack), private and public
network names, and keys. Here is the list of the default values defined in file
vars_lampstack.tf.
```
image_name = "ubuntu-14.04"
private_net = "internal"
public_net = "external"
flavor = "m1.medium"
public_key_path = "~/.ssh/id_rsa.pub"
stack_size = 3
db_username = dbuser
db_password = dbpass
```
You can change the settings in the file or you can simply set in environment
variables like the following:
```
export TF_VAR_image_name="trusty 1404"
export TF_VAR_private_net=Bluebox
export TF_VAR_public_net=internet
export TF_VAR_flavor="m1.small"
export TF_VAR_public_key_path="~/.ssh/id_rsa.pub"
export TF_VAR_stack_size=5
export TF_VAR_db_username=george
export TF_VAR_db_password=secret
```
## Provision the LAMP stack
With all your OpenStack and TF vars set, you should be able to run
`terraform apply`. But lets check with `terraform plan` that things look
correct first:
```
$ terraform plan
Refreshing Terraform state prior to plan...
...
...
+ openstack_networking_floatingip_v2.database
address: "<computed>"
fixed_ip: "<computed>"
pool: "internet"
port_id: "<computed>"
region: "RegionOne"
tenant_id: "<computed>"
Plan: 8 to add, 0 to change, 0 to destroy.
```
If there is no errors showing, we can go ahead and run
```
$ terraform apply
...
...
Outputs:
lampstack = Success!!!
Access service at the following URLs:
http://99.30.217.44
http://99.30.217.42
```
The above results show that the LAMP Stack actually provisioned correctly
and the LAMP application is up running and can be accessed by either of the
urls.
## Next Steps
### Check its up
Use the access urls to access the application. Since there are multiple web
server nodes, any of the urls should work.
```
$ curl http://99.30.217.44
$ curl http://99.30.217.42
```
## Cleanup
Once you're done with it, don't forget to nuke the whole thing.
```
$ terraform destroy \
Do you really want to destroy?
Terraform will delete all your managed infrastructure.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes
...
...
Apply complete! Resources: 0 added, 0 changed, 8 destroyed.
```

108
terraform/lampstack/lampstack.tf Executable file
View File

@ -0,0 +1,108 @@
# The terraform to stand up LAMP stack
resource "openstack_compute_keypair_v2" "lampstack_key" {
name = "lampstack_key"
public_key = "${file(var.public_key_path)}"
}
resource "openstack_compute_secgroup_v2" "lampstack_sg" {
name = "lampstack_sg"
description = "lampstack security group"
rule {
from_port = 22
to_port = 22
ip_protocol = "tcp"
cidr = "0.0.0.0/0"
}
rule {
from_port = 80
to_port = 80
ip_protocol = "tcp"
cidr = "0.0.0.0/0"
}
rule {
from_port = 3306
to_port = 3306
ip_protocol = "tcp"
cidr = "0.0.0.0/0"
}
}
resource "openstack_networking_floatingip_v2" "database" {
count = 1
pool = "${var.public_net}"
}
resource "openstack_compute_instance_v2" "database" {
name = "database"
image_name = "${var.image_name}"
flavor_name = "${var.flavor}"
key_pair = "lampstack_key"
security_groups = ["${openstack_compute_secgroup_v2.lampstack_sg.name}"]
network {
name = "${var.private_net}"
}
floating_ip = "${openstack_networking_floatingip_v2.database.0.address}"
connection {
user = "ubuntu"
timeout = "30s"
}
provisioner "file" {
source = "onvm"
destination = "/tmp/onvm"
}
provisioner "remote-exec" {
inline = [
"echo ${self.network.0.fixed_ip_v4} database > /tmp/onvm/hostname",
"chmod +x /tmp/onvm/scripts/*",
"/tmp/onvm/scripts/installdb.sh ${var.db_username} ${var.db_password}"
]
}
}
resource "openstack_networking_floatingip_v2" "apache" {
count = "${var.stack_size - 1}"
pool = "${var.public_net}"
}
resource "openstack_compute_instance_v2" "apache" {
name = "apache_${count.index}"
count = "${var.stack_size - 1}"
image_name = "${var.image_name}"
flavor_name = "${var.flavor}"
key_pair = "lampstack_key"
security_groups = ["${openstack_compute_secgroup_v2.lampstack_sg.name}"]
network {
name = "${var.private_net}"
}
floating_ip = "${element(openstack_networking_floatingip_v2.apache.*.address, count.index)}"
depends_on = [ "openstack_compute_instance_v2.database" ]
connection {
user = "ubuntu"
timeout = "30s"
}
provisioner "file" {
source = "onvm"
destination = "/tmp/onvm"
}
provisioner "remote-exec" {
inline = [
"echo ${openstack_compute_instance_v2.database.network.0.fixed_ip_v4} database > /tmp/onvm/hostname",
"echo ${self.network.0.fixed_ip_v4} apache-${count.index} >> /tmp/onvm/hostname",
"chmod +x /tmp/onvm/scripts/*",
"/tmp/onvm/scripts/installapache.sh ${var.db_username} ${var.db_password}"
]
}
}
output "lampstack" {
value = "Success!!!\n\nAccess service at the following URLs:\nhttp://${join("\nhttp://",openstack_compute_instance_v2.apache.*.floating_ip)}"
}

View File

@ -0,0 +1,15 @@
<?php
$servername = "database";
$username = "TTTFFFdbuser";
$password = "TTTFFFdbpass";
$dbname = "decision2016";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
}
catch(PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
?>

View File

@ -0,0 +1,19 @@
#!/usr/bin/env bash
# $1 db_username
# $2 db_password
cat /tmp/onvm/hostname | sudo tee -a /etc/hosts >/dev/null
echo 'Installing apache2 and php 5...'
sudo apt-get -qqy update
sudo apt-get -qqy install apache2 php5 php5-mysql
echo 'ServerName localhost' | sudo tee -a /etc/apache2/apache2.conf >/dev/null
sudo mv /tmp/onvm/app/* /var/www/html
sudo chown -R www-data:www-data /var/www/html
sudo rm -r -f /var/www/html/index.html
cmdStr=$(echo "s/TTTFFFdbuser/$1/g")
sudo sed -i -e "${cmdStr}" /var/www/html/index.php
cmdStr=$(echo "s/TTTFFFdbpass/$2/g")
sudo sed -i -e "${cmdStr}" /var/www/html/index.php

View File

@ -0,0 +1,21 @@
#!/usr/bin/env bash
# $1 db_username
# $2 db_password
cat /tmp/onvm/hostname | sudo tee -a /etc/hosts >/dev/null
pw=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 10 | head -n 1)
sudo apt-get -qqy update
sudo debconf-set-selections <<< "mysql-server mysql-server/root_password password $pw"
sudo debconf-set-selections <<< "mysql-server mysql-server/root_password_again password $pw"
sudo apt-get -qqy install mysql-server
echo 'Creating a database...'
mysql -uroot -p$pw -e "CREATE DATABASE decision2016;"
mysql -uroot -p$pw -e "use decision2016; GRANT ALL PRIVILEGES ON decision2016.* TO '$1'@'localhost' IDENTIFIED BY '$2';"
mysql -uroot -p$pw -e "use decision2016; GRANT ALL PRIVILEGES ON decision2016.* TO '$1'@'%' IDENTIFIED BY '$2';"
mysql -uroot -p$pw -e "flush privileges"
cmdStr=$(echo 's/127.0.0.1/database/g')
sudo sed -i -e "${cmdStr}" /etc/mysql/my.cnf
sudo service mysql restart

View File

@ -0,0 +1,34 @@
variable "image_name" {
default = "ubuntu-14.04"
}
variable "private_net" {
default = "internal"
}
variable "public_net" {
default = "external"
}
variable "flavor" {
default = "m1.medium"
}
variable "public_key_path" {
description = "The path of the ssh pub key"
default = "~/.ssh/id_rsa.pub"
}
variable "stack_size" {
default = 3
}
variable "db_username" {
description = "The lamp stack database user for remote access"
default = "dbuser"
}
variable "db_password" {
description = "The lamp stack database user password for remote access"
default = "dbpass"
}