Environment variables unavaiable

46 views
Skip to first unread message

Martin Simovic

unread,
Mar 26, 2018, 5:31:06 AM3/26/18
to Ansible Project
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.

Kai Stian Olstad

unread,
Mar 26, 2018, 6:02:35 AM3/26/18
to ansible...@googlegroups.com
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.


--
Kai Stian Olstad

Martin Simovic

unread,
Mar 26, 2018, 6:10:06 AM3/26/18
to Ansible Project
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)

?

Kai Stian Olstad

unread,
Mar 26, 2018, 7:44:31 AM3/26/18
to ansible...@googlegroups.com
On 26.03.2018 12:10, Martin Simovic wrote:
> 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.


--
Kai Stian Olstad

Martin Simovic

unread,
Mar 26, 2018, 9:24:27 AM3/26/18
to Ansible Project
Yes, still according to man pages /bin/sh started as login shell should source /etc/profile (as it does on e.g. CENTOS)

Kai Stian Olstad

unread,
Mar 26, 2018, 10:41:07 AM3/26/18
to ansible...@googlegroups.com
On 26.03.2018 15:24, Martin Simovic wrote:
> 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.


--
Kai Stian Olstad
Reply all
Reply to author
Forward
0 new messages