Add lampstack terraform scripts for workload test
Change-Id: Ibc4529b5a0ba6f0069090233eb3e3002f4801b8f
This commit is contained in:
parent
4f524b4675
commit
78614de330
9
.gitignore
vendored
Executable file
9
.gitignore
vendored
Executable 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
162
terraform/lampstack/README.md
Executable 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
108
terraform/lampstack/lampstack.tf
Executable 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)}"
|
||||||
|
}
|
15
terraform/lampstack/onvm/app/index.php
Executable file
15
terraform/lampstack/onvm/app/index.php
Executable 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();
|
||||||
|
}
|
||||||
|
?>
|
19
terraform/lampstack/onvm/scripts/installapache.sh
Executable file
19
terraform/lampstack/onvm/scripts/installapache.sh
Executable 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
|
21
terraform/lampstack/onvm/scripts/installdb.sh
Executable file
21
terraform/lampstack/onvm/scripts/installdb.sh
Executable 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
|
34
terraform/lampstack/vars_lampstack.tf
Executable file
34
terraform/lampstack/vars_lampstack.tf
Executable 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"
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user