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

时间:2019-08-26 10:24:00

标签: ansible

用例:

Playbook 1

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

Playbook 2

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

什么是最好的方法?

当前,我们在ansible_python_interpreter的剧本级别上设置Playbook 2

---
- name: DaqMon app
  vars:
  - ansible_python_interpreter: "{{ '/usr/bin/env python-docker' }}"

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

  • 当前的解决方法是在每个繁琐且容易出错的本地操作上明确指定ansible_python_interpreter

问题

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

5 个答案:

答案 0 :(得分:2)

尝试在第一本书的主机级别上将set_fact用于ansible_python_interpreter

答案 1 :(得分:1)

您应在主机级别上设置ansible_python_interpreter

是的,可以为localhost in your inventory显式设置解释器。

localhost   ansible_connection=local ansible_python_interpreter=/usr/bin/python

我假设您还可以在本地主机或Docker主机上的set_fact上使用hostvars[<host>].ansible_python_interpreter

有一个brillant article about set_fact on hostvars ! ;-P

答案 2 :(得分:0)

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

  • 在剧本级别,我们将python解释器设置为/usr/bin/env python-docker
  • 然后我们使用set_fact任务来覆盖仅本地主机的解释器
    • 我们还必须delegate the facts
    • 我们可以使用神奇的ansible_playbook_python变量,该变量引用在(本地)Ansible主机上用于启动剧本的python解释器:请参见Ansible docs

这是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

答案 3 :(得分:0)

在全球范围内,使用ansible.cfg的[defaults]部分中的interpreter_python键

interpreter_python = auto_silent

答案 4 :(得分:0)

使用配置文件禁用此警告

cat>> ansible.cfg << EOF
[defaults]
interpreter_python=auto_legacy_silent
EOF