如何为本地和远程主机设置不同的python解释器

TmT*_*ron 6 ansible

用例:

剧本1

  • 当我们第一次连接到远程主机时,远程主机已经安装了一些 python 版本 - 自动发现功能会找到它
  • 现在我们在远程主机上安装ansible-docker
  • 从现在开始:ansible-docker 文档建议使用ansible_python_interpreter=/usr/bin/env python-docker

剧本2

我们再次连接到同一主机,但现在我们必须使用/usr/bin/env python-dockerpython 解释器

做这个的最好方式是什么?

目前我们设定的ansible_python_interpreter剧本级别为Playbook 2

---
- name: DaqMon app
  vars:
  - ansible_python_interpreter: "{{ '/usr/bin/env python-docker' }}"
Run Code Online (Sandbox Code Playgroud)

这是可行的,但这也会改变本地操作的 python 解释器。因此本地操作将会失败,因为 (python-docker本地不存在)。

  • 当前的解决方法是显式指定 ansible_python_interpreter每个本地操作,这是乏味且容易出错的

问题

  • 理想的解决方案是,如果我们可以将'/usr/bin/env python-docker'后备添加到terpreter-python-fallback - 但我认为这是不可能的
  • 有没有办法只为远程主机设置 python 解释器 - 并保留本地主机的默认值?
  • 或者是否可以显式覆盖本地主机的 python 解释器?

TmT*_*ron 7

感谢其他有用的答案,我找到了一个简单的解决方案:

  • 在剧本级别,我们将 python 解释器设置为/usr/bin/env python-docker
  • 然后我们使用一个set_fact任务来覆盖仅本地主机的解释器
    • 我们还必须将事实委托给
    • 我们可以使用 magicansible_playbook_python变量,它指的是(本地)Ansible 主机上使用的 python 解释器来启动 playbook:请参阅Ansible 文档

以下是开头的重要部分Playbook 2

---
- name: Playbook 2
  vars:
  - ansible_python_interpreter: "{{ '/usr/bin/env python-docker' }}"
  ...
  tasks:
  - set_fact:
      ansible_python_interpreter: '{{ ansible_playbook_python }}'
    delegate_to: localhost    
    delegate_facts: true
Run Code Online (Sandbox Code Playgroud)


xen*_*nlo 6

ansible_python_interpreter您应该在主机级别设置。

所以是的,可以在清单中显式设置 localhost的解释器。

localhost   ansible_connection=local ansible_python_interpreter=/usr/bin/python
Run Code Online (Sandbox Code Playgroud)

我假设您也可以在本地主机或 docker 主机上使用set_facton 。hostvars[<host>].ansible_python_interpreter

有一篇关于的精彩文章set_facthostvars !;-P