diff --git a/helper/communicator/config.go b/helper/communicator/config.go index 72dc69b7e..4c316ff69 100644 --- a/helper/communicator/config.go +++ b/helper/communicator/config.go @@ -15,13 +15,14 @@ type Config struct { Type string `mapstructure:"communicator"` // SSH - SSHHost string `mapstructure:"ssh_host"` - SSHPort int `mapstructure:"ssh_port"` - SSHUsername string `mapstructure:"ssh_username"` - SSHPassword string `mapstructure:"ssh_password"` - SSHPrivateKey string `mapstructure:"ssh_private_key_file"` - SSHPty bool `mapstructure:"ssh_pty"` - SSHTimeout time.Duration `mapstructure:"ssh_timeout"` + SSHHost string `mapstructure:"ssh_host"` + SSHPort int `mapstructure:"ssh_port"` + SSHUsername string `mapstructure:"ssh_username"` + SSHPassword string `mapstructure:"ssh_password"` + SSHPrivateKey string `mapstructure:"ssh_private_key_file"` + SSHPty bool `mapstructure:"ssh_pty"` + SSHTimeout time.Duration `mapstructure:"ssh_timeout"` + SSHHandshakeAttempts int `mapstructure:"ssh_handshake_attempts"` // WinRM WinRMUser string `mapstructure:"winrm_username"` @@ -72,6 +73,10 @@ func (c *Config) prepareSSH(ctx *interpolate.Context) []error { c.SSHTimeout = 5 * time.Minute } + if c.SSHHandshakeAttempts == 0 { + c.SSHHandshakeAttempts = 10 + } + // Validation var errs []error if c.SSHUsername == "" { diff --git a/helper/communicator/step_connect_ssh.go b/helper/communicator/step_connect_ssh.go index 0b54bae9d..4b664fe4c 100644 --- a/helper/communicator/step_connect_ssh.go +++ b/helper/communicator/step_connect_ssh.go @@ -149,8 +149,10 @@ func (s *StepConnectSSH) waitForSSH(state multistep.StateBag, cancel <-chan stru handshakeAttempts += 1 } - if handshakeAttempts < 10 { - // Try to connect via SSH a handful of times + if handshakeAttempts < s.Config.SSHHandshakeAttempts { + // Try to connect via SSH a handful of times. We sleep here + // so we don't get a ton of authentication errors back to back. + time.Sleep(2 * time.Second) continue }