diff --git a/README.md b/README.md index 55b3339e5..052d07552 100644 --- a/README.md +++ b/README.md @@ -67,8 +67,7 @@ Hardware customization: Provisioning: * `ssh_username` - [**mandatory**] username in guest OS. -* `ssh_password` - [**mandatory if ssh_private_key_file is not present**] password in guest OS. -* `ssh_private_key_file` - [**mandatory if ssh_password is not present**] password in guest OS. +* `ssh_password` or `ssh_private_key_file` - [**mandatory**] password or SSH-key filename to access a guest OS. Post-processing: * `shutdown_command` - VMware guest tools are used by default. diff --git a/builder.go b/builder.go index a669abd47..132bd9383 100644 --- a/builder.go +++ b/builder.go @@ -43,7 +43,7 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe }, &StepRun{}, &communicator.StepConnect{ - Config: &b.config.Config, + Config: &b.config.Comm, Host: commHost, SSHConfig: sshConfig, }, diff --git a/builder_acc_test.go b/builder_acc_test.go index c35011ed1..431528f6f 100644 --- a/builder_acc_test.go +++ b/builder_acc_test.go @@ -277,7 +277,7 @@ func checkLinkedClone(t *testing.T) builderT.TestCheckFunc { t.Fatalf("Cannot read VM properties: %v", err) } - if len(vmInfo.LayoutEx.Disk[0].Chain) != 3 { + if len(vmInfo.LayoutEx.Disk[0].Chain) != 2 { t.Error("Not a linked clone") } @@ -378,6 +378,21 @@ func checkRAMReservation(t *testing.T) builderT.TestCheckFunc { } } +func TestBuilderAcc_sshKey(t *testing.T) { + builderT.Test(t, builderT.TestCase{ + Builder: &Builder{}, + Template: sshKeyConfig(), + }) +} + +func sshKeyConfig() string { + config := defaultConfig() + config["ssh_password"] = "" + config["ssh_private_key_file"] = "test-key.pem" + config["linked_clone"] = true // speed up + return renderConfig(config) +} + func TestBuilderAcc_snapshot(t *testing.T) { builderT.Test(t, builderT.TestCase{ Builder: &Builder{}, diff --git a/config.go b/config.go index d68ee51aa..5c25da4d1 100644 --- a/config.go +++ b/config.go @@ -13,7 +13,7 @@ type Config struct { ConnectConfig `mapstructure:",squash"` CloneConfig `mapstructure:",squash"` HardwareConfig `mapstructure:",squash"` - communicator.Config `mapstructure:",squash"` + Comm communicator.Config `mapstructure:",squash"` ShutdownConfig `mapstructure:",squash"` CreateSnapshot bool `mapstructure:"create_snapshot"` ConvertToTemplate bool `mapstructure:"convert_to_template"` @@ -34,7 +34,7 @@ func NewConfig(raws ...interface{}) (*Config, []string, error) { } errs := new(packer.MultiError) - errs = packer.MultiErrorAppend(errs, c.Config.Prepare(&c.ctx)...) + errs = packer.MultiErrorAppend(errs, c.Comm.Prepare(&c.ctx)...) errs = packer.MultiErrorAppend(errs, c.ConnectConfig.Prepare()...) errs = packer.MultiErrorAppend(errs, c.CloneConfig.Prepare()...) errs = packer.MultiErrorAppend(errs, c.HardwareConfig.Prepare()...) diff --git a/ssh.go b/ssh.go index 4ffdef905..863ce4e58 100644 --- a/ssh.go +++ b/ssh.go @@ -16,18 +16,10 @@ func commHost(state multistep.StateBag) (string, error) { func sshConfig(state multistep.StateBag) (*ssh.ClientConfig, error) { config := state.Get("config").(*Config) - clientConfig := &ssh.ClientConfig{ - User: config.Config.SSHUsername, - Auth: []ssh.AuthMethod{ - ssh.Password(config.Config.SSHPassword), - ssh.KeyboardInteractive( - packerssh.PasswordKeyboardInteractive(config.Config.SSHPassword)), - }, - HostKeyCallback: ssh.InsecureIgnoreHostKey(), - } + var auth []ssh.AuthMethod - if config.Config.SSHPrivateKey != "" { - privateKey, err := ioutil.ReadFile(config.Config.SSHPrivateKey) + if config.Comm.SSHPrivateKey != "" { + privateKey, err := ioutil.ReadFile(config.Comm.SSHPrivateKey) if err != nil { return nil, fmt.Errorf("Error loading configured private key file: %s", err) } @@ -37,8 +29,20 @@ func sshConfig(state multistep.StateBag) (*ssh.ClientConfig, error) { return nil, fmt.Errorf("Error setting up SSH config: %s", err) } - clientConfig.Auth = []ssh.AuthMethod{ssh.PublicKeys(signer)} + auth = []ssh.AuthMethod{ssh.PublicKeys(signer)} + } else { + auth = []ssh.AuthMethod{ + ssh.Password(config.Comm.SSHPassword), + ssh.KeyboardInteractive( + packerssh.PasswordKeyboardInteractive(config.Comm.SSHPassword)), + } } + clientConfig := &ssh.ClientConfig{ + User: config.Comm.SSHUsername, + HostKeyCallback: ssh.InsecureIgnoreHostKey(), + } + clientConfig.Auth = auth + return clientConfig, nil } diff --git a/test-key.pem b/test-key.pem new file mode 100644 index 000000000..8dad2ecd3 --- /dev/null +++ b/test-key.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEA2J9w3cbqMJSDTCUtFW3qRHhqgXbSOW32anqEWQYvW48WKXJm +ZmuuSViC0tcAMCnX8pu5YGlAMCi5RBDtdoE9mZzUCfE4Q1Om42S2jKRrSSbhU9Ts +8jTRL0V81Tja64SEt5l1dDHS5sgNJy8C4nWaWob1HT+YloPEllj80ogwoQoL3ufp +r5me/TOrA3ApHXewWm0feBkkkuN6NkL1Z9sILCstLrjD+RVEOvI/wrHZEaLpYJ4P +LgS8LmTNKaFafmqwgcC4VcA4kVbhxw9X385v+mQLqpiOJa+vS51dT2qINEw+80Y+ +HL7k7OIZTLg803wubI3rUZQ/2PX/STBq1zO9RwIDAQABAoIBAAmrDBGJ6Dfk2PtU +CXAUaMlHipFeqUFQ7BeSgkeq5AA1IasV5QYbNjslzSj12ZdMtsuoMZzg9bFwj9w+ +2SpZ2FL70ebjsjwnBqLNguxCBlvMdXAVZ8Hjo5Z1hn3JvNOYJYhAPCLEeoI8WYHv +MjTDRPFXZqc4iGnnVaXUMOyAkZMOV6sMQzvuJad4x7gvQGRhCgcdnFdGbVs+MZQc +WPI6cO6imj27F6rJK3W6s5XcSjDbkpytf2wUuWYgck93Fdm3kYy3ER6B3P/MiM95 +qGRmg6OuEYbXAr4ytamjKUThl83SGvDS89N5SIjS5rgrEBgrOFBgMhjG/ibaxbrh +c84oplECgYEA+vyI4VUYgce8voYmdDijlM/NwPbCpD3SGiyXIYcDN1i/CUdDhBYh +z4982H6I1b2cg+veBWICro9Dp20CpfGtXT6Y3o1yNWkbKlosd+f2Us10fG1gkcyI +TiZCYaJPrtdoTT0vMKbdUbkgn0FLNbW1TCh5FQ7K7RXhDonb9BbsTzkCgYEA3PMu +bv/MgaET654GAItudazJmh4FfR905w59yVNJfe+7iG/f5zzv7vIpaERvBo245hcu +IaO8QbW5OKYuCaNIjGOSd1uxN5ytcOHcf1bmjS+WRQdu/FR5v9BM0BY66NFjqKMb +dZLXVZPnU3EOqCKmi9SI2VOVKrDL5XzMOHhL8H8CgYBFJh5wNomx993AgCVID/LB +pR8C8vldVsrz+yUIT7JLJWA8pi2rzo0yKk4zN2lrufnNPsbEpOQoQ8BX+GiqX5Ns +BTsI1d+JZ5Pcb0uhHX94ALL/NQNOKBPFtDTFwXpCqYZLAXhm5xJC2cZrGgommhGB +EgWKD7FI8KY44zJ+ZXJlwQKBgGvw/eFKZI17tPCp3cLMW2VvyXnaatIK2SC8SqVd +ZAz7XoG0Lg2ZDpqMgcAnlpn8CLWX43iZtjHf5qIPRXR96cZ0KqzXBcfmajE4lnE7 +chzNf7sve4AYgPY9fBk4kwUEroxHSvXwi/SJ8jwogoGPlA/CAC00ES6u+p2dj2OT +GX5fAoGBAM6saTeyjAjLDE/vlPM9OButsoj5CJg7DklRgrRuRyygbyRBudafslnl +8e4+4mlXEBwKDnrDTtXFhX1Ur95/w/4GjyFXO/TB/Tmn+vaEBQTzgViKc2cJ/yay +ttiF6oJh9EjCaFDTz5P11wX7DajRux/2tUcBXX/C3FcGhNEkVb2P +-----END RSA PRIVATE KEY----- diff --git a/test-key.pub b/test-key.pub new file mode 100755 index 000000000..c4c14bb04 --- /dev/null +++ b/test-key.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDYn3DdxuowlINMJS0VbepEeGqBdtI5bfZqeoRZBi9bjxYpcmZma65JWILS1wAwKdfym7lgaUAwKLlEEO12gT2ZnNQJ8ThDU6bjZLaMpGtJJuFT1OzyNNEvRXzVONrrhIS3mXV0MdLmyA0nLwLidZpahvUdP5iWg8SWWPzSiDChCgve5+mvmZ79M6sDcCkdd7BabR94GSSS43o2QvVn2wgsKy0uuMP5FUQ68j/CsdkRoulgng8uBLwuZM0poVp+arCBwLhVwDiRVuHHD1ffzm/6ZAuqmI4lr69LnV1Paog0TD7zRj4cvuTs4hlMuDzTfC5sjetRlD/Y9f9JMGrXM71H