我和我的同事使用 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 等,取決於本機環境)。