DevOps Zone is brought to you in partnership with:

Matthew Turland began working with PHP in 2002 and has since gone on to author php|architect's "Web Scraping with PHP," co-author SitePoint's "PHP Master: Write Cutting-Edge Code," and speak at a number of PHP conferences. In his spare time, he leads development on the Phergie project and serves as an organizer for the Acadiana Open Source Group. Matthew is a DZone MVB and is not an employee of DZone and has posted 15 posts at DZone. You can read more from them at their website. View Full User Profile

Running Drupal on Amazon EC2 LAMP Config with Serverless Puppet

02.14.2012
| 6710 views |
  • submit to reddit

I’m currently working on a project that involves running Drupal on Amazon EC2. To save time in setting up future new VM instances, I decided to take the opportunity to learn puppet. For the time being, I’m using a single VM to run the full LAMP stack and running puppet without a server by copying my puppet manifest to the VM and using puppet’s apply command to apply it locally. However, this manifest can easily be adapted for a multi-VM environment. After some tinkering, I came up with the code below.

class web {
    package { 'httpd':
        ensure => 'present',
    }
 
    package { 'php':
        ensure => 'present',
    }
 
    # Update this to use your respective time zone value
    exec { 'php_config':
        command => '/bin/sed -i "s/^;date.timezone =/date.timezone = \'America\/Chicago\'/g" /etc/php.ini',
        require => Package['php'],
    }
 
    service { 'httpd':
        ensure => 'running',
        enable => true,
        hasrestart => true,
        hasstatus => true,
        subscribe => Package['httpd', 'php'],
    }
 
    # Drupal requirements start here
 
    package { 'php-pdo':
        ensure => 'present',
        require => Package['php'],
    }
 
    package { 'php-mysql':
        ensure => 'present',
        require => Package['php'],
    }
 
    package { 'php-xml':
        ensure => 'present',
        require => Package['php'],
    }
 
    package { 'php-gd':
        ensure => 'present',
        require => Package['php'],
    }
 
    package { 'php-mbstring':
        ensure => 'present',
        require => Package['php'],
    }
 
    # Drupal requirements end here
}
 
class mysql {
    package { 'mysql-server':
        ensure => 'present',
    }
 
    service { 'mysqld':
        ensure => 'running',
        enable => true,
        hasrestart => true,
        hasstatus => true,
        subscribe => Package['mysql-server'],
    }
 
    # Equivalent to /usr/bin/mysql_secure_installation without providing or setting a password
    exec { 'mysql_secure_installation':
        command => '/usr/bin/mysql -uroot -e "DELETE FROM mysql.user WHERE User=\'\'; DELETE FROM mysql.user WHERE User=\'root\' AND Host NOT IN (\'localhost\', \'127.0.0.1\', \'::1\'); DROP DATABASE IF EXISTS test; FLUSH PRIVILEGES;" mysql',
        require => Service['mysqld'],
    }
}
 
class {'web': }
class {'mysql': }

With this code saved to a file called manifest.pp (.pp being the file extension for puppet manifests), I can spin up a VM and do the following to set it up:

scp -i key.pem manifest.pp ec2-user@host:~/
ssh -i key.pem ec2-user@host
sudo yum upgrade -y
sudo yum install -y puppet
sudo puppet apply manifest.pp
rm -f manifest.pp
exit

At this point, I have a basic Apache/MySQL/PHP configuration capable of receiving a Drupal 7 installation.

Source:  http://matthewturland.com/2012/02/13/setting-up-ec2-for-drupal-with-puppet/

Published at DZone with permission of Matthew Turland, author and DZone MVB.

(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)

Comments

Yaron Levy replied on Sun, 2012/06/10 - 10:35am

This mostly works, but beware if you add complexity and do not want to only manage your php and webserver. Go out of your way to find providers that work (i.e. nginx{“whatever”: “docroot” =>”/srv/www” } or puppet will bite you with dependency hell :)

We’ve been using it for a year now to manage around 20 servers in dev, staging and production and this was the major thing that annoyed us. Reusing code can be a bit of a hassle if you start wrong.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.