caco 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.travis.yml +10 -0
  4. data/CODE_OF_CONDUCT.md +74 -0
  5. data/Gemfile +12 -0
  6. data/Gemfile.lock +227 -0
  7. data/Guardfile +42 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +97 -0
  10. data/Rakefile +10 -0
  11. data/bin/_guard-core +29 -0
  12. data/bin/bundle +114 -0
  13. data/bin/byebug +29 -0
  14. data/bin/caco +29 -0
  15. data/bin/coderay +29 -0
  16. data/bin/console +20 -0
  17. data/bin/eyaml +29 -0
  18. data/bin/guard +29 -0
  19. data/bin/listen +29 -0
  20. data/bin/pry +29 -0
  21. data/bin/rake +29 -0
  22. data/bin/safe_yaml +29 -0
  23. data/bin/setup +8 -0
  24. data/bin/thor +29 -0
  25. data/bin/tilt +29 -0
  26. data/caco.gemspec +43 -0
  27. data/exe/caco +27 -0
  28. data/lib/caco.rb +115 -0
  29. data/lib/caco/barman.rb +10 -0
  30. data/lib/caco/barman/cell/global.rb +4 -0
  31. data/lib/caco/barman/cell/node.rb +15 -0
  32. data/lib/caco/barman/install.rb +25 -0
  33. data/lib/caco/barman/view/global.erb +7 -0
  34. data/lib/caco/barman/view/node.erb +8 -0
  35. data/lib/caco/cell.rb +8 -0
  36. data/lib/caco/config.rb +23 -0
  37. data/lib/caco/debian.rb +28 -0
  38. data/lib/caco/debian/add_user.rb +18 -0
  39. data/lib/caco/debian/apt_key_install.rb +19 -0
  40. data/lib/caco/debian/apt_repo_add.rb +17 -0
  41. data/lib/caco/debian/apt_sources_list.rb +15 -0
  42. data/lib/caco/debian/apt_update.rb +33 -0
  43. data/lib/caco/debian/cell/service.rb +19 -0
  44. data/lib/caco/debian/cell/sources_list.rb +7 -0
  45. data/lib/caco/debian/package_install.rb +21 -0
  46. data/lib/caco/debian/package_installed.rb +17 -0
  47. data/lib/caco/debian/service_enable.rb +26 -0
  48. data/lib/caco/debian/service_install.rb +31 -0
  49. data/lib/caco/debian/user_home.rb +17 -0
  50. data/lib/caco/debian/view/service.erb +18 -0
  51. data/lib/caco/debian/view/sources_list.erb +10 -0
  52. data/lib/caco/downloader.rb +41 -0
  53. data/lib/caco/executer.rb +33 -0
  54. data/lib/caco/facter.rb +41 -0
  55. data/lib/caco/file_link.rb +36 -0
  56. data/lib/caco/file_reader.rb +24 -0
  57. data/lib/caco/file_writer.rb +57 -0
  58. data/lib/caco/finder.rb +13 -0
  59. data/lib/caco/grafana.rb +6 -0
  60. data/lib/caco/grafana/install.rb +26 -0
  61. data/lib/caco/haproxy.rb +12 -0
  62. data/lib/caco/haproxy/cell/conf_postgres.rb +4 -0
  63. data/lib/caco/haproxy/cell/conf_stats.rb +4 -0
  64. data/lib/caco/haproxy/conf_get.rb +15 -0
  65. data/lib/caco/haproxy/conf_set.rb +52 -0
  66. data/lib/caco/haproxy/install.rb +9 -0
  67. data/lib/caco/haproxy/view/conf_postgres.erb +25 -0
  68. data/lib/caco/haproxy/view/conf_stats.erb +6 -0
  69. data/lib/caco/macro.rb +2 -0
  70. data/lib/caco/postgres.rb +44 -0
  71. data/lib/caco/postgres/build_augeas.rb +20 -0
  72. data/lib/caco/postgres/conf_get.rb +37 -0
  73. data/lib/caco/postgres/conf_set.rb +54 -0
  74. data/lib/caco/postgres/database_create.rb +28 -0
  75. data/lib/caco/postgres/extension_create.rb +28 -0
  76. data/lib/caco/postgres/hba_set.rb +65 -0
  77. data/lib/caco/postgres/install.rb +34 -0
  78. data/lib/caco/postgres/shell.rb +13 -0
  79. data/lib/caco/postgres/sql.rb +17 -0
  80. data/lib/caco/postgres/user_change_password.rb +13 -0
  81. data/lib/caco/postgres/user_create.rb +33 -0
  82. data/lib/caco/prometheus.rb +15 -0
  83. data/lib/caco/prometheus/adapter_install_pg.rb +107 -0
  84. data/lib/caco/prometheus/adapter_install_postgresql.rb +47 -0
  85. data/lib/caco/prometheus/cell/alertmanager_conf.rb +4 -0
  86. data/lib/caco/prometheus/cell/alerts.rb +4 -0
  87. data/lib/caco/prometheus/cell/conf.rb +7 -0
  88. data/lib/caco/prometheus/exporter_install.rb +35 -0
  89. data/lib/caco/prometheus/install.rb +50 -0
  90. data/lib/caco/prometheus/install_alert_manager.rb +62 -0
  91. data/lib/caco/prometheus/view/alertmanager_conf.erb +13 -0
  92. data/lib/caco/prometheus/view/alerts.erb +18 -0
  93. data/lib/caco/prometheus/view/conf.erb +34 -0
  94. data/lib/caco/rbenv.rb +8 -0
  95. data/lib/caco/rbenv/cell/profile.rb +4 -0
  96. data/lib/caco/rbenv/install.rb +56 -0
  97. data/lib/caco/rbenv/install_version.rb +17 -0
  98. data/lib/caco/rbenv/view/profile.erb +3 -0
  99. data/lib/caco/repmgr.rb +15 -0
  100. data/lib/caco/repmgr/cell/conf.rb +43 -0
  101. data/lib/caco/repmgr/conf.rb +25 -0
  102. data/lib/caco/repmgr/install.rb +25 -0
  103. data/lib/caco/repmgr/node_register_primary.rb +34 -0
  104. data/lib/caco/repmgr/node_register_standby.rb +25 -0
  105. data/lib/caco/repmgr/node_registered.rb +15 -0
  106. data/lib/caco/repmgr/node_role.rb +18 -0
  107. data/lib/caco/repmgr/view/conf.erb +27 -0
  108. data/lib/caco/settings_loader.rb +67 -0
  109. data/lib/caco/settings_loader_monkeypatch.rb +28 -0
  110. data/lib/caco/ssh.rb +6 -0
  111. data/lib/caco/ssh/authorized_keys_add.rb +82 -0
  112. data/lib/caco/sudo.rb +6 -0
  113. data/lib/caco/sudo/sudoers_add.rb +15 -0
  114. data/lib/caco/timescale.rb +6 -0
  115. data/lib/caco/timescale/install.rb +25 -0
  116. data/lib/caco/unpacker.rb +76 -0
  117. data/lib/caco/version.rb +3 -0
  118. metadata +398 -0
