]> WPIA git - infra.git/blob - environments/production/manifests/root.pp
e6937fb503a73fe8b3e804760a5f2e663fee97a1
[infra.git] / environments / production / manifests / root.pp
1 class my_fw::post {
2   package { 'iptables-persistent':
3     ensure => 'installed'
4   }
5   resources { 'firewall':
6       purge => true,
7   }
8   Package['iptables-persistent'] ->
9   firewall { '80 dnat':
10     proto  => 'tcp',
11     dport  => '80',
12     jump => 'DNAT',
13     todest => "${$ips[front-nginx]}:80",
14     iniface => $internet_iface,
15     table    => 'nat',
16     chain    => 'PREROUTING',
17   } ->
18   firewall { '80 dnat-https':
19     proto  => 'tcp',
20     dport  => '443',
21     jump => 'DNAT',
22     todest => "${$ips[front-nginx]}:443",
23     iniface => $internet_iface,
24     table    => 'nat',
25     chain    => 'PREROUTING',
26   } ->
27   firewall {'80 dnatv6':
28     provider => 'ip6tables',
29     proto  => 'tcp',
30     dport => '80',
31     jump => 'DNAT',
32     todest => "[${$ipsv6[front-nginx]}]:80",
33     iniface => $internet_iface,
34     table => 'nat',
35     chain => 'PREROUTING'
36   } ->
37   firewall {'80 dnatv6-https':
38     provider => 'ip6tables',
39     proto  => 'tcp',
40     dport => '443',
41     jump => 'DNAT',
42     todest => "[${$ipsv6[front-nginx]}]:443",
43     iniface => $internet_iface,
44     table => 'nat',
45     chain => 'PREROUTING'
46   } ->
47   firewall {'80 MASQ-v6':
48     provider => 'ip6tables',
49     chain => 'POSTROUTING',
50     table => 'nat',
51     proto  => 'all',
52     jump => 'MASQUERADE',
53     source => "[fc00:1::]/64",
54     outiface => $internet_iface,
55   } ->
56   firewall { '80 dnat-git':
57     proto  => 'tcp',
58     dport  => '9418',
59     jump => 'DNAT',
60     todest => "${$ips[gitweb]}:9418",
61     iniface => $internet_iface,
62     table    => 'nat',
63     chain    => 'PREROUTING',
64   } ->
65   firewall { '80 dnat-htop-ssh':
66     proto  => 'tcp',
67     dport  => '2222',
68     jump => 'DNAT',
69     todest => "${$ips[hop]}:22",
70     iniface => $internet_iface,
71     table    => 'nat',
72     chain    => 'PREROUTING',
73   } ->
74   firewall { '80 MASQ':
75     chain => 'POSTROUTING',
76     table => 'nat',
77     jump => 'MASQUERADE',
78     proto => 'all',
79     outiface => $internet_iface,
80     source => '10.0.3.0/24',
81   }
82 }
83
84
85 node host01 {
86     include my_fw::post
87     include lxc
88     exec { "enable forwarding on $hostname":
89       user    => "root",
90       command => "/bin/echo 1 > /proc/sys/net/ipv4/ip_forward",
91       unless  => "/bin/grep -q 1 /proc/sys/net/ipv4/ip_forward",
92       require => Class['lxc']
93     } -> exec { "enable v6 forwarding on $hostname":
94       user    => "root",
95       command => "/bin/echo 1 > /proc/sys/net/ipv6/conf/all/forwarding",
96       unless  => "/bin/grep -q 1 /proc/sys/net/ipv6/conf/all/forwarding"
97     }->
98       file_line {"root-resolv1":
99       path   => "/etc/resolv.conf",
100       ensure => 'absent',
101       match_for_absence => "true",
102       match  => '^domain ',
103       line   => ''
104     }->
105       file_line {"root-resolv2":
106       path   => "/etc/resolv.conf",
107       ensure => 'absent',
108       match_for_absence => "true",
109       match  => '^search ',
110       line   => ''
111     }
112 if $signerLocation == 'self' {
113     exec {"create cassiopeia-comm-keys":
114       command => '/etc/puppet/code/modules/cassiopeia/mkcassiopeia',
115       creates => '/etc/puppet/code/modules/cassiopeia/files/signer_client.crt'
116     }
117 } else {
118     exec {"create cassiopeia-comm-keys":
119       command => '/bin/false',
120       creates => '/etc/puppet/code/modules/cassiopeia/files/signer_client.crt'
121     }
122 }
123     exec {"gigi keystore.pkcs12":
124       command => '/bin/bash -c \'keystorepw=$(/usr/bin/head -c 15 /dev/urandom | base64); /usr/bin/openssl pkcs12 -export -name "mail" -in /etc/puppet/code/modules/gigi/files/client.crt -inkey /etc/puppet/code/modules/gigi/client.key -CAfile /etc/puppet/codemodules/nre/files/config/ca/root.crt -password file:<(echo $keystorepw) > /etc/puppet/code/modules/gigi/files/keystore.pkcs12; /usr/bin/printf "%s" "$keystorepw" > /etc/puppet/code/modules/gigi/files/keystorepw\'',
125       unless => '/usr/bin/[  /etc/puppet/code/modules/gigi/files/keystore.pkcs12 -nt /etc/puppet/code/modules/gigi/files/client.crt ] || ! /usr/bin/[ -f /etc/puppet/code/modules/gigi/files/client.crt ]'
126     }
127     lxc::container { 'front-nginx':
128         contname => 'front-nginx',
129         ip => $ips[front-nginx],
130         dir => ["/data", "/data-crl", '/data-crl-gigi', '/gitweb-socket', '/git-smart-http-socket', '/srv/git'],
131         bind => {
132           "/data/nginx" => {target => "data", option => ",ro"},
133           "/data/crl" => {target => "data-crl", option => ",ro"},
134           "/data/gigi-crl" => {target => "data-crl-gigi", option => ",ro"},
135           "/run/gitweb-socket" => {target => 'gitweb-socket'},
136           "/run/git-smart-http-socket" => {target => 'git-smart-http-socket'},
137           "/data/git" => { 'target' => "srv/git", option => ",ro"}
138         },
139         require => File['/data/crl/htdocs']
140     }
141     file { '/data':
142        ensure => 'directory',
143     }
144     file { '/data/nginx':
145       ensure => 'directory',
146     }
147     file { '/data/crl':
148       ensure => 'directory',
149       owner => $administrativeUser
150     }
151     file { '/data/git':
152       ensure => 'directory',
153       owner => $administrativeUser,
154     }
155     file { '/data/gigi-crl':
156       ensure => 'directory',
157       owner => $administrativeUser
158     }
159     file { '/data/crl/htdocs':
160       ensure => 'directory',
161       owner => $administrativeUser
162     }
163     file { '/data/postgres/conf':
164       ensure => 'directory',
165     }
166     file { '/data/postgres/data':
167       ensure => 'directory',
168     }
169     file { '/data/postgres':
170       ensure => 'directory',
171     }
172     file { '/data/gigi':
173       ensure => 'directory',
174     }
175     lxc::container { 'postgres-primary':
176         contname => 'postgres-primary',
177         ip => $ips[postgres],
178         dir => ["/var/lib/postgresql", "/etc/postgresql"],
179         bind => {
180           "/data/postgres/data" => { target => "var/lib/postgresql"},
181           "/data/postgres/conf" => { target => "etc/postgresql"}
182         },
183     }
184     $gigi_serial_conf= $signerLocation ? {
185       'self'          => [],
186       '/dev/ttyS0'    => ["lxc.cgroup.devices.allow = c 4:64 rwm"]
187     }
188
189     lxc::container { 'gigi':
190         contname => 'gigi',
191         ip => $ips[gigi],
192         dir => ["/var/lib/wpia-gigi", "/var/lib/wpia-gigi/keys", '/var/lib/cassiopeia', '/var/lib/cassiopeia/ca'],
193         bind => {
194           "/data/gigi" => { target => "var/lib/wpia-gigi/keys"},
195           "/data/gigi-crl" => { target => "var/lib/cassiopeia/ca"}
196         },
197         confline => $gigi_serial_conf,
198     }
199     if $signerLocation == 'self' {
200       lxc::container { 'cassiopeia':
201         contname => 'cassiopeia',
202         ip => $ips[cassiopeia]
203       }
204     }
205     lxc::container { 'exim':
206         contname => 'exim',
207         ip => $ips[exim]
208     }
209     lxc::container { 'hop':
210         contname => 'hop',
211         ip => $ips[hop]
212     }
213     lxc::container { 'quiz':
214         contname => 'quiz',
215         ip => $ips[quiz]
216     }
217     file{'/run/gitweb-socket':
218         ensure => 'directory'
219     }
220     file{'/run/git-smart-http-socket':
221         ensure => 'directory'
222     }
223     lxc::container { 'gitweb':
224         contname => 'gitweb',
225         dir => ['/gitweb-socket', '/git-smart-http-socket', '/srv/git'],
226         bind => {
227           "/run/gitweb-socket" => { 'target' => "gitweb-socket"},
228           "/run/git-smart-http-socket" => { 'target' => "git-smart-http-socket"},
229           "/data/git" => { 'target' => "srv/git", option => ",ro"}
230         },
231         ip => $ips[gitweb]
232     }
233     # Required for bootstrap-user
234     package {'acl':
235         ensure => 'installed'
236     }
237 }
238