]> git.openstreetmap.org Git - chef.git/blob - cookbooks/prometheus/resources/exporter.rb
0c94fa0eb4310d8567a7874628d9ab423980c067
[chef.git] / cookbooks / prometheus / resources / exporter.rb
1 #
2 # Cookbook:: prometheus
3 # Resource:: prometheus_exporter
4 #
5 # Copyright:: 2020, 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 default_action :create
21
22 property :exporter, :kind_of => String, :name_property => true
23 property :github_owner, :kind_of => String, :default => "prometheus"
24 property :github_project, :kind_of => String
25 property :version, :kind_of => String, :required => [:create]
26 property :port, :kind_of => Integer, :required => [:create]
27 property :listen_switch, :kind_of => String, :default => "web.listen-address"
28 property :options, :kind_of => [String, Array]
29
30 action :create do
31   package "prometheus-#{new_resource.exporter}-exporter" do
32     action :purge
33   end
34
35   remote_file archive_file do
36     action :create_if_missing
37     source archive_url
38     owner "root"
39     group "root"
40     mode "644"
41     backup false
42   end
43
44   execute archive_file do
45     action :nothing
46     command "tar -xf #{archive_file}"
47     cwd "/opt/prometheus"
48     user "root"
49     group "root"
50     subscribes :run, "remote_file[#{archive_file}]"
51   end
52
53   systemd_service service_name do
54     description "Prometheus #{new_resource.exporter} exporter"
55     type "simple"
56     user "root"
57     exec_start "#{executable_path} #{executable_options}"
58     private_tmp true
59     protect_system "strict"
60     protect_home true
61     no_new_privileges true
62   end
63
64   service service_name do
65     action [:enable, :start]
66     subscribes :restart, "systemd_service[#{service_name}]"
67   end
68
69   firewall_rule "accept-prometheus-#{new_resource.exporter}" do
70     action :accept
71     source "osm"
72     dest "fw"
73     proto "tcp:syn"
74     dest_ports new_resource.port
75     only_if { node[:prometheus][:mode] == "external" }
76   end
77
78   node.default[:prometheus][:exporters][new_resource.exporter] = listen_address
79 end
80
81 action :delete do
82   service service_name do
83     action [:disable, :stop]
84   end
85
86   package package_name do
87     action :purge
88   end
89 end
90
91 action_class do
92   def github_project
93     new_resource.github_project || "#{new_resource.exporter}_exporter"
94   end
95
96   def archive_url
97     "https://github.com/#{new_resource.github_owner}/#{github_project}/releases/download/v#{new_resource.version}/#{github_project}-#{new_resource.version}.linux-amd64.tar.gz"
98   end
99
100   def archive_file
101     "#{Chef::Config[:file_cache_path]}/prometheus-#{new_resource.exporter}-exporter-#{new_resource.version}.tar.gz"
102   end
103
104   def service_name
105     "prometheus-#{new_resource.exporter}-exporter"
106   end
107
108   def executable_path
109     "/opt/prometheus/#{github_project}-#{new_resource.version}.linux-amd64/#{github_project}"
110   end
111
112   def executable_options
113     "--#{new_resource.listen_switch}=#{listen_address} #{Array(new_resource.options).join(" ")}"
114   end
115
116   def listen_address
117     if node[:prometheus][:mode] == "wireguard"
118       "[#{node[:prometheus][:address]}]:#{new_resource.port}"
119     else
120       "#{node[:prometheus][:address]}:#{new_resource.port}"
121     end
122   end
123 end