use build name to ensure that winrm password and other shared state is not overwritten if two builders need the password in the same packer run.
This commit is contained in:
parent
747d1eba27
commit
3afb243f11
|
@ -21,9 +21,10 @@ import (
|
||||||
// StepGetPassword reads the password from a Windows server and sets it
|
// StepGetPassword reads the password from a Windows server and sets it
|
||||||
// on the WinRM config.
|
// on the WinRM config.
|
||||||
type StepGetPassword struct {
|
type StepGetPassword struct {
|
||||||
Debug bool
|
Debug bool
|
||||||
Comm *communicator.Config
|
Comm *communicator.Config
|
||||||
Timeout time.Duration
|
Timeout time.Duration
|
||||||
|
BuildName string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *StepGetPassword) Run(_ context.Context, state multistep.StateBag) multistep.StepAction {
|
func (s *StepGetPassword) Run(_ context.Context, state multistep.StateBag) multistep.StepAction {
|
||||||
|
@ -94,13 +95,13 @@ WaitLoop:
|
||||||
"Password (since debug is enabled): %s", s.Comm.WinRMPassword))
|
"Password (since debug is enabled): %s", s.Comm.WinRMPassword))
|
||||||
}
|
}
|
||||||
// store so that we can access this later during provisioning
|
// store so that we can access this later during provisioning
|
||||||
commonhelper.SetSharedState("winrm_password", s.Comm.WinRMPassword)
|
commonhelper.SetSharedState("winrm_password", s.Comm.WinRMPassword, s.BuildName)
|
||||||
|
|
||||||
return multistep.ActionContinue
|
return multistep.ActionContinue
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *StepGetPassword) Cleanup(multistep.StateBag) {
|
func (s *StepGetPassword) Cleanup(multistep.StateBag) {
|
||||||
commonhelper.RemoveSharedStateFile("winrm_password")
|
commonhelper.RemoveSharedStateFile("winrm_password", s.BuildName)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *StepGetPassword) waitForPassword(state multistep.StateBag, cancel <-chan struct{}) (string, error) {
|
func (s *StepGetPassword) waitForPassword(state multistep.StateBag, cancel <-chan struct{}) (string, error) {
|
||||||
|
|
|
@ -193,9 +193,10 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
|
||||||
},
|
},
|
||||||
instanceStep,
|
instanceStep,
|
||||||
&awscommon.StepGetPassword{
|
&awscommon.StepGetPassword{
|
||||||
Debug: b.config.PackerDebug,
|
Debug: b.config.PackerDebug,
|
||||||
Comm: &b.config.RunConfig.Comm,
|
Comm: &b.config.RunConfig.Comm,
|
||||||
Timeout: b.config.WindowsPasswordTimeout,
|
Timeout: b.config.WindowsPasswordTimeout,
|
||||||
|
BuildName: b.config.PackerBuildName,
|
||||||
},
|
},
|
||||||
&communicator.StepConnect{
|
&communicator.StepConnect{
|
||||||
Config: &b.config.RunConfig.Comm,
|
Config: &b.config.RunConfig.Comm,
|
||||||
|
|
|
@ -207,9 +207,10 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
|
||||||
},
|
},
|
||||||
instanceStep,
|
instanceStep,
|
||||||
&awscommon.StepGetPassword{
|
&awscommon.StepGetPassword{
|
||||||
Debug: b.config.PackerDebug,
|
Debug: b.config.PackerDebug,
|
||||||
Comm: &b.config.RunConfig.Comm,
|
Comm: &b.config.RunConfig.Comm,
|
||||||
Timeout: b.config.WindowsPasswordTimeout,
|
Timeout: b.config.WindowsPasswordTimeout,
|
||||||
|
BuildName: b.config.PackerBuildName,
|
||||||
},
|
},
|
||||||
&communicator.StepConnect{
|
&communicator.StepConnect{
|
||||||
Config: &b.config.RunConfig.Comm,
|
Config: &b.config.RunConfig.Comm,
|
||||||
|
|
|
@ -186,9 +186,10 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
|
||||||
Ctx: b.config.ctx,
|
Ctx: b.config.ctx,
|
||||||
},
|
},
|
||||||
&awscommon.StepGetPassword{
|
&awscommon.StepGetPassword{
|
||||||
Debug: b.config.PackerDebug,
|
Debug: b.config.PackerDebug,
|
||||||
Comm: &b.config.RunConfig.Comm,
|
Comm: &b.config.RunConfig.Comm,
|
||||||
Timeout: b.config.WindowsPasswordTimeout,
|
Timeout: b.config.WindowsPasswordTimeout,
|
||||||
|
BuildName: b.config.PackerBuildName,
|
||||||
},
|
},
|
||||||
&communicator.StepConnect{
|
&communicator.StepConnect{
|
||||||
Config: &b.config.RunConfig.Comm,
|
Config: &b.config.RunConfig.Comm,
|
||||||
|
|
|
@ -269,9 +269,10 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
|
||||||
},
|
},
|
||||||
instanceStep,
|
instanceStep,
|
||||||
&awscommon.StepGetPassword{
|
&awscommon.StepGetPassword{
|
||||||
Debug: b.config.PackerDebug,
|
Debug: b.config.PackerDebug,
|
||||||
Comm: &b.config.RunConfig.Comm,
|
Comm: &b.config.RunConfig.Comm,
|
||||||
Timeout: b.config.WindowsPasswordTimeout,
|
Timeout: b.config.WindowsPasswordTimeout,
|
||||||
|
BuildName: b.config.PackerBuildName,
|
||||||
},
|
},
|
||||||
&communicator.StepConnect{
|
&communicator.StepConnect{
|
||||||
Config: &b.config.RunConfig.Comm,
|
Config: &b.config.RunConfig.Comm,
|
||||||
|
|
|
@ -177,7 +177,8 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
|
||||||
NewStepDeployTemplate(azureClient, ui, b.config, deploymentName, GetVirtualMachineDeployment),
|
NewStepDeployTemplate(azureClient, ui, b.config, deploymentName, GetVirtualMachineDeployment),
|
||||||
NewStepGetIPAddress(azureClient, ui, endpointConnectType),
|
NewStepGetIPAddress(azureClient, ui, endpointConnectType),
|
||||||
&StepSaveWinRMPassword{
|
&StepSaveWinRMPassword{
|
||||||
Password: b.config.tmpAdminPassword,
|
Password: b.config.tmpAdminPassword,
|
||||||
|
BuildName: b.config.PackerBuildName,
|
||||||
},
|
},
|
||||||
&communicator.StepConnectWinRM{
|
&communicator.StepConnectWinRM{
|
||||||
Config: &b.config.Comm,
|
Config: &b.config.Comm,
|
||||||
|
|
|
@ -359,7 +359,7 @@ func setRuntimeValues(c *Config) {
|
||||||
|
|
||||||
c.tmpAdminPassword = tempName.AdminPassword
|
c.tmpAdminPassword = tempName.AdminPassword
|
||||||
// store so that we can access this later during provisioning
|
// store so that we can access this later during provisioning
|
||||||
commonhelper.SetSharedState("winrm_password", c.tmpAdminPassword)
|
commonhelper.SetSharedState("winrm_password", c.tmpAdminPassword, c.PackerConfig.PackerBuildName)
|
||||||
|
|
||||||
c.tmpCertificatePassword = tempName.CertificatePassword
|
c.tmpCertificatePassword = tempName.CertificatePassword
|
||||||
if c.TempComputeName == "" {
|
if c.TempComputeName == "" {
|
||||||
|
|
|
@ -8,15 +8,16 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type StepSaveWinRMPassword struct {
|
type StepSaveWinRMPassword struct {
|
||||||
Password string
|
Password string
|
||||||
|
BuildName string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *StepSaveWinRMPassword) Run(_ context.Context, state multistep.StateBag) multistep.StepAction {
|
func (s *StepSaveWinRMPassword) Run(_ context.Context, state multistep.StateBag) multistep.StepAction {
|
||||||
// store so that we can access this later during provisioning
|
// store so that we can access this later during provisioning
|
||||||
commonhelper.SetSharedState("winrm_password", s.Password)
|
commonhelper.SetSharedState("winrm_password", s.Password, s.BuildName)
|
||||||
return multistep.ActionContinue
|
return multistep.ActionContinue
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *StepSaveWinRMPassword) Cleanup(multistep.StateBag) {
|
func (s *StepSaveWinRMPassword) Cleanup(multistep.StateBag) {
|
||||||
commonhelper.RemoveSharedStateFile("winrm_password")
|
commonhelper.RemoveSharedStateFile("winrm_password", s.BuildName)
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,20 +76,20 @@ func (s *StepHTTPServer) Run(_ context.Context, state multistep.StateBag) multis
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetHTTPPort(port string) error {
|
func SetHTTPPort(port string) error {
|
||||||
return common.SetSharedState("port", port)
|
return common.SetSharedState("port", port, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetHTTPIP(ip string) error {
|
func SetHTTPIP(ip string) error {
|
||||||
return common.SetSharedState("ip", ip)
|
return common.SetSharedState("ip", ip, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetHTTPAddr() string {
|
func GetHTTPAddr() string {
|
||||||
ip, err := common.RetrieveSharedState("ip")
|
ip, err := common.RetrieveSharedState("ip", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
port, err := common.RetrieveSharedState("port")
|
port, err := common.RetrieveSharedState("port", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
@ -101,6 +101,6 @@ func (s *StepHTTPServer) Cleanup(multistep.StateBag) {
|
||||||
// Close the listener so that the HTTP server stops
|
// Close the listener so that the HTTP server stops
|
||||||
s.l.Close()
|
s.l.Close()
|
||||||
}
|
}
|
||||||
common.RemoveSharedStateFile("port")
|
common.RemoveSharedStateFile("port", "")
|
||||||
common.RemoveSharedStateFile("ip")
|
common.RemoveSharedStateFile("ip", "")
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,23 +9,23 @@ import (
|
||||||
|
|
||||||
// Used to set variables which we need to access later in the build, where
|
// Used to set variables which we need to access later in the build, where
|
||||||
// state bag and config information won't work
|
// state bag and config information won't work
|
||||||
func sharedStateFilename(suffix string) string {
|
func sharedStateFilename(suffix string, buildName string) string {
|
||||||
uuid := os.Getenv("PACKER_RUN_UUID")
|
uuid := os.Getenv("PACKER_RUN_UUID")
|
||||||
return filepath.Join(os.TempDir(), fmt.Sprintf("packer-%s-%s", uuid, suffix))
|
return filepath.Join(os.TempDir(), fmt.Sprintf("packer-%s-%s-%s", uuid, suffix, buildName))
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetSharedState(key string, value string) error {
|
func SetSharedState(key string, value string, buildName string) error {
|
||||||
return ioutil.WriteFile(sharedStateFilename(key), []byte(value), 0600)
|
return ioutil.WriteFile(sharedStateFilename(key, buildName), []byte(value), 0600)
|
||||||
}
|
}
|
||||||
|
|
||||||
func RetrieveSharedState(key string) (string, error) {
|
func RetrieveSharedState(key string, buildName string) (string, error) {
|
||||||
value, err := ioutil.ReadFile(sharedStateFilename(key))
|
value, err := ioutil.ReadFile(sharedStateFilename(key, buildName))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
return string(value), nil
|
return string(value), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func RemoveSharedStateFile(key string) {
|
func RemoveSharedStateFile(key string, buildName string) {
|
||||||
os.Remove(sharedStateFilename(key))
|
os.Remove(sharedStateFilename(key, buildName))
|
||||||
}
|
}
|
||||||
|
|
|
@ -377,7 +377,7 @@ func (p *Provisioner) createFlattenedEnvVars(elevated bool) (flattened string) {
|
||||||
|
|
||||||
// interpolate environment variables
|
// interpolate environment variables
|
||||||
p.config.ctx.Data = &EnvVarsTemplate{
|
p.config.ctx.Data = &EnvVarsTemplate{
|
||||||
WinRMPassword: getWinRMPassword(),
|
WinRMPassword: getWinRMPassword(p.config.PackerBuildName),
|
||||||
}
|
}
|
||||||
// Split vars into key/value components
|
// Split vars into key/value components
|
||||||
for _, envVar := range p.config.Vars {
|
for _, envVar := range p.config.Vars {
|
||||||
|
@ -445,7 +445,7 @@ func (p *Provisioner) createCommandTextNonPrivileged() (command string, err erro
|
||||||
p.config.ctx.Data = &ExecuteCommandTemplate{
|
p.config.ctx.Data = &ExecuteCommandTemplate{
|
||||||
Path: p.config.RemotePath,
|
Path: p.config.RemotePath,
|
||||||
Vars: envVarPath,
|
Vars: envVarPath,
|
||||||
WinRMPassword: getWinRMPassword(),
|
WinRMPassword: getWinRMPassword(p.config.PackerBuildName),
|
||||||
}
|
}
|
||||||
command, err = interpolate.Render(p.config.ExecuteCommand, &p.config.ctx)
|
command, err = interpolate.Render(p.config.ExecuteCommand, &p.config.ctx)
|
||||||
|
|
||||||
|
@ -457,8 +457,8 @@ func (p *Provisioner) createCommandTextNonPrivileged() (command string, err erro
|
||||||
return command, nil
|
return command, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getWinRMPassword() string {
|
func getWinRMPassword(buildName string) string {
|
||||||
winRMPass, _ := commonhelper.RetrieveSharedState("winrm_password")
|
winRMPass, _ := commonhelper.RetrieveSharedState("winrm_password", buildName)
|
||||||
return winRMPass
|
return winRMPass
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -472,7 +472,7 @@ func (p *Provisioner) createCommandTextPrivileged() (command string, err error)
|
||||||
p.config.ctx.Data = &ExecuteCommandTemplate{
|
p.config.ctx.Data = &ExecuteCommandTemplate{
|
||||||
Path: p.config.RemotePath,
|
Path: p.config.RemotePath,
|
||||||
Vars: envVarPath,
|
Vars: envVarPath,
|
||||||
WinRMPassword: getWinRMPassword(),
|
WinRMPassword: getWinRMPassword(p.config.PackerBuildName),
|
||||||
}
|
}
|
||||||
command, err = interpolate.Render(p.config.ElevatedExecuteCommand, &p.config.ctx)
|
command, err = interpolate.Render(p.config.ElevatedExecuteCommand, &p.config.ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -530,7 +530,7 @@ func (p *Provisioner) generateElevatedRunner(command string) (uploadedPath strin
|
||||||
}
|
}
|
||||||
// Replace ElevatedPassword for winrm users who used this feature
|
// Replace ElevatedPassword for winrm users who used this feature
|
||||||
p.config.ctx.Data = &EnvVarsTemplate{
|
p.config.ctx.Data = &EnvVarsTemplate{
|
||||||
WinRMPassword: getWinRMPassword(),
|
WinRMPassword: getWinRMPassword(p.config.PackerBuildName),
|
||||||
}
|
}
|
||||||
|
|
||||||
p.config.ElevatedPassword, _ = interpolate.Render(p.config.ElevatedPassword, &p.config.ctx)
|
p.config.ElevatedPassword, _ = interpolate.Render(p.config.ElevatedPassword, &p.config.ctx)
|
||||||
|
|
Loading…
Reference in New Issue