raijin-server 0.2.11__py3-none-any.whl → 0.2.12__py3-none-any.whl

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.
raijin_server/__init__.py CHANGED
@@ -1,5 +1,5 @@
1
1
  """Pacote principal do CLI Raijin Server."""
2
2
 
3
- __version__ = "0.2.11"
3
+ __version__ = "0.2.12"
4
4
 
5
5
  __all__ = ["__version__"]
raijin_server/cli.py CHANGED
@@ -32,6 +32,7 @@ from raijin_server.modules import (
32
32
  kong,
33
33
  kubernetes,
34
34
  loki,
35
+ metallb,
35
36
  minio,
36
37
  network,
37
38
  observability_dashboards,
@@ -85,6 +86,7 @@ MODULES: Dict[str, Callable[[ExecutionContext], None]] = {
85
86
  "vpn": vpn.run,
86
87
  "kubernetes": kubernetes.run,
87
88
  "calico": calico.run,
89
+ "metallb": metallb.run,
88
90
  "traefik": traefik.run, # mover antes do cert_manager para refletir dependencia
89
91
  "cert_manager": cert_manager.run,
90
92
  "istio": istio.run,
@@ -119,6 +121,7 @@ MODULE_DESCRIPTIONS: Dict[str, str] = {
119
121
  "vpn": "Provisiona WireGuard com cliente inicial",
120
122
  "kubernetes": "Instala kubeadm/kubelet/kubectl e inicializa cluster",
121
123
  "calico": "CNI Calico e politica default deny",
124
+ "metallb": "LoadBalancer em bare metal (pool L2)",
122
125
  "cert_manager": "Instala cert-manager e ClusterIssuer ACME",
123
126
  "istio": "Service mesh Istio via Helm",
124
127
  "traefik": "Ingress controller Traefik com TLS",
@@ -0,0 +1,85 @@
1
+ """Provisiona MetalLB (L2) com pool de IPs para LoadBalancer em ambientes bare metal."""
2
+
3
+ import typer
4
+
5
+ from raijin_server.utils import ExecutionContext, helm_upgrade_install, require_root, run_cmd
6
+
7
+
8
+ def run(ctx: ExecutionContext) -> None:
9
+ require_root(ctx)
10
+ typer.echo("Instalando MetalLB via Helm...")
11
+
12
+ pool = typer.prompt(
13
+ "Pool de IPs (range ou CIDR) para services LoadBalancer",
14
+ default="192.168.1.240-192.168.1.250",
15
+ )
16
+
17
+ # Instala control-plane + speaker
18
+ helm_upgrade_install(
19
+ release="metallb",
20
+ chart="metallb",
21
+ namespace="metallb-system",
22
+ repo="metallb",
23
+ repo_url="https://metallb.github.io/metallb",
24
+ ctx=ctx,
25
+ values=[],
26
+ )
27
+
28
+ # Espera recursos principais ficarem prontos
29
+ run_cmd(
30
+ [
31
+ "kubectl",
32
+ "-n",
33
+ "metallb-system",
34
+ "rollout",
35
+ "status",
36
+ "deployment/controller",
37
+ "--timeout",
38
+ "180s",
39
+ ],
40
+ ctx,
41
+ check=False,
42
+ )
43
+ run_cmd(
44
+ [
45
+ "kubectl",
46
+ "-n",
47
+ "metallb-system",
48
+ "rollout",
49
+ "status",
50
+ "daemonset/speaker",
51
+ "--timeout",
52
+ "180s",
53
+ ],
54
+ ctx,
55
+ check=False,
56
+ )
57
+
58
+ # Aplica IPAddressPool + L2Advertisement
59
+ manifest = f"""
60
+ apiVersion: metallb.io/v1beta1
61
+ kind: IPAddressPool
62
+ metadata:
63
+ name: raijin-pool
64
+ namespace: metallb-system
65
+ spec:
66
+ addresses:
67
+ - {pool}
68
+ ---
69
+ apiVersion: metallb.io/v1beta1
70
+ kind: L2Advertisement
71
+ metadata:
72
+ name: raijin-l2
73
+ namespace: metallb-system
74
+ spec:
75
+ ipAddressPools:
76
+ - raijin-pool
77
+ """
78
+
79
+ run_cmd(
80
+ f"echo '{manifest}' | kubectl apply -f -",
81
+ ctx,
82
+ use_shell=True,
83
+ )
84
+
85
+ typer.secho("\n✓ MetalLB aplicado. Services LoadBalancer usarao o pool informado.", fg=typer.colors.GREEN, bold=True)
@@ -1,8 +1,34 @@
1
1
  """Configuracao do Traefik via Helm com TLS/ACME e ingressClass."""
2
2
 
3
+ import socket
4
+
3
5
  import typer
4
6
 
5
- from raijin_server.utils import ExecutionContext, helm_upgrade_install, require_root
7
+ from raijin_server.utils import ExecutionContext, helm_upgrade_install, require_root, run_cmd
8
+
9
+
10
+ def _detect_node_name(ctx: ExecutionContext) -> str:
11
+ """Tenta obter o nome do node via kubectl; fallback para hostname local.
12
+
13
+ Em execucao no control-plane, o nome do node retornado pelo kubeadm init e o desejado
14
+ para o nodeSelector (kubernetes.io/hostname)."""
15
+
16
+ result = run_cmd(
17
+ [
18
+ "kubectl",
19
+ "get",
20
+ "nodes",
21
+ "-o",
22
+ "jsonpath={.items[0].metadata.name}",
23
+ ],
24
+ ctx,
25
+ check=False,
26
+ )
27
+ if result.returncode == 0:
28
+ node_name = (result.stdout or "").strip()
29
+ if node_name:
30
+ return node_name
31
+ return socket.gethostname()
6
32
 
7
33
 
8
34
  def run(ctx: ExecutionContext) -> None:
@@ -12,6 +38,8 @@ def run(ctx: ExecutionContext) -> None:
12
38
  acme_email = typer.prompt("Email para ACME/Let's Encrypt", default="admin@example.com")
13
39
  dashboard_host = typer.prompt("Host para dashboard (opcional)", default="traefik.local")
14
40
 
41
+ node_name = _detect_node_name(ctx)
42
+
15
43
  values = [
16
44
  "ingressClass.enabled=true",
17
45
  "ingressClass.isDefaultClass=true",
@@ -21,6 +49,14 @@ def run(ctx: ExecutionContext) -> None:
21
49
  "certificatesResolvers.letsencrypt.acme.httpChallenge.entryPoint=web",
22
50
  "logs.general.level=INFO",
23
51
  "providers.kubernetesIngress.ingressClass=traefik",
52
+ # Permite agendar em control-plane de cluster single-node
53
+ "tolerations[0].key=node-role.kubernetes.io/control-plane",
54
+ "tolerations[0].operator=Exists",
55
+ "tolerations[0].effect=NoSchedule",
56
+ "tolerations[1].key=node-role.kubernetes.io/master",
57
+ "tolerations[1].operator=Exists",
58
+ "tolerations[1].effect=NoSchedule",
59
+ f"nodeSelector.kubernetes.io/hostname={node_name}",
24
60
  ]
25
61
 
26
62
  if dashboard_host:
@@ -19,6 +19,7 @@ from raijin_server.utils import ExecutionContext, logger
19
19
  MODULE_DEPENDENCIES = {
20
20
  "kubernetes": ["essentials", "network", "firewall"],
21
21
  "calico": ["kubernetes"],
22
+ "metallb": ["kubernetes"],
22
23
  "cert_manager": ["kubernetes", "traefik"],
23
24
  "istio": ["kubernetes", "calico"],
24
25
  "traefik": ["kubernetes"],
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: raijin-server
3
- Version: 0.2.11
3
+ Version: 0.2.12
4
4
  Summary: CLI para automacao de setup e hardening de servidores Ubuntu Server.
5
5
  Home-page: https://example.com/raijin-server
6
6
  Author: Equipe Raijin
@@ -188,6 +188,7 @@ sudo -E ~/.venvs/midgard/bin/raijin-server debug journal --service containerd --
188
188
  - **Publicação PyPI**: ver seção "Publicar no PyPI" abaixo
189
189
  - **CNI automático**: Calico aplicado automaticamente no passo Kubernetes (override com `RAIJIN_CNI=none`)
190
190
  - Para reaplicar CNI (forçar mesmo se já houver): `RAIJIN_FORCE_CNI=1`
191
+ - **LoadBalancer bare metal**: módulo `metallb` aplica pool L2 para Services `LoadBalancer`
191
192
 
192
193
  ## Fluxo de Execução Recomendado
193
194
 
@@ -204,6 +205,7 @@ sudo -E ~/.venvs/midgard/bin/raijin-server firewall
204
205
  # 3. Kubernetes
205
206
  sudo -E ~/.venvs/midgard/bin/raijin-server kubernetes
206
207
  sudo -E ~/.venvs/midgard/bin/raijin-server calico
208
+ sudo -E ~/.venvs/midgard/bin/raijin-server metallb # se ambiente bare metal e quiser Service LoadBalancer
207
209
  sudo -E ~/.venvs/midgard/bin/raijin-server secrets
208
210
  sudo -E ~/.venvs/midgard/bin/raijin-server cert-manager
209
211
 
@@ -1,9 +1,9 @@
1
- raijin_server/__init__.py,sha256=X-WgXauA_EB6WFZnnOWQLbz2ucFYbMATjTaZtzqA67A,95
2
- raijin_server/cli.py,sha256=DwzUP5Ps-vgiOwXRjACukgHWFo-7FAnDrILbgWhs2ys,28475
1
+ raijin_server/__init__.py,sha256=8EQqPmA-imVG2M15r3TTUVfAWVTZtkqrtafb-1P_NAE,95
2
+ raijin_server/cli.py,sha256=71nn7QN0f3MJkXcHr0STXmxljr-CaPibzOoiItbOT88,28571
3
3
  raijin_server/config.py,sha256=QNiEVvrbW56XgvNn5-h3bkJm46Xc8mjNqPbvixXD8N0,4829
4
4
  raijin_server/healthchecks.py,sha256=lzXdFw6S0hOYbUKbqksh4phb04lXgXdTspP1Dsz4dx8,15401
5
5
  raijin_server/utils.py,sha256=9RnGnPoUTYOpMVRLNa4P4lIQrJNQLkSkPUxycZRGv78,20827
6
- raijin_server/validators.py,sha256=-V3BX1hF_i2on7v-7Gu6u4ilhQaVJX4jTnwqvR3uEng,9432
6
+ raijin_server/validators.py,sha256=5SpGz0aDmt60v19KJQSU-VpQOVc3WyNJQn45acUhq0Q,9463
7
7
  raijin_server/modules/__init__.py,sha256=e_IbkhLGPcF8to9QUmIESP6fpcTOYcIhaXLKIvqRJMY,920
8
8
  raijin_server/modules/apokolips_demo.py,sha256=8ltsXRbVDwlDwLMIvh02NG-FeAfBWw_v6lh7IGOyNqs,13725
9
9
  raijin_server/modules/bootstrap.py,sha256=oVIGNRW_JbgY8zXNHGAIP0vGbbHNHyQexthxo5zhbcw,9762
@@ -20,6 +20,7 @@ raijin_server/modules/kafka.py,sha256=bp8k_IhuAIO6dL0IpK1UxxLZoGih6nJp0ZnzwmiZEj
20
20
  raijin_server/modules/kong.py,sha256=2EZKYBmBhm_7Nduw9PWrvrekp0VCxQbc2gElpAJqKfg,491
21
21
  raijin_server/modules/kubernetes.py,sha256=waSf2cCVnLicN5o3M47MzMzmHHtvKeFXm1__8ynQzA0,11871
22
22
  raijin_server/modules/loki.py,sha256=erwFfSiSFOv-Ul3nFdrI2RElPYuqqBPBBa_MJAwyLys,676
23
+ raijin_server/modules/metallb.py,sha256=Lu25tU1O00ObqNeIGrpMJhSxPOEeCN4tI9z18Xqqtpk,1918
23
24
  raijin_server/modules/minio.py,sha256=BVvsEaJlJUV92_ep7pKsBhSYPjWZrDOB3J6XAWYAHYg,486
24
25
  raijin_server/modules/network.py,sha256=QRlYdcryCCPAWG3QQ_W7ld9gJgETI7H8gwntOU7UqFE,4818
25
26
  raijin_server/modules/observability_dashboards.py,sha256=fVz0WEOQrUTF5rJ__Nu_onyBuwL_exFmysWMmg8AE9w,7319
@@ -28,7 +29,7 @@ raijin_server/modules/prometheus.py,sha256=Rs9BREmaoKlyteNdAQZnSIeJfsRO0RQKyyL2g
28
29
  raijin_server/modules/sanitize.py,sha256=_RnWn1DUuNrzx3NnKEbMvf5iicgjiN_ubwT59e0rYWY,6040
29
30
  raijin_server/modules/secrets.py,sha256=xpV3gIMnwQdAI2j69Ck5daIK4wlYJA_1rkWTtSfVNk0,3715
30
31
  raijin_server/modules/ssh_hardening.py,sha256=oQdk-EVnEHNMKIWvoFuZzI4jK0nNO8IAY4hkB4pj8zw,4025
31
- raijin_server/modules/traefik.py,sha256=Uj7RljGl6goVrpiTqHe0MYdFmIYaFrTk1OJcIVvXiwg,1321
32
+ raijin_server/modules/traefik.py,sha256=hHjWl8UQodm_wwVOp0TzeYCVf3SpHt_tbgQtvkJi8FY,2467
32
33
  raijin_server/modules/velero.py,sha256=_CV0QQnWr5L-CWXDOiD9Ef4J7GaQT-s9yNBwqp_FLOY,1395
33
34
  raijin_server/modules/vpn.py,sha256=hF-0vA17VKTxhQLDBSEeqI5aPQpiaaj4IpUf9l6lr64,8297
34
35
  raijin_server/scripts/__init__.py,sha256=deduGfHf8BMVWred4ux5LfBDT2NJ5XYeJAt2sDEU4qs,53
@@ -36,9 +37,9 @@ raijin_server/scripts/checklist.sh,sha256=j6E0Kmk1EfjLvKK1VpCqzXJAXI_7Bm67LK4ndy
36
37
  raijin_server/scripts/install.sh,sha256=Y1ickbQ4siQ0NIPs6UgrqUr8WWy7U0LHmaTQbEgavoI,3949
37
38
  raijin_server/scripts/log_size_metric.sh,sha256=Iv4SsX8AuCYRou-klYn32mX41xB6j0xJGLBO6riw4rU,1208
38
39
  raijin_server/scripts/pre-deploy-check.sh,sha256=XqMo7IMIpwUHF17YEmU0-cVmTDMoCGMBFnmS39FidI4,4912
39
- raijin_server-0.2.11.dist-info/licenses/LICENSE,sha256=kJsMCjOiRZE0AQNtxWqBa32z9kMAaF4EUxyHj3hKaJo,1105
40
- raijin_server-0.2.11.dist-info/METADATA,sha256=Hhlmq5QeE3oviScZiun7MNj28psTCSQ44EPIAmCpREk,22276
41
- raijin_server-0.2.11.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
42
- raijin_server-0.2.11.dist-info/entry_points.txt,sha256=3ZvxDX4pvcjkIRsXAJ69wIfVmKa78LKo-C3QhqN2KVM,56
43
- raijin_server-0.2.11.dist-info/top_level.txt,sha256=Yz1xneCRtsZOzbPIcTAcrSxd-1p80pohMXYAZ74dpok,14
44
- raijin_server-0.2.11.dist-info/RECORD,,
40
+ raijin_server-0.2.12.dist-info/licenses/LICENSE,sha256=kJsMCjOiRZE0AQNtxWqBa32z9kMAaF4EUxyHj3hKaJo,1105
41
+ raijin_server-0.2.12.dist-info/METADATA,sha256=CcMKtrz7OPs4ThoJ7d-ivF4RYeZ_bekHlwi8XrzOnDw,22476
42
+ raijin_server-0.2.12.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
43
+ raijin_server-0.2.12.dist-info/entry_points.txt,sha256=3ZvxDX4pvcjkIRsXAJ69wIfVmKa78LKo-C3QhqN2KVM,56
44
+ raijin_server-0.2.12.dist-info/top_level.txt,sha256=Yz1xneCRtsZOzbPIcTAcrSxd-1p80pohMXYAZ74dpok,14
45
+ raijin_server-0.2.12.dist-info/RECORD,,