首页 文章

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

提问于
浏览
4

我试图使用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 回答

  • 1
    • 要获得执行模块的 python 版本和ansible本身,您应该使用ansible_fact ansible_python_version

    • (我的自制建议)使用 command 模块时使用完整路径 .

    所以对我来说正确的答案是:在库存文件中设置ansible_python_interpreter = / path / to / correct / python然后它将能够在登录到远程时使用指示的python并且显然在PATH中找到它 .

    这不是真的 . - 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

    然后:

    - 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
    

    你应该做的是以下之一:

    • 正确设置PATH . (这不是一个真正的选择因为"how ansible sets PATH"未定义,请参阅下面的Eugene评论)

    • 使用 command 模块的绝对路径(或者 shell ) .

相关问题