Setting up EC2 for Drupal with Puppet
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', 'php-mysql', 'php-xml', 'php-gd', 'php-mbstring']:
ensure => 'present',
require => Package['php'],
}
}
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.