配置 ansible.cfg

我們在上一個章節中在 Ansible 預設查找的路徑下建立了我們的第一個 role 並成功執行部署。然而,若今天我們希望 Ansible 根據我們自己定義的路徑來執行 role 呢?以筆者自身的經驗而言,根據 role 屬性的不同,可能有些 role 我們認為較為是通用的就會放在 public repo 上,但有些 roles 則因為安全性的考量,所以需要放在 private repo 裡。我們並不希望將這兩類的 roles 全部丟到同一個路徑下,這樣既不好管理也容易產生混淆。那在這樣的情況下,我們有辦法透過任何方式來解決這個問題嗎?

什麼是 ansible.cfg?

答案顯然是有的。在 Ansible 中,我們可以透過配置 Ansible 的組態檔案 - ansible.cfg,來指定 Ansible 要去哪裡查找 role 的路徑

在工作目錄新增一個檔案 ansible.cfg 並加入以下內容:

  1. [defaults]
  2. roles_path = /path/to/roles

如此一來,Ansible 除了預設查找路徑外,還會依此指定路徑去找到我們 role 的存放位置。假設有多個 role 路徑需要設定,我們還可以透過 : 來串接不同 role 的存放路徑,比如:

  1. [defaults]
  2. roles_path = /path/to/public_roles:/path/to/private_roles

ansible.cfg 還可以做什麼?

若點進官方配置文件的說明頁面,可以發現除了 roles_path 之外還有一大堆參數可以依據使用者的需求進行非常有彈性的配置。還記得我們在之前的章節中,必須要在運行 ansible-playbook 的時候同時加上 -i 以及 --private-key 的參數來告訴 Ansible 我們的 inventory file 跟 SSH 金鑰的存放位置嗎?我們並不想要在每次運行都要輸入這一大串資料,因此我們可以在 ansible.cfg 裡定義 inventoryprivate_key_file 來方便我們管理這類資訊:

  1. [defaults]
  2. private_key_file = /path/to/private_key
  3. inventory = /path/to/inventory
  4. roles_path = /path/to/roles

定義完成後,在未來我們只需要運行 ansible-playbook playbook.yml 簡單一行指令就可以輕鬆使用 Ansible 來進行部署拉!

其中值得注意的是,在這個示範裡面我是將 ansible.cfg 這個配置檔案置於我們工作資料夾之下,目前具體資料夾結構如下:

  1. workspace
  2. ├── Vagrantfile
  3. ├── ansible.cfg
  4. ├── inventory
  5. ├── playbook.yml
  6. └── roles
  7. └── pip
  8. └── tasks
  9. └── main.yml

但從官方文件中,我們可以發現除了將配置檔案放置於工作目錄底下外,還有其他幾種不同的配置方式:

  1. 設置環境變量 (ANSIBLE_CONFIG)
  2. 置於當前目錄下的 ansible.cfg(這次範例中使用的方法)
  3. 置於根目錄下的 .ansible.cfg
  4. 置於 /etc/ansible/ 下的 ansible.cfg

若我們同時分別有不同的配置文件存在在系統中,Ansible 會依照上述順序逐一查找文件,若找到其中一個,就會依其設定進行配置,並不再繼續查找。