以下只是一个示例,描述LNMP使用puppet配置的大致方案,里面的用户名和密码不是真实数据。
LNMP主要包含nginx,mysql,php和网站(site,这里是blog)模块。文件结构如下:
├── manifests │ └── site.pp └── modules ├── blog │ ├── files │ │ └── wp-config.php │ ├── manifests │ │ └── init.pp │ └── templates │ └── nginx.conf.erb ├── mysql │ ├── files │ └── manifests │ └── init.pp ├── nginx │ ├── files │ └── manifests │ └── init.pp └── php ├── files └── manifests └── init.pp
顶层的site.pp如下:
node 'wheezy32' { include nginx include php # TODO change root password $mysql_root_password = 'foo' include mysql include blog }
nginx其实很简单,就是package+service。
class nginx { package { 'nginx': ensure => installed } service { 'nginx': ensure => running, require => Package['nginx'], } }
php也不难,这里仅安装了php5-fpm和php5-mysql。
class php { package { 'php5-fpm': ensure => present } service { 'php5-fpm': ensure => running, require => Package['php5-fpm'], } package { 'php5-mysql': ensure => present } }
mysql稍微复杂点,需要通过exec设置root password(参考这里),另外注意service的名字可能不是mysqld,而是mysql。mysql root password在site.pp中设定。
class mysql { package { 'mysql-server': ensure => installed } service { 'mysql': ensure => running, require => Package['mysql-server'], } exec { 'set-root-password': path => ['/bin', '/usr/bin'], unless => "mysqladmin -uroot -p$mysql_root_password status", command => "mysqladmin -uroot password $mysql_root_password", require => Service['mysql'], } package { 'mysql-client': ensure => installed } }
最后是最重要也是最复杂的网站设定,主要包括创建数据库,设置网站的nginx配置和复制wp-config.php(基于wordpress)。
class blog { $db_user = 'blog' $db_password = 'blog' $db_name = 'blog' $document_root = '/var/www/blog' $server_name = 'xnnyygn.in' exec { 'create-database': path => ['/bin', '/usr/bin'], unless => "mysql -u$db_user -p$db_password $db_name", command => "mysql -uroot -p$mysql_root_password -e \"create database ${db_name}; grant all on ${db_name}.* to ${db_user}@localhost identified by '${db_password}';\"", require => Service['mysql'], } file { '/etc/nginx/sites-enabled/default': content => template('blog/nginx.conf.erb'), notify => Service['nginx'], } file { "${document_root}/wp-config.php": source => 'puppet:///modules/blog/wp-config.php' } }
nginx.conf.erb的内容如下(/var/www/blog是wordpress的目录,全新的,未作任何修改):
server { listen 80; root <%= @document_root %>; server_name <%= @server_name %>; location / { index index.html index.htm index.php; } location ~ \.php$ { fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
wp_config.php基本上只改了数据库配置,这里就不放了。最后,执行puppet apply,一个网站瞬间就OK了,是不是很爽啊?