Can't find $HOME when executing a command on Ubuntu

233 views
Skip to first unread message

F. Y.

unread,
Jun 22, 2013, 1:26:45 AM6/22/13
to puppet...@googlegroups.com
Hello Puppet Users,

I am running into a weird issue when trying to execute an installer on Ubuntu 10.04/12.04 machines. I am using Puppet 3.2.1, and 3.2.2 respectively from Puppet Labs repo. 

This is the sample code:

class installpackage {
    file { 'MyInstallerFile':
            path => '/tmp/MyInstallerFile',
            ensure => present,
            owner => 'root',
            group => 'root',
            mode => '777',
            source => 'puppet:///extra_files/MyInstallerFile',
    }
    file { 'answer_file':
            path => '/tmp/answer_file',
            ensure => present,
            owner => 'root',
            group => 'root',
            mode => '777',
            source => 'puppet:///extra_file/answer_file',
    }

   exec { "install":
cwd => '/tmp',
             command => '/tmp/MyInstallerFile --answer /tmp/answer_file',
            logoutput => true,
           require => File['MyInstallerFile', 'answer_file'],
   }
}
The error I get is this (i.e. it can't find $HOME set):
Info: Retrieving plugin
Info: Loading facts in /var/lib/puppet/lib/facter/root_home.rb
Info: Loading facts in /var/lib/puppet/lib/facter/facter_dot_d.rb
Info: Loading facts in /var/lib/puppet/lib/facter/pe_version.rb
Info: Loading facts in /var/lib/puppet/lib/facter/puppet_vardir.rb
Info: Caching catalog for puppetagent.example.com
Info: Applying configuration version '1370899438'
Notice: /Stage[main]/Installpackage/Exec[install]/returns: couldn't find HOME environment variable to expand path
Notice: /Stage[main]/Installpackage/Exec[install]/returns:     while executing
Notice: /Stage[main]/Installpackage/Exec[install]/returns: "file normalize ~"
Notice: /Stage[main]/Installpackage/Exec[install]/returns:     (procedure "::InstallJammer::HomeDir" line 2)
Notice: /Stage[main]/Installpackage/Exec[install]/returns:     invoked from within
Notice: /Stage[main]/Installpackage/Exec[install]/returns: "::InstallJammer::HomeDir"
Notice: /Stage[main]/Installpackage/Exec[install]/returns:     (procedure "::InstallJammer::CommonInit" line 183)
Notice: /Stage[main]/Installpackage/Exec[install]/returns:     invoked from within
Notice: /Stage[main]/Installpackage/Exec[install]/returns: "::InstallJammer::CommonInit"
Notice: /Stage[main]/Installpackage/Exec[install]/returns:     (procedure "::InstallJammer::InitInstall" line 19)
Notice: /Stage[main]/Installpackage/Exec[install]/returns:     invoked from within
Notice: /Stage[main]/Installpackage/Exec[install]/returns: "::InstallJammer::InitInstall"
Notice: /Stage[main]/Installpackage/Exec[install]/returns:     (file "/installkitvfs/main.tcl" line 71313)
Error: /tmp/MyInstallerFile --answer /tmp/answer_file returned 1 instead of one of [0]
Error: /Stage[main]/Installpackage/Exec[install]/returns: change from notrun to 0 failed: MyInstallerFile --answer /tmp/answer_file returned 1 instead of one of [0]
Notice: Finished catalog run in 5.31 seconds
I did notice that if I append "sudo" before the command I want to execute, it works. Is there a more elegant solution?
Please advise.
F.

jcbollinger

unread,
Jun 24, 2013, 9:05:37 AM6/24/13
to puppet...@googlegroups.com

By default, Puppet runs external commands in an extremely sparse environment.  This is a good practice for both security, correctness, and consistency reasons.  Ideally, you would not use Exec to run commands that depend on their environment, but in practice, you cannot always avoid that.

Running a command indirectly via sudo works around your issue because sudo by default provides an environment that is slightly richer than the one Puppet provides.  A better solution, however, is to use the Exec's 'env' parameter to set environment variables that your script needs.  Be aware also of the 'path' and 'cwd' parameters, which have related purposes.

You should also consider, however, why your script needs $HOME in the first place.  It shouldn't need that for temp files, and you probably don't want to install the software in the Puppet agent's (or root's) home directory, or to modify anything there or even base any decisions on the files it may or may not find there.  So what does the script want it for, that you actually want it to do?


John

Reply all
Reply to author
Forward
0 new messages