Environment variables unavaiable

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.