如何偵測受管主機上的Python版本

因為需要知道受管主機上的 Python,所以就弄了個簡單的 Playbook 來偵測。

Ansible 因為本身需要 Python 來運行 Playbook,自然會收集 Python 的資訊以作為執行的參考。

在 gather_facts 沒有被設定為 no 的情況下,Ansible 在執行 playbook 時就會收集受管主機的相關資訊,因此可以使用以下變數來取得 Python 的版本資訊

  • ansible_facts.python
  • ansible_facts.python.executable
  • ansible_facts.python.version

下面這個 Playbook 就展示了如何印出 Python 的執行檔路徑、版本資訊與 Linux 發行版資訊。

---
- name: Test interpreter
  hosts: all

  tasks:
  - name: display python version
    debug:
      msg: "{{ansible_facts.python.executable}} {{ansible_facts.python.version.major}}.{{ansible_facts.python.version.minor}}"
  - name: display distribution version
    debug:
      msg: "{{ansible_distribution}} {{ansible_distribution_version}}"

那麼 Ansible 是怎麼判斷使用哪個 Python 呢?這邊是可以在 ansible.cfg 裡設定的。

在 ansible.cfg 的 [defaults] 區段裡加入 interpreter_python= 就可以告知 ansible 該怎麼去找 python

  • auto_legacy: 這會偵測受管主機的作業系統、Linux 發行套件以及 Python 版本,然後依據一份內定的表格來判斷使用哪一個 python。
  • auto: 在 2.12 後,auto 就是預設值,這會偵測受管主機的作業系統、Linux 發行套件以及 Python 版本來決定使用哪一個 python。
  • auto_legacy_silent: 跟 auto_legacy 一樣,只是不印出 warning
  • auto_silent: 跟 auto 一樣,只是不印出 warning

auto_legacy 跟 auto 主要的差異就是偵測 Python 的方法不一樣。

如果想要直接指定 python 路徑也是可以的,所以 ansible.cfg 裡也可以這樣寫,讓 Ansible 使用 /usr/bin/python3

[defaults]
interpreter_python = /usr/bin/python3

以下列出幾個 Linux 發行版本所偵測出來的 Python 版本:

  • RHEL 7: /usr/bin/python 2.7
  • RHEL 8: /usr/libexec/platform-python 3.6
  • Ubuntu 20.04: /usr/bin/python 2.7

參考文件