Python Ansible-如何在SSH会话中设置Ansible_env.PATH

Python Ansible-如何在SSH会话中设置Ansible_env.PATH,python,ansible,Python,Ansible,我试图使用Ansible执行一个简单的python--version命令,但无论我如何尝试,它都不起作用:通过shell模块,通过命令模块,通过脚本模块,通过playbook或ad-hoc 我总是遇到一个错误: 未知选项 例如,剧本: --- - name: testing hosts: myhost sudo: False tasks: - name: python version shell: python --version 然后我意识到这

我试图使用Ansible执行一个简单的
python--version
命令,但无论我如何尝试,它都不起作用:通过
shell
模块,通过
命令
模块,通过
脚本
模块,通过playbook或ad-hoc

我总是遇到一个错误:

未知选项

例如,剧本:

---

- name: testing
  hosts: myhost
  sudo: False

  tasks:
       - name: python version
         shell: python --version
然后我意识到这是由于Ansible如何在SSH会话中加载环境造成的。实际上,错误不是来自Ansible或命令解析,而是来自Python版本2.4,它以某种方式进入了路径(
/usr/local/bin

Python 2.4似乎不知道
--version
标志

最有趣的部分是,当我对与Ansible相同的用户相同的主机执行SSH时,我会以正确的顺序获得
PATH
元素,Python存在的第一个位置是Python3的正确位置,而
/usr/local/bin
则深深地埋藏在
路径中

但是,当我在剧本中添加了一个
哪个python
任务时,我看到Ansible从
/usr/local/bin
解析python,这是旧的(v2.4)

当我执行
ansible myhost-m设置时
我可以看到
ansible_env.PATH
变量比我直接登录得到的
路径要短得多

如果你能理解这是如何建立起来的,那就太好了

这里提出了完全相同的问题:

但是没有明确的答案。

  • 要获得执行模块和ansible本身的
    python
    版本,您应该使用ansible\u事实
    ansible\u python\u版本
  • (我的自制建议)在使用
    命令
    模块时使用完整路径
所以对我来说正确的答案是:在库存文件中设置
ansible\u python\u解释器=/path/to/correct/python
然后 能够在登录到远程和远程服务器时使用指定的python 很明显,你可以在路上找到它

事实并非如此
-shell:python--version
不会使用
ansible\u python\u解释器
。它只是通过在path中查找可执行文件(如果不是绝对路径)来执行您给它的任何命令

例如,如果

  • 您已经设置了启动文件(
    /etc/profile
    /etc/profile.d/*
    *rc
    等),使得python 2.4在
    路径中处于第一位,并且
  • 您为我的主机将
    ansible\u python\u解释器设置为
    /path/to/python3
然后:

您应该执行以下操作之一:

  • 正确设置路径。(这实际上不是一个选项,因为“ansible如何设置路径”未定义,请参见下面的Eugene评论)
  • 将绝对路径与
    命令
    模块(或
    shell
    模块)一起使用

没错,ansible\u python\u解释器无法解决路径问题。困惑来自于这样一个事实,即无法说明ansible_env.PATH是如何设置的,我不是唯一一个困惑的人:
- hosts: my_host
  tasks:
    - debug: msg="{{ansible_python_interpreter}}"      # would print /path/to/python3
    - debug: msg="{{ansible_python_version}}"          # would print 3.x
    - shell: python -c 'import sys; print sys.version' # would execute python 2.4
      register: py_version
    - debug: msg="{{py_version}}"                      # would print 2.4