Table of Contents

Project

By doing this project, you will learn how to automate the deployment of the WordPress application on the Amazon EC2 cloud using Cloudify.

Objective

Write a Cloudify blueprint for automating the installation of WordPress on the Amazon EC2 cloud. Perform the test on your Amazon EC2 account.

Instruction

The blueprint should be written based on this topology:

wordpress-cloudify.jpg
You may have a look at example blueprint from cloudify-nodecellar-example which we have used in the previous tutorial. The blueprint is based on TOSCA standard. You may have a look at this document.

Deliverable

  1. Your WordPress site generated from your blueprint.
  2. A post in your WordPress site that describes your blueprint in details.
  3. Put also some screenshots of your AWS Console manage on your WordPress site.

Email your ip address of your WordPress site to the instructors. walid.gaaloul@telecom-sudparis.eu

Hints

You can use the following script to associate with your topology:

  1. Apache installation:
    #!/bin/bash -e
     
    sudo apt-get update
    sudo apt-get -y install apache2
  2. PHP installation:
    #!/bin/bash -e
     
    sudo apt-get update
    sudo apt-get -y install php5 php5-mysql libapache2-mod-php5 php5-mcrypt
     
    sudo sed -i.bak "s/index.html index.cgi index.pl index.php/index.php index.html index.cgi/g" /etc/apache2/mods-enabled/dir.conf
    sudo service apache2 restart
  3. MySQL installation and WordPress database construction:
    #!/bin/bash -e
     
    sudo apt-get update
    sudo debconf-set-selections <<< 'mysql-server mysql-server/root_password password 123456'
    sudo debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password 123456'
    sudo apt-get -y install mysql-server
     
    sudo sed -i.bak "s/bind-address/#bind-address/g" /etc/mysql/my.cnf
    sudo service mysql restart
     
    Q1="CREATE DATABASE wordpress;"
    Q2="CREATE USER 'wordpressuser'@'localhost' IDENTIFIED BY 'password';"
    Q3="CREATE USER 'wordpressuser'@'%' IDENTIFIED BY 'password';"
    Q4="GRANT ALL ON *.* TO 'wordpressuser'@'localhost';"
    Q5="GRANT ALL ON *.* TO 'wordpressuser'@'%';"
    SQL="${Q1}${Q2}${Q3}${Q4}${Q5}"
     
    mysql -h localhost -uroot -p123456 -e "${SQL}"
  4. Wordpress installation:
    #!/bin/bash
     
    set -e
     
    function download() {
     
     url=$1
     name=$2
     
     if [ -f "`pwd`/${name}" ]; then
     ctx logger info "`pwd`/${name} already exists, No need to download"
     else
     # download to given directory
     ctx logger info "Downloading ${url} to `pwd`/${name}"
     
     set +e
     curl_cmd=$(which curl)
     wget_cmd=$(which wget)
     set -e
     
     if [[ ! -z ${curl_cmd} ]]; then
     curl -L -o ${name} ${url}
     elif [[ ! -z ${wget_cmd} ]]; then
     wget -O ${name} ${url}
     else
     ctx logger error "Failed to download ${url}: Neither 'cURL' nor 'wget' were found on the system"
     exit 1;
     fi
     fi
     
    }
     
     
    function untar() {
     
     tar_archive=$1
     destination=$2
     
     if [ ! -d ${destination} ]; then
     inner_name=$(tar -tf "${tar_archive}" | grep -o '^[^/]\+' | sort -u)
     ctx logger info "Untaring ${tar_archive}"
     tar -zxvf ${tar_archive}
     
     ctx logger info "Moving ${inner_name} to ${destination}"
     mv ${inner_name} ${destination}
     fi
    }
     
    TEMP_DIR='/tmp'
    WORDPRESS_TARBALL_NAME='latest.tar.gz'
     
    WORDPRESS_ROOT_PATH=${TEMP_DIR}/$(ctx execution-id)/wordpress
    WORDPRESS_PATH=~/wordpress
    mkdir -p ${WORDPRESS_ROOT_PATH}
     
    cd ${TEMP_DIR}
    download http://wordpress.org/${WORDPRESS_TARBALL_NAME} ${WORDPRESS_TARBALL_NAME}
    untar ${WORDPRESS_TARBALL_NAME} ${WORDPRESS_PATH}
     
    cp ~/wordpress/wp-config-sample.php ~/wordpress/wp-config.php
    sudo rsync -avP ~/wordpress/ /var/www/html/
    cd /var/www/html
    sudo chown -R www-data:www-data *
     
    sudo mkdir /var/www/html/wp-content/uploads
    sudo chown -R www-data:www-data /var/www/html/wp-content/uploads
     
    export MONGO_HOST=$(ctx instance runtime_properties mysql_ip_address)
     
    #replace default database setting with your setting
    sed -i.bak "s/define('DB_HOST', 'localhost');/define('DB_HOST', '${MYSQL_HOST}');/g" /var/www/html/wp-config.php
    sed -i.bak "s/database_name_here/wordpress/g" /var/www/html/wp-config.php
    sed -i.bak "s/username_here/wordpressuser/g" /var/www/html/wp-config.php
    sed -i.bak "s/password_here/password/g" /var/www/html/wp-config.php
  5. Transfering WordPress files to Ubuntu 14.04 LAMP:
    #!/bin/bash -e
     
    cd ~/wordpress
    sudo rsync -avP ~/wordpress/ /var/www/html/
    cd /var/www/html
    sudo chown -R www-data:www-data *
     
    sudo mkdir /var/www/html/wp-content/uploads
    sudo chown -R www-data:www-data /var/www/html/wp-content/uploads

Deliverable

When you want to uninstall your deployment but it’s not possible because there is a running task. Use the following commands:

# to see all events
$ cfy executions list -d wordpress
 
# cancel the event
$ cfy executions cancel -e YOUR_EVENT_ID

After that, you can uninstall your deployment and remove your deployment and blueprint:

cfy executions start -w uninstall -d wordpress --force
cfy deployments delete -d wordpress
cfy blueprints delete -b wordpress