]> git.openstreetmap.org Git - chef.git/blob - cookbooks/postgresql/recipes/default.rb
foundation: use default mediawiki version
[chef.git] / cookbooks / postgresql / recipes / default.rb
1 #
2 # Cookbook:: postgresql
3 # Recipe:: default
4 #
5 # Copyright:: 2012, OpenStreetMap Foundation
6 #
7 # Licensed under the Apache License, Version 2.0 (the "License");
8 # you may not use this file except in compliance with the License.
9 # You may obtain a copy of the License at
10 #
11 #     https://www.apache.org/licenses/LICENSE-2.0
12 #
13 # Unless required by applicable law or agreed to in writing, software
14 # distributed under the License is distributed on an "AS IS" BASIS,
15 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 # See the License for the specific language governing permissions and
17 # limitations under the License.
18 #
19
20 include_recipe "apt::postgresql"
21 include_recipe "prometheus"
22
23 package %w[
24   locales-all
25   pgbackrest
26   postgresql-common
27 ]
28
29 if node[:postgresql][:pgbackrest][:credentials_bag]
30   pgbackrest_credentials = data_bag_item(node[:postgresql][:pgbackrest][:credentials_bag],
31                                          node[:postgresql][:pgbackrest][:credentials_item])
32 end
33
34 systemd_tmpfile "/run/pgbackrest" do
35   type "d"
36   owner "postgres"
37   group "postgres"
38   mode "750"
39 end
40
41 template "/etc/pgbackrest.conf" do
42   source "pgbackrest.conf.erb"
43   owner "postgres"
44   group "postgres"
45   mode "640"
46   variables :credentials => pgbackrest_credentials
47 end
48
49 prometheus_exporter "pgbackrest" do
50   port 9854
51   user "postgres"
52   remove_ipc false
53 end
54
55 node[:postgresql][:versions].each do |version|
56   package %W[
57     postgresql-#{version}
58     postgresql-client-#{version}
59     postgresql-contrib-#{version}
60     postgresql-server-dev-#{version}
61   ]
62
63   defaults = node[:postgresql][:settings][:defaults] || {}
64   settings = node[:postgresql][:settings][version] || {}
65
66   standby_mode = settings[:standby_mode] || defaults[:standby_mode]
67   primary_conninfo = settings[:primary_conninfo] || defaults[:primary_conninfo]
68
69   passwords = if primary_conninfo
70                 data_bag_item(primary_conninfo[:passwords][:bag],
71                               primary_conninfo[:passwords][:item])
72               end
73
74   template "/etc/postgresql/#{version}/main/postgresql.conf" do
75     source "postgresql.conf.erb"
76     owner "postgres"
77     group "postgres"
78     mode "644"
79     variables :version => version,
80               :defaults => defaults,
81               :settings => settings,
82               :primary_conninfo => primary_conninfo,
83               :passwords => passwords
84     notifies :reload, "service[postgresql]"
85     only_if { ::Dir.exist?("/etc/postgresql/#{version}/main") }
86   end
87
88   template "/etc/postgresql/#{version}/main/pg_hba.conf" do
89     source "pg_hba.conf.erb"
90     owner "postgres"
91     group "postgres"
92     mode "640"
93     variables :early_rules => settings[:early_authentication_rules] || defaults[:early_authentication_rules],
94               :late_rules => settings[:late_authentication_rules] || defaults[:late_authentication_rules]
95     notifies :reload, "service[postgresql]"
96     only_if { ::Dir.exist?("/etc/postgresql/#{version}/main") }
97   end
98
99   template "/etc/postgresql/#{version}/main/pg_ident.conf" do
100     source "pg_ident.conf.erb"
101     owner "postgres"
102     group "postgres"
103     mode "640"
104     variables :maps => settings[:user_name_maps] || defaults[:user_name_maps]
105     notifies :reload, "service[postgresql]"
106     only_if { ::Dir.exist?("/etc/postgresql/#{version}/main") }
107   end
108
109   link "/var/lib/postgresql/#{version}/main/server.crt" do
110     to "/etc/ssl/certs/ssl-cert-snakeoil.pem"
111     only_if { ::Dir.exist?("/var/lib/postgresql/#{version}/main") }
112   end
113
114   link "/var/lib/postgresql/#{version}/main/server.key" do
115     to "/etc/ssl/private/ssl-cert-snakeoil.key"
116     only_if { ::Dir.exist?("/var/lib/postgresql/#{version}/main") }
117   end
118
119   if standby_mode == "on"
120     file "/var/lib/postgresql/#{version}/main/standby.signal" do
121       owner "postgres"
122       group "postgres"
123       mode "640"
124       only_if { ::Dir.exist?("/var/lib/postgresql/#{version}/main") }
125     end
126   else
127     file "/var/lib/postgresql/#{version}/main/standby.signal" do
128       action :delete
129       only_if { ::Dir.exist?("/var/lib/postgresql/#{version}/main") }
130     end
131   end
132 end
133
134 service "postgresql" do
135   action [:enable, :start]
136   supports :status => true, :restart => true, :reload => true
137 end
138
139 ohai_plugin "postgresql" do
140   template "ohai.rb.erb"
141 end
142
143 package "pgtop"
144 package "libdbd-pg-perl"
145
146 clusters = node[:postgresql][:clusters] || []
147 passwords = data_bag_item("postgresql", "passwords")
148
149 clusters.each do |name, details|
150   prometheus_suffix = name.tr("/", "-")
151   prometheus_database = node[:postgresql][:monitor_database]
152
153   postgresql_user "prometheus" do
154     cluster name
155     password passwords["prometheus"]
156     roles "pg_monitor"
157     not_if { ::File.exist?("/var/lib/postgresql/#{name}/standby.signal") }
158   end
159
160   prometheus_exporter "postgres" do
161     port 10000 + details[:port].to_i
162     service "postgres-#{prometheus_suffix}"
163     labels "cluster" => name
164     scrape_interval "1m"
165     scrape_timeout "1m"
166     options %w[
167       --collector.database_wraparound
168       --collector.long_running_transactions
169       --collector.process_idle
170       --collector.stat_activity_autovacuum
171       --collector.stat_wal_receiver
172       --collector.statio_user_indexes
173     ]
174     environment "DATA_SOURCE_NAME" => "postgres:///#{prometheus_database}?host=/run/postgresql&port=#{details[:port]}&user=prometheus&password=#{passwords['prometheus']}"
175     restrict_address_families "AF_UNIX"
176     subscribes :restart, "template[/etc/prometheus/exporters/postgres_queries.yml]"
177   end
178
179   if node[:postgresql][:monitor_queries]
180     template "/etc/prometheus/exporters/sql_exporter.yml" do
181       source "sql_exporter.yml.erb"
182       owner "root"
183       group "root"
184       mode "644"
185     end
186
187     prometheus_exporter "sql" do
188       port 20000 + details[:port].to_i
189       service "sql-#{prometheus_suffix}"
190       labels "cluster" => name
191       scrape_interval "1m"
192       scrape_timeout "1m"
193       options "--config.file=/etc/prometheus/exporters/sql_exporter.yml"
194       environment "SQLEXPORTER_TARGET_DSN" => "postgres://prometheus:#{passwords['prometheus']}@/run/postgresql:#{details[:port]}/#{prometheus_database}"
195       restrict_address_families "AF_UNIX"
196       memory_deny_write_execute false
197       subscribes :restart, "template[/etc/prometheus/exporters/sql_exporter.yml]"
198     end
199   else
200     prometheus_exporter "sql" do
201       action :delete
202       service "sql-#{prometheus_suffix}"
203     end
204
205     file "/etc/prometheus/exporters/sql_exporter.yml" do
206       action :delete
207     end
208   end
209 end