Issue #5224 has been updated by Nigel Kersten.
Status changed from Needs Decision to Rejected
<blockquote>
it also seems sensible to document the behaviour and make it consistent
irrespective of how puppetd is started. cron' default behaviour seems like a
reasonable starting point.
</blockquote>
On the other hand, we have users who expect the environment for an Exec to be
consistent with the environment that puppetd was launched in, and we can't
satisfy both sets.
It's quite reasonable for us to use the environment puppet was invoked in,
which will vary depending on how you do it (and across platforms, and versions
of platforms, and across different tools for invoking services)
There is a simple method if you want to enforce a given environment for all
your Exec resources.
Set a resource default for Exec that defines the desired environment at your
top level scope, and it will be applied to all Exec resources.
----------------------------------------
Bug #5224: puppetd does not set environment correctly from Exec
https://projects.puppetlabs.com/issues/5224
Author: Simon Mudd
Status: Rejected
Priority: Normal
Assignee: Nigel Kersten
Category: exec
Target version:
Affected Puppet version: 0.25.5
Keywords: exec,crontab,service,environment,HOME
Branch:
It's possible to run a script using Exec. This can sometimes cause confusion if
the environment is not set correctly. It's not terribly clear to me exactly
what environment the user should expect when running Exec. This should be
better documented if nothing else.
In any case I see on a box we use to run puppet:
# ps auwx | grep puppetd
root 25736 0.1 0.1 173072 78728 ? Ssl 04:02 0:52
/usr/bin/ruby /usr/sbin/puppetd --logdest=/var/log/puppet/puppetd.log
root 30268 0.0 0.0 61148 756 pts/0 S+ 14:11 0:00 grep
puppetd
# strings /proc/25736/environ
SHELL=/bin/bash
MAILTO=root
USER=root
PATH=/sbin:/usr/sbin:/bin:/usr/bin
PWD=/
LANG=en_US.UTF-8
HOME=/ <======== started at boot and HOME here
is _not_ root's HOME directory.
SHLVL=6
LOGNAME=root
_=/usr/sbin/puppetd
#
Now if I restart puppet using service(5) or directly with /etc/init.d/puppet
restart I get different results:
### Using service(5)
# service puppet restart
Stopping puppet: [ OK ]
Starting puppet: [ OK ]
# ps auwx | grep puppetd
root 13089 1.8 0.0 128100 35264 ? Ssl 14:24 0:00
/usr/bin/ruby /usr/sbin/puppetd --logdest=/var/log/puppet/puppetd.log
root 13158 0.0 0.0 61148 756 pts/0 S+ 14:25 0:00 grep
puppetd
[root@bc29bprdb-01 ~]# strings /proc/13089/environ
TERM=xterm-color
PATH=/sbin:/usr/sbin:/bin:/usr/bin
PWD=/
LANG=en_US.UTF-8
SHLVL=2
_=/usr/sbin/puppetd
# cat /etc/redhat-release
CentOS release 5.4 (Final)
### Using /etc/init.d/puppet
# /etc/init.d/puppet restart
Stopping puppet: [ OK ]
Starting puppet: [ OK ]
# ps auwx | grep puppetd
root 14328 3.0 0.0 128108 35272 ? Ssl 14:26 0:00
/usr/bin/ruby /usr/sbin/puppetd --logdest=/var/log/puppet/puppetd.log
root 14808 0.0 0.0 61148 752 pts/0 S+ 14:26 0:00 grep
puppetd
[root@bc29bprdb-01 ~]# strings /proc/14328/environ
HOSTNAME=xxxxxxxxx.xxxxxxx.com
TERM=xterm-color
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.111.22.33 38508 22
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
SSH_AUTH_SOCK=/tmp/ssh-GrzGm30026/agent.30026
MAIL=/var/spool/mail/root
PATH=/sbin:/usr/sbin:/bin:/usr/bin
INPUTRC=/etc/inputrc
PWD=/root
LANG=en_US.UTF-8
SHLVL=3
HOME=/root
LOGNAME=root
SSH_CONNECTION=....
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=/usr/sbin/puppetd
#
This box runs CentOS Linux and root's home directory is /root.
The end result is that the environment may vary quite considerably depending on
the precise puppetd innovation.
Looking at the service man page in Linux (RH's is a bit vague) or better still
FreeBSD's which does the same you see it says:
ENVIRONMENT
When used to run rc.d scripts the service command sets HOME to / and PATH
to /sbin:/bin:/usr/sbin:/usr/bin which is how they are set in /etc/rc at
boot time.
This makes sense as during startup the only filesystem and directory you can be
sure to exist is /.
I'd suggest that the environment is set prior to using Exec as follows being
compatible with crontab(5):
Several environment variables are set up automatically by the cron(8)
daemon. SHELL is set to /bin/sh, PATH is set to /usr/bin:/bin, and
LOGNAME and HOME are set from the /etc/passwd line of the crontab's
owner. HOME, PATH and SHELL may be overridden by settings in the
crontab; LOGNAME may not.
(Another note: the LOGNAME variable is sometimes called USER on BSD sys-
tems... On these systems, USER will be set also).
This behaviour seems standard in Linux and the various BSD flavours. That is
while you can't expect many environment variables to be set when running Exec
you do expect $HOME to be set, $SHELL and that's about all. The fact that $HOME
is not set correctly broke several scripts which assumed that as it was defined
it was correct. Specifically MySQL access it's default configuration file
~/.my.cnf to determine how to access the server. With puppet started at bootup
HOME was incorrect set and this is the value passed on to the root user.
Note: this issue has taken a while for me to figure out as restarting puppet on
CentOS where I use it if done via /etc/init.d/puppet would make puppet pick up
the new $HOME value of /root and then it would work properly and if using
service(5) I would get different results. Again in both cases these results are
also different from the behaviour if puppet starts on bootup.
References:
*
http://www.freebsd.org/cgi/man.cgi?query=crontab&apropos=0&sektion=5&manpath=FreeBSD+8.1-RELEASE&format=html
*
http://www.freebsd.org/cgi/man.cgi?query=service&apropos=0&sektion=0&manpath=FreeBSD+8.1-RELEASE&format=html
While it is possible to set the environment in Exec (I don't see examples of
how to do this in http://docs.puppetlabs.com/references/stable/type.html#exec)
it also seems sensible to document the behaviour and make it consistent
irrespective of how puppetd is started. cron' default behaviour seems like a
reasonable starting point.
--
You have received this notification because you have either subscribed to it,
or are involved in it.
To change your notification preferences, please click here:
http://projects.puppetlabs.com/my/account
--
You received this message because you are subscribed to the Google Groups
"Puppet Bugs" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/puppet-bugs?hl=en.