Still learning Ansible, so if this is a stupid question, let me know.
I'd like to know which (if any) of the typical shell init files are used
when executing commands via the shell module. Specifically I'd like to run
node.
This works interactively just fine:
harald@giga:~/vagrantstuff/node/ansible$ ssh node3
----------------------------------------------------------------
Debian GNU/Linux 8.5 (jessie) built 2016-08-28
----------------------------------------------------------------
Last login: Mon Sep 19 07:11:18 2016 from giga.lan
harald@node3:~$ node --version
v6.6.0
harald@node3:~$ echo $PATH
/home/harald/node:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
harald@node3:~$ echo $SHELL
/bin/bash
harald@node3:~$ echo $LAST
bash_profile
PATH is set to include ~/node if it exists. I put this usually into
.bashrc, but that's not working when using Ansible.
And I spend half of today to find out why.
To find out what of those files are used at all I set LAST in all of
~/.profile, ~/.login, ~/.bash_profile, ~/.bash_login and ~/.bashrc to match
the profile file name it's in.
E.g. in .bashrc at the bottom:
LAST=bashrc
export LAST
The rather simple playbook:
- hosts: nodes
gather_facts: false
tasks:
- name: Testing to run node
shell: echo "SHELL=$SHELL" ; echo "PATH=$PATH" ; echo "LAST=$LAST";
node --version
however does not seem to honor any of those files:
fatal: [node3]: FAILED! => {"changed": true, "cmd": "echo \"SHELL=$SHELL\"
; echo \"PATH=$PATH\"
; echo \"LAST=$LAST\"; node --version", "delta": "0:00:00.009935", "end":
"2016-09-19 07:24:49.
008019", "failed": true, "rc": 127, "start": "2016-09-19 07:24:48.998084",
"stderr": "/bin/bash:
node: command not found", "stdout":
"SHELL=/bin/bash\nPATH=/usr/local/bin:/usr/bin:/bin:/usr/ga
mes\nLAST=", "stdout_lines": ["SHELL=/bin/bash",
"PATH=/usr/local/bin:/usr/bin:/bin:/usr/games",
"LAST="], "warnings": }
As you can see /bin/bash is used (my default shell). But LAST is not set
and PATH is not set either which makes the "node" command fail.
Ansible shell module is using /bin/sh by default. In Debian /bin/sh is a symlink to dash. Dash do read /etc/profile and $HOME/.profile, but with Ansible shell those files is not read at all in my experience.
Note that I run ansible-playbook as myself, so there should be no changing
of accounts.
If it's relevant: I use Ansible 2.1.1.0
What am I missing?
/etc/pam.d/sshd is set to read the environment from /etc/environment and changes here will be available in Ansible.
I'm using Kubuntu so I can't confirm it's working in Debian.