annotate tasks.py @ 12:b6720e379d5b

config updates
author drewp@bigasterisk.com
date Tue, 14 Mar 2023 20:04:06 -0700
parents 2023a6ce7bc0
children 2c37fab420da
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10
2023a6ce7bc0 some of the config-rebuild code
drewp@bigasterisk.com
parents: 4
diff changeset
1 import json
2023a6ce7bc0 some of the config-rebuild code
drewp@bigasterisk.com
parents: 4
diff changeset
2 import sys
2023a6ce7bc0 some of the config-rebuild code
drewp@bigasterisk.com
parents: 4
diff changeset
3 import tempfile
2023a6ce7bc0 some of the config-rebuild code
drewp@bigasterisk.com
parents: 4
diff changeset
4 import time
4
1eb6e6a2b9b6 version control configs finally; use configmaps to present them to VM
drewp@bigasterisk.com
parents:
diff changeset
5 import urllib.request
10
2023a6ce7bc0 some of the config-rebuild code
drewp@bigasterisk.com
parents: 4
diff changeset
6 from pathlib import Path
2023a6ce7bc0 some of the config-rebuild code
drewp@bigasterisk.com
parents: 4
diff changeset
7 from typing import Dict
2023a6ce7bc0 some of the config-rebuild code
drewp@bigasterisk.com
parents: 4
diff changeset
8
4
1eb6e6a2b9b6 version control configs finally; use configmaps to present them to VM
drewp@bigasterisk.com
parents:
diff changeset
9 from invoke import task
1eb6e6a2b9b6 version control configs finally; use configmaps to present them to VM
drewp@bigasterisk.com
parents:
diff changeset
10
12
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
11 sys.path.append('/usr/lib/python3/dist-packages/')
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
12 import yaml
4
1eb6e6a2b9b6 version control configs finally; use configmaps to present them to VM
drewp@bigasterisk.com
parents:
diff changeset
13
12
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
14 _tfs = []
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
15
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
16
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
17 def saveTmp(text):
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
18 tf = tempfile.NamedTemporaryFile(mode='wt')
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
19 _tfs.append(tf)
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
20 tf.write(text)
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
21 tf.flush()
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
22 return Path(tf.name)
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
23
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
24
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
25 def writeConfigmap(ctx, files: Dict[str, Path]):
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
26 arg = ','.join(f'{k}={v}' for k, v in files.items())
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
27 ctx.run(
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
28 f'kubectl create configmap victoriametrics-config --from-file {arg} -o yaml --dry-run=client | kubectl apply -f -'
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
29 )
4
1eb6e6a2b9b6 version control configs finally; use configmaps to present them to VM
drewp@bigasterisk.com
parents:
diff changeset
30
1eb6e6a2b9b6 version control configs finally; use configmaps to present them to VM
drewp@bigasterisk.com
parents:
diff changeset
31
1eb6e6a2b9b6 version control configs finally; use configmaps to present them to VM
drewp@bigasterisk.com
parents:
diff changeset
32 def reload(ctx, svc):
1eb6e6a2b9b6 version control configs finally; use configmaps to present them to VM
drewp@bigasterisk.com
parents:
diff changeset
33 host = ctx.run(f'khost {svc}').stdout
12
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
34 path = {'victoriametrics': '/m/', 'vmalert': '/'}[svc]
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
35 reload_url = f'http://{host}{path}-/reload'
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
36 print(f'reload with POST {reload_url}')
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
37 for workaround in [1]:
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
38 print(' -> status',
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
39 urllib.request.urlopen(reload_url, data=b'unused').status)
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
40 time.sleep(0)
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
41
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
42
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
43 def httpsCertProber():
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
44 domains = []
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
45 for line in open(
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
46 '/my/doc/ssl/letsencrypt/run.py'): # moved to cert-manager
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
47 if line.startswith('update_certs('):
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
48 domains.append(line.split("'")[1])
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
49 relabel = {
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
50 'relabel_configs': [{
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
51 'source_labels': ['__address__'],
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
52 'target_label': '__param_target'
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
53 }, {
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
54 'source_labels': ['__param_target'],
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
55 'target_label': 'instance'
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
56 }, {
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
57 'target_label': '__address__',
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
58 'replacement': 'prober'
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
59 }]
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
60 }
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
61 return yaml.dump( # Note that an included file must skip the scrape_configs toplevel key and just include the list.
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
62 [{
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
63 'job_name': 'prober',
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
64 'scrape_interval': '24h',
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
65 'metrics_path': '/probe',
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
66 'params': {
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
67 'module': ['https']
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
68 },
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
69 'static_configs': [{
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
70 'targets': domains
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
71 }],
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
72 } | relabel])
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
73
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
74
10
2023a6ce7bc0 some of the config-rebuild code
drewp@bigasterisk.com
parents: 4
diff changeset
75 def hostsExpectedOnline(ctx):
2023a6ce7bc0 some of the config-rebuild code
drewp@bigasterisk.com
parents: 4
diff changeset
76 return ctx.run(
2023a6ce7bc0 some of the config-rebuild code
drewp@bigasterisk.com
parents: 4
diff changeset
77 'cd /my/serv/lanscape; pdm run python hosts_expected_online.py').stdout
2023a6ce7bc0 some of the config-rebuild code
drewp@bigasterisk.com
parents: 4
diff changeset
78
2023a6ce7bc0 some of the config-rebuild code
drewp@bigasterisk.com
parents: 4
diff changeset
79
12
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
80 def expectedK8sNodes(ctx):
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
81 getNode = json.loads(ctx.run("kubectl get node -o json").stdout)
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
82 hosts = [item['metadata']['name'] for item in getNode['items']]
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
83 return yaml.dump({
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
84 'groups': [{
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
85 'name':
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
86 'k8s_expected_nodes',
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
87 'rules': [{
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
88 'alert':
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
89 'kube_node_log_size_report_' + h,
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
90 'expr':
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
91 'absent(kubelet_container_log_filesystem_used_bytes{instance="%s"})'
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
92 % h,
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
93 'for':
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
94 '1h',
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
95 'annotations': {
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
96 'summary': f"no recent k8s log size report from host {h}"
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
97 }
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
98 } for h in hosts]
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
99 }]
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
100 })
4
1eb6e6a2b9b6 version control configs finally; use configmaps to present them to VM
drewp@bigasterisk.com
parents:
diff changeset
101
1eb6e6a2b9b6 version control configs finally; use configmaps to present them to VM
drewp@bigasterisk.com
parents:
diff changeset
102
1eb6e6a2b9b6 version control configs finally; use configmaps to present them to VM
drewp@bigasterisk.com
parents:
diff changeset
103 @task
1eb6e6a2b9b6 version control configs finally; use configmaps to present them to VM
drewp@bigasterisk.com
parents:
diff changeset
104 def sync_config(ctx):
12
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
105 config = Path('config')
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
106 for workaround in [1]:
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
107 writeConfigmap(
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
108 ctx, {
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
109 # 'scrape_ssl.yaml': saveTmp(httpsCertProber()),
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
110 'rules_expected_nodes.yaml': saveTmp(expectedK8sNodes(ctx)),
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
111 'rules_expected_hosts.yaml': saveTmp(hostsExpectedOnline(ctx)),
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
112 })
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
113 reload(ctx, 'victoriametrics')
4
1eb6e6a2b9b6 version control configs finally; use configmaps to present them to VM
drewp@bigasterisk.com
parents:
diff changeset
114
12
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
115 # this reload doesn't get the new config- not sure if it's vmalert bug or k8s cm propogation problem
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
116 # reload(ctx, 'vmalert')
b6720e379d5b config updates
drewp@bigasterisk.com
parents: 10
diff changeset
117 ctx.run('kubectl rollout restart deploy/vmalert')
10
2023a6ce7bc0 some of the config-rebuild code
drewp@bigasterisk.com
parents: 4
diff changeset
118
2023a6ce7bc0 some of the config-rebuild code
drewp@bigasterisk.com
parents: 4
diff changeset
119 @task
2023a6ce7bc0 some of the config-rebuild code
drewp@bigasterisk.com
parents: 4
diff changeset
120 def build_config(ctx):
2023a6ce7bc0 some of the config-rebuild code
drewp@bigasterisk.com
parents: 4
diff changeset
121 with open('rules/build/expected_hosts.yaml', 'w') as out:
2023a6ce7bc0 some of the config-rebuild code
drewp@bigasterisk.com
parents: 4
diff changeset
122 out.write(hostsExpectedOnline(ctx))