僅在 Ansible 中定義時才使用變數

僅在 Ansible 中定義時才使用變數

我和我的同事使用 Ansible 來管理一組伺服器。

我們使用本地主目錄中的 .ansible.cfg 檔案來設定本地環境並將 playbook 保存在 git 儲存庫中。

向伺服器進行身份驗證時,我使用 user1,他使用 user2。我們 95% 的伺服器都有這些帳戶,但由於歷史原因,少數伺服器只有「使用者」帳戶。

我們使用host_vars 為少數相關伺服器設定remote_user 變數。

然而,在我們的劇本中,我們通常使用「all」來規定我們想要存取哪些伺服器,並在命令列上使用 --limit 參數來準確指定哪些伺服器應該獲得更新。我們的伺服器叢集是由錯誤混搭、設計不良的伺服器遺留下來的,這些伺服器必須保持在線狀態,直到幾年後退役,我們發現這種方法最適合我們的需求。

我們的問題是,remote_user 參數是在 .ansible.cfg 檔案中設定的,它作為環境變數而不是腳本變數公開。

這意味著如果我們的任務包含:

remote_user: "{{ remote_user }}"

它僅適用於定義該變數的主機

對於我們未定義此變數的 95% 的主機,任務會失敗。

有沒有辦法只使用已定義的變數?

例如

如果定義了remote_user,則使用它,如果沒有定義,則使用.ansible.cfg中設定的環境變量

注意:我知道我可以使用:

- name: Do something 
  remote_user: "{{ remote_user }}"
  when: remote_user is defined

在任務定義中,但這僅適用於該任務,我不想更新所有任務

當我真正需要的是在主機定義中提供該條件時,即:

---
- hosts: all
    remote_user: "{{ remote_user }}"
    when: remote_user is defined

但這在 Ansible 中是非法的

答案1

像往常一樣,我在這裡推遲了2個小時提問,在我發布問題後5分鐘就找到了答案!

這真的很簡單。要為各個系統設定不同的remote_user,而不必對現有的劇本應用大量的駭客攻擊,只需將var新增至清單中的主機即可:

[web_servers]
server1 ansible_ssh_user=user
server2

在本例中,任何時候遊戲包含 server1,「user」都將用作 ssh 使用者。對於server2,將使用ansible.cfg 檔案中remote_user 的值(例如user1、user2 等,取決於本機環境)。

相關內容