kubernetes/kops · error
failed to get hostname: %w
Error message
failed to get hostname: %w
What it means
getHostname runs `hostname` over SSH and wraps any failure from runCommand. Since the hostname becomes the node name for registration, kOps aborts bootstrap data generation when it cannot be determined. All SSH-layer failures (session open, auth, non-zero exit) surface wrapped here.
Source
Thrown at pkg/commands/toolbox_enroll.go:419
// We send both to stderr, so we don't "corrupt" stdout
session.Stdout = io.MultiWriter(os.Stderr, session.Stdout)
session.Stderr = io.MultiWriter(os.Stderr, session.Stderr)
}
if s.sudo {
command = "sudo " + command
}
if err := session.Run(command); err != nil {
return output, fmt.Errorf("error running command %q: %w", command, err)
}
return output, nil
}
// getHostname gets the hostname of the SSH target.
// This is used as the node name when registering the node.
func (s *SSHHost) getHostname(ctx context.Context) (string, error) {
output, err := s.runCommand(ctx, "hostname", ExecOptions{Echo: true})
if err != nil {
return "", fmt.Errorf("failed to get hostname: %w", err)
}
hostname := output.Stdout.String()
hostname = strings.TrimSpace(hostname)
if len(hostname) == 0 {
return "", fmt.Errorf("hostname was empty")
}
return hostname, nil
}
type BootstrapData struct {
// NodeupScript is a script that can be used to bootstrap the node.
NodeupScript []byte
// NodeupConfig is structured configuration, provided by kops-controller (for example).
NodeupConfig *nodeup.Config
// NodeupScriptAdditionalFiles are additional files that are needed by the nodeup script.
NodeupScriptAdditionalFiles map[string][]byte
}View on GitHub (pinned to 4c8573c808)
Solutions
- Test SSH connectivity manually: ssh <user>@<host> hostname
- Check SSH user/key and sudo configuration used by kops toolbox enroll
- Confirm the node's sshd is up and the security group/firewall allows port 22
- Inspect the wrapped cause with errors.Unwrap / %v for the root SSH error
Example fix
// before
hostname, err := host.getHostname(ctx) // opaque failure
// after
hostname, err := host.getHostname(ctx)
if err != nil {
return fmt.Errorf("enroll: check SSH access to %s: %w", host.addr, err)
} Defensive patterns
Strategy: try-catch
Validate before calling
out, err := exec.Command("ssh", "-o", "BatchMode=yes", user+"@"+host, "hostname").Output()
if err != nil || len(strings.TrimSpace(string(out))) == 0 {
return fmt.Errorf("cannot determine hostname of %s", host)
} Type guard
func isHostnameLookupFailure(err error) bool {
return err != nil && strings.Contains(err.Error(), "failed to get hostname")
} Try / catch
hostname, err := host.getHostname(ctx)
if err != nil {
return fmt.Errorf("verify SSH access/credentials for node enrollment: %w", err)
} Prevention
- Test SSH access with the exact user/key before enrolling
- Confirm sshd is running and port 22 is open
- Avoid custom shells/profiles that interfere with non-interactive commands
When it happens
Trigger: buildHostData calls getHostname and the SSH `hostname` command fails: connection dropped, authentication rejected, command exited non-zero, or sudo is misconfigured.
Common situations: Wrong SSH credentials/user in enroll flags; host unreachable or firewalled; sshd not running on a freshly provisioned node; sudo not permitted for the enroll user.
Related errors
- hostname was empty
- method DeleteSSHCredential not supported in server-side clie
- method AddSSHPublicKey not supported in server-side client
- must specify %q label with cluster name to create SSHCredent
- spec.PublicKey is required
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/c12f3d835537e1a5.
Report an issue: GitHub.