Hi,
I have been redirected from Github issue 56044
<https://github.com/ansible/ansible/issues/56044>.
I am finding that commands which work when run manually fail when run with
a shell task, because the $PATH is different, so binaries such as ip and
modinfo cannot be found.
Bcoca said:
> In any case this is due to Ansible doing a batch login, which does not
source the same files as a live login, this depends on your system's
configuration and can be changed by setting the PATH the same way for both
types of logins.
What does that mean?
When I search online for batch logins, I get a whole bunch of irrelevant
results about Windows Batch scripts.
Is this the batch you see with `man batch`?
How can I make an Ansible shell task execute with the same $PATH as when I
ssh in manually?
I am only having this problem on a Centos target, not Ubuntu. (Perhaps the
PATH is modified for Ubuntu too, but it is not impacting me because
Ansible's shell task can still find the binaries I need.)
I am already telling Ansible to use bash not sh.
Detail
*Steps to reproduce*
I am trying to use shell to run the modinfo binary, and also the ip binary.
I can run the command I want manually by ssh-ing into the machine.
But when I do it with Ansible, shell says "command not found", because the
$PATH is different between SSH and Ansible shell.
This happens with Ansible version 2.5 and 2.9.
My target is Centos 7.6
When I manually ssh in I see:
[centos@dell03 ~]$ which modinfo
/usr/sbin/modinfo
[centos@dell03 ~]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/centos/.local/bin:/home/centos/bin
[centos@dell03 ~]$ modinfo ext4
That last command prints out a lot of text, and returns 0.
Then I try with ansible:
---
- hosts: localhost
tasks:
- name: check modinfo
shell: | echo $PATH which modinfo modinfo ext4
args:
executable: /bin/bash
*Expected results:*
- task should pass
- stdout should be
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/centos/.local/bin:/home/centos/bin
followed by a lot of text about the ext4 module
i.e. shell can find the modinfo binary because the PATH is the same as
before.
*Actual Result*fatal: [10.58.2.103]: FAILED! => {
"changed": true,
"cmd": "echo $PATH\nwhich modinfo\nmodinfo ext4 \n",
"delta": "0:00:00.003893",
"end": "2019-05-03 16:50:23.683406",
"invocation": {
"module_args": {
"_raw_params": "echo $PATH\nwhich modinfo\nmodinfo ext4 \n",
"_uses_shell": true,
"argv": null,
"chdir": null,
"creates": null,
"executable": "/bin/bash",
"removes": null,
"stdin": null,
"stdin_add_newline": true,
"strip_empty_ends": true,
"warn": true
}
},
"msg": "non-zero return code",
"rc": 127,
"start": "2019-05-03 16:50:23.679513",
"stderr": "which: no modinfo in (/usr/local/bin:/usr/bin)\n/bin/bash: line
2: modinfo: command not found",
"stderr_lines": [
"which: no modinfo in (/usr/local/bin:/usr/bin)",
"/bin/bash: line 2: modinfo: command not found"
],
"stdout": "/usr/local/bin:/usr/bin",
"stdout_lines": [
"/usr/local/bin:/usr/bin"
]
}
Reading the results:
echo $PATH -> /usr/local/bin:/usr/bin , which is *not* the path from before
So bash could not find the modinfo binary.
As a workaround, I am able to manually look up where the binary I want is,
then prepend "$PATH=$PATH:/usr/sbin " to my shell command. That works, but
is not scalable.
tldr, how can I make the shell task use the same $PATH as a normal ssh
login?
Thanks,
Matt
--
You received this message because you are subscribed to the Google Groups
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/ansible-project/90f676db-e2e8-4fba-9943-2cbdfa2126b6%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.