fix: recover Talos control plane bootstrap

This commit is contained in:
eding 2026-07-26 21:22:38 +02:00
parent dc8b49d576
commit ecd2fece59

View file

@ -481,12 +481,18 @@ func applyTalosConfigs(dir string, cfg config.Config) error {
return fmt.Errorf("apply Talos config to %s: %w", node.Name, err) return fmt.Errorf("apply Talos config to %s: %w", node.Name, err)
} }
} else { } else {
if _, maintenanceErr := utils.RunCommandQuietOutputInDir(dir, "talosctl", "get", "machinestatus", "--insecure", "--nodes="+nodeAddress, "--endpoints="+nodeAddress, "--output=json"); maintenanceErr != nil { if _, maintenanceErr := utils.RunCommandQuietOutputInDir(dir, "talosctl", "get", "machinestatus", "--insecure", "--nodes="+nodeAddress, "--endpoints="+nodeAddress, "--output=json"); maintenanceErr == nil {
return fmt.Errorf("determine Talos state for %s; refusing insecure takeover", node.Name)
}
if err := utils.RunCommandInDir(dir, "talosctl", "apply-config", "--insecure", "--nodes="+nodeAddress, "--endpoints="+nodeAddress, "--file="+configFile); err != nil { if err := utils.RunCommandInDir(dir, "talosctl", "apply-config", "--insecure", "--nodes="+nodeAddress, "--endpoints="+nodeAddress, "--file="+configFile); err != nil {
return fmt.Errorf("apply initial Talos config to %s: %w", node.Name, err) return fmt.Errorf("apply initial Talos config to %s: %w", node.Name, err)
} }
} else {
if err := waitForTalosAPI(dir, cfg, nodeAddress); err != nil {
return fmt.Errorf("determine Talos state for %s: %w", node.Name, err)
}
if err := utils.RunCommandInDir(dir, "talosctl", secureArgs...); err != nil {
return fmt.Errorf("apply Talos config to %s: %w", node.Name, err)
}
}
} }
if err := waitForTalosReboot(dir, cfg, nodeAddress); err != nil { if err := waitForTalosReboot(dir, cfg, nodeAddress); err != nil {
return fmt.Errorf("wait for %s: %w", node.Name, err) return fmt.Errorf("wait for %s: %w", node.Name, err)
@ -499,13 +505,14 @@ func bootstrapEtcdIfNeeded(dir string, cfg config.Config) error {
if _, err := utils.RunCommandQuietOutputInDir(dir, "talosctl", "etcd", "status", "--talosconfig=./clusterconfig/talosconfig", "--endpoints="+cfg.Talos.BootstrapEndpoint, "--nodes="+cfg.Talos.BootstrapNode); err == nil { if _, err := utils.RunCommandQuietOutputInDir(dir, "talosctl", "etcd", "status", "--talosconfig=./clusterconfig/talosconfig", "--endpoints="+cfg.Talos.BootstrapEndpoint, "--nodes="+cfg.Talos.BootstrapNode); err == nil {
return nil return nil
} }
if members, err := utils.RunCommandQuietOutputInDir(dir, "talosctl", "get", "members", "--talosconfig=./clusterconfig/talosconfig", "--endpoints="+cfg.Talos.BootstrapEndpoint, "--nodes="+cfg.Talos.BootstrapNode, "--output=json"); err == nil && len(strings.TrimSpace(string(members))) > 0 {
return errors.New("etcd members exist but etcd status is unavailable; refusing to bootstrap an existing cluster")
}
return utils.RunCommandInDir(dir, "talosctl", "bootstrap", "--talosconfig=./clusterconfig/talosconfig", "--endpoints="+cfg.Talos.BootstrapEndpoint, "--nodes="+cfg.Talos.BootstrapNode) return utils.RunCommandInDir(dir, "talosctl", "bootstrap", "--talosconfig=./clusterconfig/talosconfig", "--endpoints="+cfg.Talos.BootstrapEndpoint, "--nodes="+cfg.Talos.BootstrapNode)
} }
func waitForTalosReboot(dir string, cfg config.Config, node string) error { func waitForTalosReboot(dir string, cfg config.Config, node string) error {
return waitForTalosAPI(dir, cfg, node)
}
func waitForTalosAPI(dir string, cfg config.Config, node string) error {
deadline := time.Now().Add(5 * time.Minute) deadline := time.Now().Add(5 * time.Minute)
for time.Now().Before(deadline) { for time.Now().Before(deadline) {
if _, err := utils.RunCommandQuietOutputInDir(dir, "talosctl", "get", "machinestatus", "--output=json", "--talosconfig=./clusterconfig/talosconfig", "--endpoints="+node, "--nodes="+node); err == nil { if _, err := utils.RunCommandQuietOutputInDir(dir, "talosctl", "get", "machinestatus", "--output=json", "--talosconfig=./clusterconfig/talosconfig", "--endpoints="+node, "--nodes="+node); err == nil {