Hi,
I am observing following behaviour using ansible on set of Ubuntu-1604, SLES-12 and CentOS-7 hosts.
Environment variables, normally avaiable for login shell (/bin/bash) are not avaiable via ansible “setup” or “shell” modules for Ubuntu-16.04. Yet the same variables (defined in /etc/profile) are available for both these modules for SLES and CentOS distributions.
Seems as if ansible run shell as login shell for Sles and Centos, and non-login shell for Ubuntu. This inconsistency is killing me. Anyone came across this? Possible solution?
Many Thanks
Martin.
This is normal in Debian and its derivatives.
Ansible is using /bin/sh that is symlink to dash.
The dash shell has to mode like most other shell, interactive and non-interactive and the /etc/profile is only read in interactive shell mode.
But since Ansible is not logging in, it just run a command it uses non-interactive that file is not read.
For more information check man dash search for Invocation.
You need to use /etc/environment but remember that this file doesn't support variable expansion.
Thank you Kai for your quick answer.
However, this is happening when I use command module with args: executable=/bin/bash too. This kind of rules the dash theory out.
It is almost like /etc/profile is ignored in any case.
Still, on Centos/Sles it is sourced regardless of /bin/sh or /bin/bash use (I know that /bin/sh is symlink to /bin/bash on those distributions)
?
However, this is happening when I use command module with args:
executable=/bin/bash too. This kind of rules the dash theory out.
It is almost like /etc/profile is ignored in any case.
bash working the same as dash in this aspect.
Still, on Centos/Sles it is sourced regardless of /bin/sh or /bin/bash use
(I know that /bin/sh is symlink to /bin/bash on those distributions)
bash has a posix mode is uses when bash is started with name sh, this mode behave differently.
It's documented in the man pages.
Yes, still according to man pages /bin/sh started as login shell should source /etc/profile (as it does on e.g. CENTOS)
As I wrote in my first reply since Ansible is just executing a command(s), it doesn't use login shell/interactive shell, it uses non-interactive shell.
The same as this that will run env in a non-interactive shell
ssh user@host env
So that is why non of the profile files is being read, so you need to use /etc/environment or make a hack yourself.
What Centos does I don't know since I don't use it.