@@ -0,0 +1,13 @@
1
+ global:
2
+ slack_api_url: 'https://hooks.slack.com/services/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'
3
+
4
+ route:
5
+ receiver: 'slack-notifications'
6
+ group_by: [alertname, datacenter, app]
7
+
8
+ receivers:
9
+ - name: 'slack-notifications'
10
+ slack_configs:
11
+ - send_resolved: true
12
+ - channel: '#monitoring'
13
+ text: 'https://internal.myorg.net/wiki/alerts/{{ .GroupLabels.app }}/{{ .GroupLabels.alertname }}'
@@ -0,0 +1,18 @@
1
+ groups:
2
+ - name: alert.rules
3
+ rules:
4
+ - alert: EndpointDown
5
+ expr: probe_success == 0
6
+ for: 10s
7
+ labels:
8
+ severity: 'critical'
9
+ annotations:
10
+ summary: 'Endpoint down'
11
+ - alert: ExporterDown
12
+ expr: up == 0
13
+ for: 1m
14
+ labels:
15
+ severity: warning
16
+ annotations:
17
+ summary: 'Exporter down (instance {{ $labels.instance }})'
18
+ description: 'Prometheus exporter down\n VALUE = {{ $value }}\n LABELS: {{ $labels }}'
@@ -0,0 +1,34 @@
1
+ global:
2
+ scrape_interval: 15s
3
+ evaluation_interval: 15s
4
+
5
+ remote_write:
6
+ - url: "http://127.0.0.1:9201/write"
7
+ remote_read:
8
+ - url: "http://127.0.0.1:9201/read"
9
+
10
+ rule_files:
11
+ - <%= root %>/alerts.d/*.rules
12
+
13
+ alerting:
14
+ alertmanagers:
15
+ - static_configs:
16
+ - targets:
17
+ - localhost:9093
18
+
19
+ scrape_configs:
20
+ - job_name: prometheus
21
+ static_configs:
22
+ - targets: ['localhost:9090']
23
+ - job_name: postgresql
24
+ static_configs:
25
+ - targets: ['localhost:9187']
26
+ - job_name: postgresql_adapter
27
+ static_configs:
28
+ - targets: ['localhost:9201']
29
+ - job_name: node_exporter
30
+ scrape_interval: 1m
31
+ scrape_timeout: 1m
32
+ metrics_path: '/metrics'
33
+ static_configs:
34
+ - targets: ['localhost:9100']
@@ -0,0 +1,8 @@
1
+ module Caco
2
+ module Rbenv
3
+ end
4
+ end
5
+
6
+ require 'caco/rbenv/install'
7
+ require 'caco/rbenv/install_version'
8
+ require 'caco/rbenv/cell/profile'
@@ -0,0 +1,4 @@
1
+ module Caco::Rbenv::Cell
2
+ class Profile < Trailblazer::Cell
3
+ end
4
+ end
@@ -0,0 +1,56 @@
1
+ module Caco::Rbenv
2
+ class Install < Trailblazer::Operation
3
+ CloneRepo = Class.new(Trailblazer::Activity::Signal)
4
+
5
+ step :install_packages!
6
+ step :repo_exist?, Output(CloneRepo, :clone_repo) => Path(connect_to: Id(:make_src)) do
7
+ step :clone_repo
8
+ end
9
+
10
+ pass Subprocess(Class.new(Caco::Executer)),
11
+ input: ->(_ctx, **) {{
12
+ command: "[ ! -f /opt/rbenv/libexec/rbenv-realpath.dylib ] && cd /opt/rbenv && src/configure && make -C src; true",
13
+ }},
14
+ Output(:failure) => Track(:success),
15
+ id: :make_src
16
+
17
+ step ->(ctx, **) {
18
+ ctx[:profile_content] = Caco::Rbenv::Cell::Profile.().to_s
19
+ },
20
+ id: :build_profile_content
21
+
22
+ step Subprocess(Caco::FileWriter),
23
+ input: ->(_ctx, profile_content:, **) {{
24
+ path: "/etc/profile.d/rbenv.sh",
25
+ content: profile_content
26
+ }}
27
+
28
+ def install_packages!(ctx, **)
29
+ packages = []
30
+ if Caco::Facter.("os", "distro", "codename") == "stretch"
31
+ packages = %w(git autoconf bison libssl-dev libyaml-dev libreadline-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev)
32
+ elsif Caco::Facter.("os", "distro", "codename") == "buster"
33
+ packages = %w(git autoconf bison libssl-dev libyaml-dev libreadline-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm6 libgdbm-dev)
34
+ end
35
+
36
+ packages.each do |package|
37
+ result = Caco::Debian::PackageInstall.(package: package)
38
+ return false if result.failure?
39
+ end
40
+ true
41
+ end
42
+
43
+ def repo_exist?(ctx, **)
44
+ self.class.repo_exist?
45
+ end
46
+
47
+ def self.repo_exist?
48
+ File.exist?("/opt/rbenv") ? true : CloneRepo
49
+ end
50
+
51
+ def clone_repo(ctx, **)
52
+ result = Caco::Executer.(command: "git clone https://github.com/rbenv/rbenv.git /opt/rbenv")
53
+ result.success?
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,17 @@
1
+ module Caco::Rbenv
2
+ class InstallVersion < Trailblazer::Operation
3
+ step Subprocess(Class.new(Caco::Executer)),
4
+ input: ->(_ctx, version:, **) {{
5
+ command: ". /etc/profile && /opt/rbenv/bin/rbenv versions|egrep --color \"^..#{version}(\s|$)\"",
6
+ }},
7
+ Output(:failure) => Id(:install_version),
8
+ id: :install_version_checker
9
+
10
+ step Subprocess(Class.new(Caco::Executer)),
11
+ input: ->(_ctx, version:, **) {{
12
+ command: ". /etc/profile && /opt/rbenv/bin/rbenv install #{version}",
13
+ }},
14
+ id: :install_version,
15
+ magnetic_to: nil
16
+ end
17
+ end
@@ -0,0 +1,3 @@
1
+ export PATH="/opt/rbenv/bin:$PATH"
2
+ export RBENV_ROOT="/opt/rbenv"
3
+ eval "$(rbenv init -)"
@@ -0,0 +1,15 @@
1
+ module Caco
2
+ module Repmgr
3
+ end
4
+ end
5
+
6
+ require 'caco/repmgr/conf'
7
+ require 'caco/repmgr/install'
8
+ require 'caco/repmgr/node_registered'
9
+ require 'caco/repmgr/node_role'
10
+
11
+ require 'caco/repmgr/node_register_primary'
12
+ require 'caco/repmgr/node_register_standby'
13
+
14
+ # Templates
15
+ require 'caco/repmgr/cell/conf'
@@ -0,0 +1,43 @@
1
+ module Caco::Repmgr::Cell
2
+ class Conf < Trailblazer::Cell
3
+ def node_id
4
+ property(:node_id)
5
+ end
6
+
7
+ def node_name
8
+ property(:node_name)
9
+ end
10
+
11
+ def primary_host
12
+ property(:primary_host)
13
+ end
14
+
15
+ def primary_user
16
+ property(:primary_user)
17
+ end
18
+
19
+ def primary_database
20
+ property(:primary_database)
21
+ end
22
+
23
+ def node_initial_role
24
+ property(:node_initial_role)
25
+ end
26
+
27
+ def postgres_version
28
+ property(:postgres_version)
29
+ end
30
+
31
+ def use_barman?
32
+ property(:use_barman) || false
33
+ end
34
+
35
+ def barman_host
36
+ property(:barman_host) || "barman"
37
+ end
38
+
39
+ def barman_server
40
+ property(:barman_server) || "pg"
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,25 @@
1
+ module Caco::Repmgr
2
+ class Conf < Trailblazer::Operation
3
+ step ->(ctx, **) {
4
+ ctx[:path] = "/etc/repmgr.conf"
5
+ },
6
+ id: :build_path
7
+
8
+ step :build_content
9
+
10
+ step Subprocess(Caco::FileWriter),
11
+ input: ->(_ctx, path:, content:, **) {{
12
+ path: path,
13
+ content: content
14
+ }},
15
+ output: {file_created: :created, file_changed: :changed}
16
+
17
+ def build_content(ctx, node_id:, node_name:, postgres_version:, **)
18
+ ctx[:content] = Caco::Repmgr::Cell::Conf.(
19
+ node_id: node_id,
20
+ node_name: node_name,
21
+ postgres_version: postgres_version
22
+ ).to_s
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ module Caco::Repmgr
2
+ class Install < Trailblazer::Operation
3
+ class Repo < Trailblazer::Operation
4
+ step Subprocess(Caco::Debian::AptKeyInstall),
5
+ input: ->(_ctx, **) {{
6
+ url: 'https://dl.2ndquadrant.com/gpg-key.asc',
7
+ fingerprint: '8565 305C EA7D 0B66 4933 D250 9904 CD4B D6BA F0C3'
8
+ }}
9
+ step Subprocess(Caco::Debian::AptRepoAdd),
10
+ input: ->(_ctx, **) {{
11
+ name: '2ndquadrant-dl-default-release',
12
+ url: 'https://dl.2ndquadrant.com/default/release/apt',
13
+ release: "#{Caco::Facter.("os", "distro", "codename")}-2ndquadrant",
14
+ component: 'main'
15
+ }}
16
+ end
17
+
18
+ step Subprocess(Repo)
19
+ step Subprocess(Caco::Debian::AptUpdate)
20
+ step Subprocess(Caco::Debian::PackageInstall),
21
+ input: ->(_ctx, **) {{
22
+ package: 'repmgr'
23
+ }}
24
+ end
25
+ end
@@ -0,0 +1,34 @@
1
+ module Caco::Repmgr
2
+ class NodeRegisterPrimary < Trailblazer::Operation
3
+ step Subprocess(Caco::Repmgr::NodeRole),
4
+ input: ->(_ctx, node_name:, **) {{
5
+ node_name: node_name
6
+ }},
7
+ id: :node_role,
8
+ Output(:success) => Id(:check_existing_id),
9
+ Output(:failure) => Track(:success)
10
+
11
+ step :check_existing_id, magnetic_to: nil,
12
+ Output(:success) => End(:success),
13
+ Output(:failure) => End(:failure)
14
+
15
+ step :verify_any_primary,
16
+ Output(:success) => End(:failure),
17
+ Output(:failure) => Track(:success)
18
+
19
+ step Subprocess(Class.new(Caco::Executer)),
20
+ input: ->(_ctx, node_name:, **) {{
21
+ command: "su - postgres -c 'repmgr primary register'"
22
+ }},
23
+ id: :repmgr_register_primary
24
+
25
+ def check_existing_id(ctx, node_role:, **)
26
+ return true if node_role == "primary"
27
+ false
28
+ end
29
+
30
+ def verify_any_primary(ctx, node_name:, output:, **)
31
+ output.match?(/^\s+[0-9]{1,}\s+\|\s(?!#{node_name})[^\s]+\s+\|\s+primary\s+\|/)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,25 @@
1
+ module Caco::Repmgr
2
+ class NodeRegisterStandby < Trailblazer::Operation
3
+ step Subprocess(Caco::Repmgr::NodeRole),
4
+ input: ->(_ctx, node_name:, **) {{
5
+ node_name: node_name
6
+ }},
7
+ id: :node_role,
8
+ Output(:success) => Id(:check_existing_id),
9
+ Output(:failure) => Track(:success)
10
+
11
+ step ->(ctx, node_role:, **) {
12
+ node_role == "standby"
13
+ },
14
+ magnetic_to: nil,
15
+ Output(:success) => End(:success),
16
+ Output(:failure) => End(:failure),
17
+ id: :check_existing_id
18
+
19
+ step Subprocess(Class.new(Caco::Executer)),
20
+ input: ->(_ctx, node_name:, **) {{
21
+ command: "su - postgres -c 'repmgr standby register'"
22
+ }},
23
+ id: :repmgr_register_primary
24
+ end
25
+ end
@@ -0,0 +1,15 @@
1
+ module Caco::Repmgr
2
+ class NodeRegistered < Trailblazer::Operation
3
+ step Subprocess(Caco::Executer),
4
+ input: ->(_ctx, node_name:, **) {{
5
+ command: "su - postgres -c 'repmgr cluster show --compact'"
6
+ }},
7
+ id: :repmgr_cluster_show
8
+
9
+ step ->(ctx, node_name:, output:, **) {
10
+ # set to ctx so can be used in other operations
11
+ ctx[:node_registered] = output.match?(/^\s+[0-9]{1,}\s+\|\s+#{node_name}\s+\|/)
12
+ },
13
+ id: :verify_node
14
+ end
15
+ end
@@ -0,0 +1,18 @@
1
+ module Caco::Repmgr
2
+ class NodeRole < Trailblazer::Operation
3
+ step Subprocess(NodeRegistered),
4
+ input: ->(_ctx, node_name:, **) {{
5
+ node_name: node_name
6
+ }},
7
+ id: :node_registered
8
+
9
+ step :verify_role
10
+
11
+ def verify_role(ctx, node_name:, output:, **)
12
+ match = output.match(/^\s+[0-9]{1,}\s+\|\s+db1\s+\|\s+([^\s]+)\s+\|/)
13
+ return false unless match
14
+
15
+ ctx[:node_role] = match[1]
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,27 @@
1
+ node_id=<%= node_id %>
2
+ node_name='<%= node_name %>'
3
+ conninfo='host=<%= primary_host %> user=<%= primary_user %> dbname=<%= primary_database %> connect_timeout=2'
4
+ data_directory='/var/lib/postgresql/<%= postgres_version %>/main'
5
+
6
+ use_replication_slots=yes
7
+ monitoring_history=yes
8
+
9
+ service_start_command = 'sudo /usr/bin/pg_ctlcluster <%= postgres_version %> main start'
10
+ service_stop_command = 'sudo /usr/bin/pg_ctlcluster <%= postgres_version %> main stop'
11
+ service_restart_command = 'sudo /usr/bin/pg_ctlcluster <%= postgres_version %> main restart'
12
+ service_reload_command = 'sudo /usr/bin/pg_ctlcluster <%= postgres_version %> main reload'
13
+ service_promote_command = 'sudo /usr/bin/pg_ctlcluster <%= postgres_version %> main promote'
14
+
15
+ promote_check_timeout = 15
16
+
17
+ failover=automatic
18
+ promote_command='/usr/bin/repmgr standby promote -f /etc/repmgr.conf --log-to-file'
19
+ follow_command='/usr/bin/repmgr standby follow -f /etc/repmgr.conf --log-to-file --upstream-node-id=%n'
20
+
21
+ log_file='/var/log/postgresql/repmgrd.log'
22
+
23
+ <% if use_barman? %>
24
+ barman_host='<%= barman_user %>@<%= barman_host %>'
25
+ barman_server='<%= barman_host %>'
26
+ restore_command='/usr/bin/barman-wal-restore <%= barman_host %> <%= barman_server %> %f %p'
27
+ <% end %>
@@ -0,0 +1,67 @@
1
+ require_relative "./settings_loader_monkeypatch"
2
+
3
+ module Caco
4
+ class SettingsLoader < Trailblazer::Operation
5
+ step :setup_validate_params
6
+ step :config_setup
7
+ step :hiera_setup_keys
8
+ step :set_caco_eyaml_parser
9
+ step :facter_needed_values
10
+ step :config_load
11
+ step :custom_config
12
+
13
+ def setup_validate_params(ctx, keys_path: nil, data_path: nil, **)
14
+ ctx[:keys_path] = !keys_path.nil? ? Pathname.new(keys_path) : Pathname.new(Caco.root.join("keys"))
15
+ ctx[:data_path] = !data_path.nil? ? Pathname.new(data_path) : Pathname.new(Caco.root.join("data"))
16
+ end
17
+
18
+ def config_setup(ctx, **)
19
+ Config.setup do |config|
20
+ config.const_name = 'Settings'
21
+ config.use_env = true
22
+ end
23
+ end
24
+
25
+ def hiera_setup_keys(ctx, keys_path:, **)
26
+ Hiera::Backend::Eyaml::Options[:pkcs7_public_key] = keys_path.join("public_key.pkcs7.pem")
27
+ Hiera::Backend::Eyaml::Options[:pkcs7_private_key] = keys_path.join("private_key.pkcs7.pem")
28
+ ctx[:parser] = Hiera::Backend::Eyaml::Parser::ParserFactory.encrypted_parser
29
+ end
30
+
31
+ def set_caco_eyaml_parser(ctx, parser:, **)
32
+ Caco.configure do |config|
33
+ config.eyaml_parser = parser
34
+ end
35
+ end
36
+
37
+ def facter_needed_values(ctx, **)
38
+ ctx[:facts] = {}
39
+ ctx[:facts][:facter_kernel] = Caco::Facter.("kernel")
40
+ ctx[:facts][:facter_os_name] = Caco::Facter.("os", "name")
41
+ ctx[:facts][:facter_distro_codename] = (ctx[:facts][:facter_kernel] == "Linux" ? Caco::Facter.("os", "distro", "codename") : nil)
42
+ ctx[:facts][:facter_release_full] = Caco::Facter.("os", "release", "full")
43
+ ctx[:facts][:facter_release_major] = Caco::Facter.("os", "release", "major")
44
+ ctx[:facts][:facter_release_minor] = Caco::Facter.("os", "release", "minor")
45
+ ctx[:facts][:facter_fqdn] = Caco::Facter.("networking", "fqdn")
46
+ end
47
+
48
+ def config_load(ctx, facts:, data_path:, **)
49
+ # From more generic to specific
50
+ Config.load_and_set_settings(
51
+ data_path.join("common.yaml"),
52
+ data_path.join("os", "#{facts[:facter_os_name]}.yaml"),
53
+ data_path.join("os", "#{facts[:facter_os_name]}", "#{facts[:facter_distro_codename]}.yaml"),
54
+ # maybe add some organizations here?
55
+ # maybe add some roles here?
56
+ data_path.join("nodes", "#{facts[:facter_fqdn]}"),
57
+ )
58
+ Settings.reload!
59
+ end
60
+
61
+ def custom_config(ctx, **)
62
+ Settings.prometheus = Config::Options.new
63
+ Settings.prometheus.root = "/opt/prometheus"
64
+ Settings.prometheus.config_root = "/etc/prometheus"
65
+ end
66
+ end
67
+ end