Ah yes, I see that bit in .bashrc. Is there any way to open an interactive shell, but source .bashrc as a non-interactive shell? I just want to be able to emulate the environment Ansible runs in.
I tried PATH="" PS1="" . /home/centos/.bashrc ; echo $PATH But that didn't work Thanks, Matt On Wednesday, May 8, 2019 at 11:38:47 PM UTC+10, Matt Martz wrote: > > I think the key terms here are likely interactive vs non-interactive > shells. > > A bashrc or bash profile may have lines that look like: > > # If not running interactively, don't do anything > [ -z "$PS1" ] && return > > or > > # If not running interactively, don't do anything > case $- in > *i*) ;; > *) return;; > esac > > This prevents those files from running in a non-interactive shell, and > those files, from a global perspective, source other files including your > personal rc or profile files. > > As such, since ansible uses non-interactive shells, you will often have a > different shell environment when interactively logged in. > > > > On Tue, May 7, 2019 at 7:14 PM Matthew Davis <[email protected] > <javascript:>> wrote: > >> 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] <javascript:>. >> To post to this group, send email to [email protected] >> <javascript:>. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/ansible-project/90f676db-e2e8-4fba-9943-2cbdfa2126b6%40googlegroups.com >> >> <https://groups.google.com/d/msgid/ansible-project/90f676db-e2e8-4fba-9943-2cbdfa2126b6%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> For more options, visit https://groups.google.com/d/optout. >> > > > -- > Matt Martz > @sivel > sivel.net > -- 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/69906af1-a2e3-4863-b3cc-1545dc743dd8%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
