Python Ansible-如何在SSH会话中设置Ansible_env.PATH
我试图使用Ansible执行一个简单的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 然后我意识到这
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