292034bbe654143c524ada05506b1723773b828e
[puppet] / manifests / init.pp
1 class puppet {
2
3     @package { [
4             "puppet",
5             "puppet-server",
6             "ruby-mysql",
7             "ruby-RRDtool",
8             "rubygem-mongrel",
9             "rubygem-rails"
10         ]:
11         ensure => installed
12     }
13
14     @service { "puppet":
15         enable => true,
16         ensure => running,
17         require => Package["puppet"]
18     }
19
20     @service { "puppetmaster":
21         enable => true,
22         ensure => running,
23         require => Package["puppet-server"]
24     }
25
26     @file {[
27             "/etc/puppet/puppet.conf",
28             "/etc/sysconfig/puppet"
29         ]:
30         owner => "root",
31         group => "root",
32         mode => 644,
33         notify => Service["puppet"],
34         require => Package["puppet"]
35     }
36
37     @file { "/usr/local/sbin/run_puppet":
38         owner => "root",
39         group => "wheel",
40         mode => 750,
41         source => [
42             "puppet://$server/private/$environment/puppet/run_puppet",
43             "puppet://$server/modules/files/puppet/run_puppet",
44             "puppet://$server/modules/puppet/run_puppet"
45         ]
46     }
47
48     # Ensure that the manifest directory for default environment production
49     # is defined. This will be realized in puppet::server.
50     #
51     # Do the same for the modules directory.
52
53     @file { [
54             "/var/lib/puppet/modules/",
55             "/var/lib/puppet/modules/production/"
56         ]:
57         ensure => directory
58     }
59
60     include $os
61
62     class centos inherits puppet {
63     }
64
65     class debian inherits puppet {
66         File["/etc/sysconfig/puppet"] {
67             path => "/etc/default/puppet"
68         }
69
70         # Debian and derivatives have no "wheel" group :/
71         File["/usr/local/sbin/run_puppet"] {
72             group => "root"
73         }
74
75         Package["puppet-server"] {
76             name => "puppetmaster"
77         }
78
79         Service["puppet"] {
80             hasstatus => false
81         }
82     }
83
84     class fedora inherits puppet {
85     }
86
87     class opensuse inherits puppet {
88     }
89
90     class ubuntu inherits debian {
91     }
92
93     class redhat inherits puppet {
94     }
95
96     class suse inherits puppet {
97     }
98
99     class client inherits puppet {
100         realize(
101             File["/usr/local/sbin/run_puppet"],
102             Package["puppet"],
103             Service["puppet"]
104         )
105
106         cron { "puppet_service":
107             command => "/usr/bin/pgrep -x puppetd > /dev/null || /sbin/service puppet restart > /dev/null 2>&1",
108             user => "root",
109             minute => "0",
110             hour => [ 0,4,8,12,16,20 ]
111         }
112
113         $puppet_type = "client"
114         $puppet_storeconfigs = "none"
115
116         debug("Current value of puppet_storeconfigs_mysql_password = $puppet_storeconfigs_mysql_password")
117
118         # We may need this to ensure proper downwards inheritance towards subclasses
119         $real_puppet_extra_output = $puppet_extra_output ? {
120             '' => "false",
121             default => $puppet_extra_output
122         }
123
124         File["/etc/puppet/puppet.conf"] {
125             content => template('puppet/puppet.conf.erb')
126         }
127
128         File["/etc/sysconfig/puppet"] {
129             content => template('puppet/puppet.sysconfig.erb')
130         }
131
132         realize(
133             File["/etc/puppet/puppet.conf"],
134             File["/etc/sysconfig/puppet"]
135         )
136     }
137
138     class server inherits client {
139         include git::client
140         include webserver
141
142         realize(
143             File["/var/lib/puppet/modules/"],
144             File["/var/lib/puppet/modules/production/"],
145             Package["puppet-server"],
146             Package["ruby-RRDtool"],
147             Package["rubygem-mongrel"],
148             Service["puppetmaster"]
149         )
150
151         webserver::module::enable { [
152                 "mod_ssl"
153             ]:
154         }
155
156         webserver::virtualhost { "$fqdn":
157             certificate => false
158         }
159
160         $puppet_type = "server"
161         $puppet_storeconfigs = "none"
162
163         $real_environments = $environments ? {
164             '' => [ "production", "testing", "development" ],
165             default => $environments
166         }
167
168         debug("Current value of puppet_storeconfigs_mysql_password = $puppet_storeconfigs_mysql_password")
169
170         # We may need this to ensure proper downwards inheritance towards subclasses
171         $real_puppet_extra_output = $puppet_extra_output ? {
172             '' => "false",
173             default => $puppet_extra_output
174         }
175
176         File["/etc/puppet/puppet.conf"] {
177             content => template('puppet/puppet.conf.erb'),
178             notify +> Service["puppetmaster"],
179             require +> Package["puppet-server"]
180         }
181
182         realize(
183             File["/etc/puppet/puppet.conf"]
184         )
185
186         environment_manifests { [
187                 "development",
188                 "testing",
189                 "production"
190             ]:
191         }
192
193         define environment_manifests() {
194
195             if defined(File["/var/lib/puppet/manifests/"]) {
196                 realize(File["/var/lib/puppet/manifests/"])
197             } else {
198                 @file { "/var/lib/puppet/manifests/":
199                     ensure => directory
200                 }
201                 realize(File["/var/lib/puppet/manifests/"])
202             }
203
204             file { "/var/lib/puppet/manifests/$name/site.pp":
205                 owner => "root",
206                 group => "root",
207                 mode => 644,
208                 source => [
209                     "puppet://$server/private/$name/puppet/site.pp",
210                     "puppet://$server/modules/$name/puppet/files/site.pp"
211                 ],
212                 require => File["/var/lib/puppet/manifests/$name/"],
213                 notify => Service["puppetmaster"]
214             }
215
216             file { "/var/lib/puppet/manifests/$name/":
217                 owner => "root",
218                 group => "root",
219                 source => [
220                     "puppet://$server/private/$name/puppet/manifests/"
221                 ],
222                 recurse => true,
223                 purge => true
224             }
225         }
226
227         define environment_modules() {
228
229             if defined(File["/var/lib/puppet/modules/"]) {
230                 realize(File["/var/lib/puppet/modules/"])
231             } else {
232                 @file { "/var/lib/puppet/modules/":
233                     ensure => directory
234                 }
235                 realize(File["/var/lib/puppet/modules/"])
236             }
237
238             file { "/var/lib/puppet/modules/$name/":
239                 owner => "root",
240                 group => "root",
241                 mode => 755,
242                 recurse => true,
243                 purge => true
244             }
245         }
246
247         file { "/etc/puppet/fileserver.conf":
248             owner => "root",
249             group => "root",
250             mode => 644,
251             source => [
252                 "puppet://$server/private/$environment/puppet/fileserver.conf",
253                 "puppet://$server/modules/files/puppet/fileserver.conf",
254                 "puppet://$server/modules/puppet/fileserver.conf"
255             ],
256             notify => Service["puppetmaster"],
257             require => File["/var/lib/puppet/private"]
258         }
259
260         file { "/etc/puppet/tagmail.conf":
261             owner => "root",
262             group => "root",
263             mode => 644,
264             source => [
265                 "puppet://$server/private/$environment/puppet/tagmail.conf.$hostname",
266                 "puppet://$server/private/$environment/puppet/tagmail.conf",
267                 "puppet://$server/modules/files/puppet/tagmail.conf.$hostname",
268                 "puppet://$server/modules/files/puppet/tagmail.conf",
269                 "puppet://$server/modules/puppet/tagmail.conf.$hostname",
270                 "puppet://$server/modules/puppet/tagmail.conf"
271             ],
272             notify => Service["puppetmaster"]
273         }
274
275         file { "/etc/sysconfig/puppetmaster":
276             owner => "root",
277             group => "root",
278             mode => 644,
279             source => [
280                 "puppet://$server/private/$environment/puppet/puppetmaster.sysconfig.$hostname",
281                 "puppet://$server/private/$environment/puppet/puppetmaster.sysconfig",
282                 "puppet://$server/modules/files/puppet/puppetmaster.sysconfig.$hostname",
283                 "puppet://$server/modules/files/puppet/puppetmaster.sysconfig",
284                 "puppet://$server/modules/puppet/puppetmaster.sysconfig.$hostname",
285                 "puppet://$server/modules/puppet/puppetmaster.sysconfig"
286             ],
287             notify => Service["puppetmaster"]
288         }
289
290         file { [
291                 "/usr/share/puppet/rack/",
292                 "/usr/share/puppet/rack/puppetmasterd/",
293                 "/usr/share/puppet/rack/puppetmasterd/public/",
294                 "/usr/share/puppet/rack/puppetmasterd/tmp/"
295             ]:
296             ensure => directory,
297             mode => 755
298         }
299
300         file { [
301                 "/usr/share/puppet/rack/puppetmasterd/config.ru"
302             ]:
303             source => "/usr/share/puppet/ext/rack/files/config.ru",
304             mode => 644,
305             owner => "puppet"
306         }
307
308         file { "/var/lib/puppet/private/":
309             ensure => directory
310         }
311
312         class passenger inherits server {
313             Service["puppetmaster"] {
314                 ensure => stopped,
315                 enable => false
316             }
317
318             file { "/usr/share/puppet/rack/puppetmasterd/config.ru":
319                 source => "/usr/share/puppet/ext/rack/files/config.ru",
320                 notify => Service["httpd"]
321             }
322
323         }
324
325         class storeconfigs_mysql inherits server {
326             include mysql::client
327
328             $puppet_type = "server"
329             $puppet_storeconfigs = "mysql"
330
331             debug("Current value of puppet_storeconfigs_mysql_password = $puppet_storeconfigs_mysql_password")
332
333             # We may need this to ensure proper downwards inheritance towards subclasses
334             $real_puppet_extra_output = $puppet_extra_output ? {
335                 '' => "false",
336                 default => $puppet_extra_output
337             }
338
339             $real_puppet_storeconfigs_mysql_database = $puppet_storeconfigs_mysql_database ? {
340                 '' => "puppet",
341                 default => $puppet_storeconfigs_mysql_database
342             }
343
344             $real_puppet_storeconfigs_mysql_username = $puppet_storeconfigs_mysql_username ? {
345                 '' => "puppet",
346                 default => $puppet_storeconfigs_mysql_username
347             }
348
349             $real_puppet_storeconfigs_mysql_password = $puppet_storeconfigs_mysql_password ? {
350                 '' => "puppet",
351                 default => $puppet_storeconfigs_mysql_password
352             }
353
354             $real_puppet_storeconfigs_mysql_hostname = $puppet_storeconfigs_mysql_hostname ? {
355                 '' => "127.0.0.1",
356                 default => $puppet_storeconfigs_mysql_hostname
357             }
358
359             case $real_puppet_storeconfigs_mysql_hostname {
360                 "127.0.0.1", "localhost", "localhost.localdomain": {
361                     include mysql::server
362
363                     exec { "${puppet_type}-storeconfigs_mysql_create_db":
364                         command => "/usr/bin/mysqladmin create $real_puppet_storeconfigs_mysql_database",
365                         unless => "/usr/bin/mysqlcheck -u $real_puppet_storeconfigs_mysql_username --password=$real_puppet_storeconfigs_mysql_password -s puppet",
366                         notify => Exec["$puppet_type-storeconfigs_mysql_create_user"],
367                         creates => "/var/lib/mysql/$real_puppet_storeconfigs_mysql_database/"
368                     }
369
370                     exec { "${puppet_type}-storeconfigs_mysql_create_user":
371                         command => "/usr/bin/mysql -e 'grant all privileges on puppet.* to $real_puppet_storeconfigs_mysql_username@$fqdn identified by \"$real_puppet_storeconfigs_mysql_password\"'",
372                         refreshonly => true
373                     }
374                 }
375             }
376
377             File["/etc/puppet/puppet.conf"] {
378                 content => template('puppet/puppet.conf.erb')
379             }
380
381             realize(File["/etc/puppet/puppet.conf"])
382
383         }
384     }
385
386     class satelite inherits satellite {}
387
388     class satellite inherits server {
389
390         $puppet_type = "satellite"
391
392         debug("Current value of puppet_storeconfigs_mysql_password = $puppet_storeconfigs_mysql_password")
393
394         class storeconfigs_mysql inherits satellite {
395             include mysql::client
396
397             $puppet_type = "satellite"
398             $puppet_storeconfigs = "mysql"
399
400             debug("Current value of puppet_storeconfigs_mysql_password = $puppet_storeconfigs_mysql_password")
401
402             # We may need this to ensure proper downwards inheritance towards subclasses
403             $real_puppet_extra_output = $puppet_extra_output ? {
404                 '' => "false",
405                 default => $puppet_extra_output
406             }
407
408             $real_puppet_storeconfigs_mysql_database = $puppet_storeconfigs_mysql_database ? {
409                 '' => "puppet",
410                 default => $puppet_storeconfigs_mysql_database
411             }
412
413             $real_puppet_storeconfigs_mysql_username = $puppet_storeconfigs_mysql_username ? {
414                 '' => "puppet",
415                 default => $puppet_storeconfigs_mysql_username
416             }
417
418             $real_puppet_storeconfigs_mysql_password = $puppet_storeconfigs_mysql_password ? {
419                 '' => "puppet",
420                 default => $puppet_storeconfigs_mysql_password
421             }
422
423             $real_puppet_storeconfigs_mysql_hostname = $puppet_storeconfigs_mysql_hostname ? {
424                 '' => "127.0.0.1",
425                 default => $puppet_storeconfigs_mysql_hostname
426             }
427
428             case $real_puppet_storeconfigs_mysql_hostname {
429                 "127.0.0.1", "localhost", "localhost.localdomain": {
430                     include mysql::server
431                 }
432             }
433
434             debug("The value of puppet_extra_output in puppet::satellite::storeconfigs_mysql is: ${real_puppet_extra_output}")
435             debug("The value of real_puppet_storeconfigs_mysql_hostname in puppet::satellite::storeconfigs_mysql is: ${real_puppet_storeconfigs_mysql_hostname}")
436             debug("The value of real_puppet_storeconfigs_mysql_database in puppet::satellite::storeconfigs_mysql is: ${real_puppet_storeconfigs_mysql_database}")
437             debug("The value of real_puppet_storeconfigs_mysql_username in puppet::satellite::storeconfigs_mysql is: ${real_puppet_storeconfigs_mysql_username}")
438             debug("The value of real_puppet_storeconfigs_mysql_password in puppet::satellite::storeconfigs_mysql is: ${real_puppet_storeconfigs_mysql_password}")
439
440             File["/etc/puppet/puppet.conf"] {
441                 content => template('puppet/puppet.conf.erb')
442             }
443
444             realize(File["/etc/puppet/puppet.conf"])
445
446             exec { "${puppet_type}-storeconfigs_mysql_create_db":
447                 command => "/usr/bin/mysqladmin create $real_puppet_storeconfigs_mysql_database",
448                 unless => "/usr/bin/mysqlcheck -u $real_puppet_storeconfigs_mysql_username --password=$real_puppet_storeconfigs_mysql_password -s puppet 2>/dev/null",
449                 notify => Exec["$puppet_type-storeconfigs_mysql_create_user"],
450                 creates => "/var/lib/mysql/$real_puppet_storeconfigs_mysql_database/"
451              }
452
453              exec { "${puppet_type}-storeconfigs_mysql_create_user":
454                  command => "/usr/bin/mysql -e 'grant all privileges on puppet.* to $real_puppet_storeconfigs_mysql_username@localhost identified by \"$real_puppet_storeconfigs_mysql_password\"'",
455                  refreshonly => true
456              }
457
458         }
459
460         if $puppet_storeconfigs == '' {
461             $puppet_storeconfigs = "none"
462         }
463
464         # Rebind the virtual resource File["/etc/puppet/puppet.conf"]
465         # This needs to be as late as possible, because at this moment the environment (ie variable values) is fixed in place for the template
466         # Currently not working: variables appear to be fixed at the time of rebinding, thus the (now removed) define above is not changing the variables.
467         File["/etc/puppet/puppet.conf"] {
468             content => template('puppet/puppet.conf.erb')
469         }
470
471         realize(File["/etc/puppet/puppet.conf"])
472
473     }
474
475     define server::module::development( $base_url = false,
476                                         $module_prefix = false,
477                                         $branch = 'development') {
478         #
479         # Shortcut to Puppet::Server::Module with branch master
480         #
481         # You can only include/define Puppet::Server::Module["foo"] once, so this is
482         # work-around to enable you to have Puppet::Server::Module::Development["foo"]
483         # and Puppet::Server::Module::Production["foo"]
484         #
485         # Since the Puppet::Server::Module resource does everything by $name normally,
486         # this shortcut supplies the "module_name" attribute to it's call.
487         #
488
489         module { "development_$name":
490             base_url => $base_url,
491             module_prefix => $module_prefix,
492             module_name => $name,
493             branch => $branch
494         }
495     }
496
497     define server::module::testing( $base_url = false,
498                                         $module_prefix = false,
499                                         $branch = 'testing') {
500         #
501         # Shortcut to Puppet::Server::Module with branch master
502         #
503         # You can only include/define Puppet::Server::Module["foo"] once, so this is
504         # work-around to enable you to have Puppet::Server::Module::Development["foo"]
505         # and Puppet::Server::Module::Production["foo"]
506         #
507         # Since the Puppet::Server::Module resource does everything by $name normally,
508         # this shortcut supplies the "module_name" attribute to it's call.
509         #
510
511         module { "testing_$name":
512             base_url => $base_url,
513             module_prefix => $module_prefix,
514             module_name => $name,
515             branch => $branch
516         }
517     }
518
519     define server::module::production(  $base_url = false,
520                                         $module_prefix = false,
521                                         $branch = 'production') {
522         # Shortcut to module with branch production
523         module { "production_$name":
524             base_url => $base_url,
525             module_prefix => $module_prefix,
526             module_name => $name,
527             branch => $branch
528         }
529     }
530
531     define server::module(  $module_name = false,
532                             $module_prefix = false,
533                             $base_url = false,
534                             $url = false,
535                             $branch = 'production') {
536
537         #
538         # This resource makes the puppet master pull in the modules
539         # from puppetmanaged.org, to /var/lib/puppet/modules/$branch/$name
540         #
541
542         $real_name = $module_name ? {
543             false => $name,
544             default => $module_name
545         }
546
547         git::clone { "modules/$branch/$real_name":
548             source => $url ? {
549                 false => $base_url ? {
550                     false => "$url",
551                     default => $module_prefix ? {
552                         false => $module_name ? {
553                             false => "$base_url/$name",
554                             default => "$base_url/$module_name"
555                         },
556                         default => $module_name ? {
557                             false => "$base_url/$module_prefix-$name",
558                             default => "$base_url/$module_prefix-$module_name"
559                         }
560                     }
561                 },
562                 default => $url
563             },
564             localtree => "/var/lib/puppet/modules/$branch/",
565             real_name => "$real_name",
566             branch => $branch
567         }
568
569         git::pull { "modules/$branch/$real_name":
570             localtree => "/var/lib/puppet/modules/$branch/",
571             real_name => $real_name,
572             require => Git::Clone["modules/$branch/$real_name"]
573         }
574
575     }
576
577     define server::domain::development( $public = true,
578                                         $base_url = false,
579                                         $url = false,
580                                         $real_name = false,
581                                         $prefix = false) {
582         server::domain { "development_$name":
583             branch => "development",
584             public => $public,
585             base_url => $base_url,
586             url => $url,
587             real_name => $real_name ? {
588                 false => $name,
589                 default => $real_name
590             },
591             prefix => $prefix
592         }
593     }
594
595     define server::domain::testing( $public = true,
596                                     $base_url = false,
597                                     $url = false,
598                                     $real_name = false,
599                                     $prefix = false) {
600         server::domain { "testing_$name":
601             branch => "testing",
602             public => $public,
603             base_url => $base_url,
604             url => $url,
605             real_name => $real_name ? {
606                 false => $name,
607                 default => $real_name
608             },
609             prefix => $prefix
610         }
611     }
612
613     define server::domain::production(  $public = true,
614                                         $base_url = false,
615                                         $url = false,
616                                         $real_name = false,
617                                         $prefix = false) {
618         server::domain { "production_$name":
619             branch => "production",
620             public => $public,
621             base_url => $base_url,
622             url => $url,
623             real_name => $real_name ? {
624                 false => $name,
625                 default => $real_name
626             },
627             prefix => $prefix
628         }
629     }
630
631     define server::domain(  $public = true,
632                             $base_url = false,
633                             $url = false,
634                             $real_name = false,
635                             $prefix = false,
636                             $branch = 'development') {
637
638         #
639         # This resource makes the puppet masterpull in the
640         # /var/lib/puppet/private/$environment/$environment tree from an upstream
641         # SCM, and "copies" the puppet/manifests/nodes/ to it's final location
642         # /var/lib/puppet/manifests/$environment/domains/$domain/nodes/
643         #
644
645         if defined(File["/var/lib/puppet/private/$name/"]) {
646             realize(File["/var/lib/puppet/private/$name/"])
647         } else {
648             @file { "/var/lib/puppet/private/$name/":
649                 ensure => directory,
650                 path => $real_name ? {
651                     false => "/var/lib/puppet/private/$name",
652                     default => "/var/lib/puppet/private/$real_name"
653                 }
654             }
655             realize(File["/var/lib/puppet/private/$real_name/"])
656         }
657
658         git::clone { "private/$name/$branch":
659             source => $url ? {
660                 false => $prefix ? {
661                     false => $real_name ? {
662                         false => "$base_url/$name",
663                         default => "$base_url/$real_name"
664                     },
665                     default => $real_name ? {
666                         false => "$base_url/$prefix-$name",
667                         default => "$base_url/$prefix-$real_name"
668                     }
669                 },
670                 default => "$url"
671             },
672             localtree => $real_name ? {
673                 false => "/var/lib/puppet/private/$name/",
674                 default => "/var/lib/puppet/private/$real_name/"
675             },
676             real_name => $branch
677         }
678
679         git::pull { "private/$name/$branch":
680             localtree => $real_name ? {
681                 false => "/var/lib/puppet/private/$name/",
682                 default => "/var/lib/puppet/private/$real_name/"
683             },
684             real_name => $branch,
685             require => Git::Clone["private/$name/$branch"]
686         }
687
688         file { "/var/lib/puppet/manifests/$branch/domains/$name":
689             ensure => directory,
690             path => $real_name ? {
691                 false => "/var/lib/puppet/manifests/$branch/domains/$name",
692                 default => "/var/lib/puppet/manifests/$branch/domains/$real_name"
693             },
694             source => $real_name ? {
695                 false => "/var/lib/puppet/private/$name/$branch/puppet/manifests/",
696                 default => "/var/lib/puppet/private/$real_name/$branch/puppet/manifests/"
697             },
698             recurse => true,
699             purge => true,
700             force => true,
701             require => [
702                 Git::Pull["private/$name/$branch"]
703             ]
704         }
705
706         file { "/var/lib/puppet/manifests/$branch/domains/$name.pp":
707             path => $real_name ? {
708                 false => "/var/lib/puppet/manifests/$branch/domains/$name.pp",
709                 default => "/var/lib/puppet/manifests/$branch/domains/$real_name.pp"
710             },
711             source => $real_name ? {
712                 false => [
713                     "/var/lib/puppet/private/$name/$branch/puppet/$name.pp",
714                     "/var/lib/puppet/private/$name/$branch/puppet/site.pp"
715                 ],
716                 default => [
717                     "/var/lib/puppet/private/$real_name/$branch/puppet/$real_name.pp",
718                     "/var/lib/puppet/private/$real_name/$branch/puppet/site.pp"
719                 ]
720             },
721             require => [
722                 Git::Pull["private/$name/$branch"]
723             ]
724         }
725     }
726 }