package vagrant import ( "context" "log" "strconv" "github.com/hashicorp/packer/helper/multistep" ) // Vagrant already sets up ssh on the guests; our job is to find out what // it did. We can do that with the ssh-config command. Example output: // $ vagrant ssh-config // Host default // HostName 172.16.41.194 // User vagrant // Port 22 // UserKnownHostsFile /dev/null // StrictHostKeyChecking no // PasswordAuthentication no // IdentityFile /Users/mmarsh/Projects/vagrant-boxes/ubuntu/.vagrant/machines/default/vmware_fusion/private_key // IdentitiesOnly yes // LogLevel FATAL type StepSSHConfig struct { GlobalID string } func (s *StepSSHConfig) Run(ctx context.Context, state multistep.StateBag) multistep.StepAction { driver := state.Get("driver").(VagrantDriver) config := state.Get("config").(*Config) box := "source" if s.GlobalID != "" { box = s.GlobalID } sshConfig, err := driver.SSHConfig(box) if err != nil { state.Put("error", err) return multistep.ActionHalt } config.Comm.SSHHost = sshConfig.Hostname port, err := strconv.Atoi(sshConfig.Port) if err != nil { state.Put("error", err) return multistep.ActionHalt } config.Comm.SSHPort = port if config.Comm.SSHUsername != "" { // If user has set the username within the communicator, use the // auth provided there. return multistep.ActionContinue } log.Printf("identity file is %s", sshConfig.IdentityFile) log.Printf("Removing quotes from identity file") unquoted, err := strconv.Unquote(sshConfig.IdentityFile) if err == nil { sshConfig.IdentityFile = unquoted } config.Comm.SSHPrivateKeyFile = sshConfig.IdentityFile config.Comm.SSHUsername = sshConfig.User return multistep.ActionContinue } func (s *StepSSHConfig) Cleanup(state multistep.StateBag) { }