我试图使用Ansible执行一个简单的 python --version
命令,无论我怎么做都无法工作:通过 shell
模块,通过 command
模块,通过 script
模块,通过playbook或ad-hoc .
我总是收到一个错误:
未知选项
例如剧本:
---
- name: testing
hosts: myhost
sudo: False
tasks:
- name: python version
shell: python --version
然后我意识到这是因为Ansible如何在SSH会话中加载环境 . 实际上,错误不是来自Ansible或命令解析,而是来自Python版本2.4,它以某种方式进入PATH( /usr/local/bin
) .
好像Python 2.4不知道 --version
标志 .
最有趣的部分是,当我按正确顺序获取 PATH
元素时,Python存在的第一个位置是Python 3的正确位置,而 /usr/local/bin
深埋在 PATH
中 .
但是当我在剧本中添加一个 which python
任务时,我看到Ansible从 /usr/local/bin
解析了Python,那是旧的(v2.4)
当我执行 ansible myhost -m setup
时,我可以看到 ansible_env.PATH
变量比我通过直接登录获得的 PATH
更短 .
很高兴了解如何设置它的规则 .
这里问了一个完全相同的问题:
http://grokbase.com/t/gg/ansible-project/1479n0d0qp/ansible-env-path-how-is-it-set
但没有明确的答案 .
1 回答
要获得执行模块的
python
版本和ansible本身,您应该使用ansible_factansible_python_version
(我的自制建议)使用
command
模块时使用完整路径 .这不是真的 .
- shell: python --version
不会使用ansible_python_interpreter
. 它只是通过在PATH中查找可执行文件(如果它不是绝对路径)来执行您给出的任何命令 .例如 . 如果
你已经设置了你的启动文件(
/etc/profile
,/etc/profile.d/*
,.*rc
等),这样python 2.4首先出现在PATH
中为my_host设置
ansible_python_interpreter
为/path/to/python3
然后:
你应该做的是以下之一:
正确设置PATH . (这不是一个真正的选择因为"how ansible sets PATH"未定义,请参阅下面的Eugene评论)
使用
command
模块的绝对路径(或者shell
) .