研究-ansible_distribution

最近想要試著在 Oracle Linux 上安裝 Ansible Tower,Ansible Tower 的安裝腳本會中止安裝, 因為這並不是 Ansible Tower 所支援的發行版,那我就想是不是可以繞過 Linux 發行版本的檢查。

在 Ansible Tower 的安裝腳本裡去找,有找到,但卻太複雜,改不了,大致知道是依據 facts 來做。 那只好退而求其次,改為修改 ansible_distribution 這變數,看能不能騙過 Ansible Tower 的安裝腳本。

要變更 ansible_distribution 的方法意外的簡單,只要在執行 ansible_playbook 時,加上 -e ansible_distribution=RedHat 就可以了。

驗證的 playbook 如下,很簡單的印出這兩個變數的內容。

---
- name: gather information
  hosts: all

  tasks:
  - name: "Display"
    debug:
      msg: "{{ ansible_distribution }} {{ ansible_distribution_version }}"

先執行第一次,可以得到結果

$ ansible-playbook -i localhost, -u ansible -k playbook.yml

TASK [Display] ********************************************************************************************************************************************
ok: [localhost] => {
    "msg": "OracleLinux 8.5"
}

第二次加上 -e ansible_distribution=RedHat,得到結果如下

$ ansible-playbook -i localhost, -e ansible_distribution=RedHat -u ansible -k playbook.yml

TASK [Display] ********************************************************************************************************************************************
ok: [localhost] => {
    "msg": "RedHat 8.5"
}

只是事情往往沒有人所想的簡單,Ansible Tower 的安裝腳本太複雜,有太多 play,並不是很確定這樣是否都能生效。 所以這時我就想,ansible_distribution 是怎麼取得的呢? 翻找了 Ansible 的原始碼,找到了這一段:https://github.com/ansible/ansible/blob/devel/lib/ansible/module_utils/facts/system/distribution.py

單看程式碼,就可以猜到 Ansible 是怎麼做的了。他是直接去判斷 /etc 下是否有對應的 *-release 檔案來做判斷,然後讀取裡面的資訊。

在 OracleLinux 裡,是讀取 /etc/oracle-release;在 Red Hat Enterprise Linux 裡,是讀取 /etc/redhat-release。

所以這樣要騙過 Ansible 就簡單了,只要移除 /etc/oracle-release,然後把另外一台 Red Hat Enterprise Linux 的 /etc/redhat-release 與 /etc/os-release 複製過來,就可以順利讓 ansible_distribution 變為 RedHat 了。