public
Description: Public Puppet Configuration by The SANS Institute
Homepage:
Clone URL: git://github.com/jtimberman/puppet.git
Joshua Timberman (author)
Wed Jun 18 08:46:57 -0700 2008
puppet / users / manifests / init.pp
100644 141 lines (135 sloc) 4.792 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# This module creates users using virtual resources via a called define,
# useraccount. It also has some special handling of web team users because they
# may be in a different primary group on database servers, for example.
#
# To use this module on a node, include the following, as appropriate.
# include users::people # on all servers.
# include users::noc # on all servers.
# include groups::web # only on web servers.
# include users::web # only on web servers.
# include users::web::extra # only on web servers.
# include users::database # only on database servers.
 
# We have some other classes to grab too.
import "people"
import "web"
 
# define useraccount
# creates a user with their complete home directory, including ssh key(s),
# shell profile(s) and anything else.
# This define should be called to create a virtual resource so it can
# be used to create all users, and then the users required on the particular
# node are specified through the various user classes.
# Example:
# @useraccount { "username":
# ensure => "present",
# uid => 500,
# pgroup => users,
# groups => ["staff", "other"],
# fullname => "New User",
# homefs => "$homefs",
# shell => "$shell",
# }
 
define useraccount ( $ensure = present, $uid, $pgroup = users,
                       $groups, $fullname, $homefs, $shell) {
    $username = $name
    # This case statement will allow disabling an account by passing
    # ensure => absent, to set the home directory ownership to root.
    case $ensure {
        present: {
            $home_owner = $username
            $home_group = $pgroup
        }
        default: {
            $home_owner = "root"
            $home_group = "root"
        }
    }
    # Create the user with their groups as specified
    user { $username:
        ensure => $ensure,
        uid => $uid,
        gid => $pgroup,
        groups => $groups,
        comment => $fullname,
        home => "${homefs}/$username",
        shell => $shell,
        allowdupe => false,
    }
    file { "${homefs}/${username}":
        ensure => directory,
        owner => $home_owner,
        group => $home_group,
        mode => 750,
        require => User["${username}"],
    }
    file { "${homefs}/${username}/.ssh":
        ensure => directory,
        owner => $home_owner,
        group => $home_group,
        mode => 700,
        require => File["${homefs}/${username}"],
    }
    file { "${homefs}/${username}/.ssh/authorized_keys":
        ensure => present,
        owner => $home_owner,
        group => $home_group,
        mode => 600,
        require => File["${homefs}/${username}/.ssh"],
        source => "puppet:///users/${username}/.ssh/authorized_keys",
    }
    file { "${homefs}/${username}/.ssh/authorized_keys2":
        ensure => "${homefs}/${username}/.ssh/authorized_keys",
        require => File["${homefs}/${username}/.ssh/authorized_keys"],
    }
    file { "${homefs}/${username}/.bashrc":
        ensure => present,
        owner => $home_owner,
        group => $home_group,
        mode => 640,
        require => File["${homefs}/${username}"],
        source => "puppet:///users/${username}/.bashrc",
    }
    file { "${homefs}/${username}/.bash_profile":
        ensure => "${homefs}/${username}/.bashrc",
        require => File["${homefs}/${username}/.bashrc"],
    }
}
 
# class groups::web
# This class virtual creates the required groups for the web team.
class groups::web {
    @group { "htdocs": ensure => present, gid => "1502", }
    @group { "wwwcron": ensure => present, gid => "1501", }
    @group { "secure": ensure => present, gid => "2038", }
}
# Create another class to realize other groups.
#class groups::newgrouptype {
# @group { "newgroup": ensure => present, gid => "530", }
#}
# class users::noc
# Make the virtual users with wheel as the primary group real.
# This should be the NOC/Sysadmin team.
class users::noc {
    Useraccount <| pgroup == wheel |>
}
 
# class users::web
# Make the virtual users with htdocs as the primary group real.
# This should be the webmaster team.
class users::web {
    Group <| title == htdocs |>
    Group <| title == wwwcron |>
    Group <| title == secure |>
    Useraccount <| pgroup == htdocs |>
    Useraccount <| title == webalizer |>
    User <| title == cronman |>
    User <| title == secure |>
}
#class users::web::newwebgroup {
# Group <| title == htdocs |>
#}
# Make the virtual users for the newgroup systems real.
#class users::newgroup {
# Group <| title == newgroup |>
# Useraccount <| pgroup == newgroup |>
#}
# vim modeline - have 'set modeline' and 'syntax on' in your ~/.vimrc.
# vi:syntax=puppet:filetype=puppet:ts=4:et:
# EOF