Managing Nginx vHost with Puppet

Ich beschäftige mich nun seit einiger Zeit mit puppet und bin auch fleissig am Module bauen. Als einer der nächsten Punkte nach allen Standard-System-Diensten war nun Nginx dran. Vorraussetzung für mich war hier, dass auch vHost relativ einfach abgebildet werden können. Nach etwas Bastelei, ein wenig Google und nachdenken war es mir dann gelungen. Hier also mein Ergebnis. Da ich größtenteils nur WordPress verwende ist meine Klasse und mein Template ein wenig daran angepasst, sollte sich aber leicht auch für andere Dinge adaptieren lassen ;)

Man definiert sich im seinem Modul, hier „nginx“, eine neue Klasse. In dieser legt man nun ein Define an. Also quasi eine abstrakte Kasse oder Funktion. Diese belegt man schon mit allen Werten vor, die später jede einzelne vHost-Datei haben soll. Ich benutze hier $title als Übergabe-Variable. siteName ist der vHostname innerhalb des Templates.


class nginx::wordpress{
define site {
$siteName = $title

file { "/etc/nginx/sites/$title.conf":
ensure => present,
owner => "root",
group => "root",
mode => 0644,
content => template("nginx/wordpress.erb"),
}
}

Nun noch ein Template erstellen. In diesem wird der eigentliche vHost definiert. Mit Extras wie Umleitung auf WWW und Sprechenden-URLs. siteName wird hier jeweils durch den von $title übergebenen Wert ersetzt.


server {
listen 80;

server_name <%= siteName %>
www.<%= siteName %>;

access_log /var/log/nginx/access.<%= siteName %>.log main;
error_log /var/log/nginx/error.<%= siteName %>.log warn;

root /usr/share/nginx/sites/<%= siteName %>;
index index.html index.php;

try_files $uri $uri/ /blog/index.php?q=$uri&$args;

if ($host != 'www.<%= siteName %>' ) {
rewrite ^/(.*)$ http://www.<%= siteName %>/$1 permanent;
}

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/sites/<%= siteName %>$fastcgi_script_name;
include fastcgi_params;
}
}

Und jetzt kann man z.B. in einer Konfigurationsklasse von Nginx einfach das Define aufrufen, ihm einen Hostnamen übergeben und da durch erhält man einen vHost. Hier muss dann vorab nur noch die oben erstellte klasse inkludiert werden.


nginx::wordpress::site {"zero0ne.de":}