如何在 Ansible 中使用靜態和動態清單?


Ansible 是一個強大的自動化工具,允許您管理和配置系統、部署軟體以及編排更高階的 IT 任務,例如持續部署或零停機滾動更新。Ansible 的關鍵元件之一是清單檔案,它描述了劇本中命令、模組和任務執行的主機和主機組。

在本文中,我們將探討如何在 Ansible 中使用靜態和動態清單,並附帶示例及其輸出。

靜態清單

靜態清單是管理和組織伺服器的最簡單方法。它們以 INI 或 YAML 格式定義。這是一個 INI 格式的靜態清單示例:

[webservers]
webserver1.example.com
webserver2.example.com

[dbservers]
dbserver1.example.com

在這個例子中,我們有兩個組:webservers 和 dbservers。每個組包含該組中伺服器的主機名。

您可以在劇本中使用這些組來為不同的任務定位特定的伺服器。例如:

- hosts: webservers
  tasks:
    - name: ensure apache is at the latest version
      ansible.builtin.yum:
        name: httpd
        state: latest

在這個劇本中,確保 Apache 為最新版本的任務將只在 webservers 組中的伺服器上執行。

更多靜態清單示例

在靜態清單中使用變數

您可以在靜態清單檔案中定義變數。這些變數可以在您的劇本中使用。這是一個示例:

[webservers]
webserver1.example.com http_port=80 max_clients=200

[dbservers]
dbserver1.example.com mysql_port=3306

在這個例子中,http_port 和 max_clients 變數是為 webserver1.example.com 定義的,mysql_port 變數是為 dbserver1.example.com 定義的。您可以像這樣在您的劇本中使用這些變數:

- hosts: webservers
  tasks:
    - name: ensure apache is running on the right port
      ansible.builtin.template:
        src: /srv/httpd.j2
        dest: /etc/httpd.conf

在 httpd.j2 模板檔案中,您可以像這樣使用 http_port 變數:

Listen {{ http_port }}

在靜態清單中使用子組

您還可以在靜態清單檔案中定義子組。這是一個示例:

[atlanta]
host1
host2

[raleigh]
host3
host4

[southeast:children]
atlanta
raleigh

在這個例子中,atlanta 和 raleigh 是 southeast 組的子組。您可以在劇本中使用 southeast 組來定位 atlanta 和 raleigh 組中的所有主機。

在靜態清單中使用別名

在靜態清單中,您可以為主機分配別名。這對於使您的劇本更易讀很有用。這是一個示例:

[webservers]
web1 ansible_host=webserver1.example.com
web2 ansible_host=webserver2.example.com

[dbservers]
db1 ansible_host=dbserver1.example.com

在這個例子中,web1 和 web2 分別是 webserver1.example.com 和 webserver2.example.com 的別名。同樣,db1 是 dbserver1.example.com 的別名。您可以像這樣在您的劇本中使用這些別名:

- hosts: web1
  tasks:
    - name: ensure apache is at the latest version
      ansible.builtin.yum:
        name: httpd
        state: latest

在單獨的檔案中定義變數

如果您有很多變數,那麼在一個單獨的檔案中定義它們可能會更清晰。以下是如何操作:

[webservers]
webserver1.example.com
webserver2.example.com

[dbservers]
dbserver1.example.com

建立一個名為 group_vars/webservers 的單獨檔案:

http_port: 80
max_clients: 200

在這個例子中,http_port 和 max_clients 變數是為 webservers 組中的所有主機定義的。您可以像以前一樣在您的劇本中使用這些變數。

動態清單

靜態清單易於理解和使用,但是隨著您管理的伺服器數量的增加,它們可能變得難以管理。這就是動態清單的用武之地。

動態清單是動態生成清單資料的指令碼。當您使用雲提供商時,它們特別有用,因為伺服器的數量可能會頻繁變化。

以下是如何使用 AWS 動態清單的示例:

首先,您需要安裝 boto 庫,它允許 Python 與 AWS 互動:

pip install boto

接下來,您需要建立一個檢索您的 AWS 例項的指令碼。Ansible 提供了一個用於此目的的指令碼。

您還需要為指令碼建立一個配置檔案,它可能如下所示:

[ec2]
regions = us-west-2
destination_variable = public_dns_name
vpc_destination_variable = ip_address

此配置檔案告訴指令碼從 us-west-2 區域檢索例項,並將 public_dns_name 和 ip_address 作為目標變數。

然後,您可以在劇本中使用該指令碼作為清單:

ansible-playbook -i ec2.py playbook.yml

在此命令中,-i ec2.py 告訴 Ansible 使用 ec2.py 指令碼作為清單。

更多動態清單示例

在 AWS 動態清單中使用標籤

您可以使用標籤來進一步過濾動態清單中的 AWS 例項。以下是如何操作:

首先,將標籤新增到您的 AWS 例項。您可以新增一個名為 Type,值為 WebServer 的標籤。

接下來,修改您的 ec2.ini 配置檔案以包含 tags 選項:

[ec2]
regions = us-west-2
destination_variable = public_dns_name
vpc_destination_variable = ip_address
tags = Type:WebServer

此配置檔案現在將只檢索具有值為 WebServer 的 Type 標籤的例項。

使用 Azure 動態清單

您還可以使用 Azure 動態清單。以下是如何操作:

首先,您需要安裝 azure 庫:

pip install azure

接下來,您需要建立一個檢索您的 Azure VM 的指令碼。Ansible 提供了一個用於此目的的指令碼。

您還需要為指令碼建立一個配置檔案,它可能如下所示:

[azure]
subscription_id = your_subscription_id
client_id = your_client_id
secret = your_secret
tenant = your_tenant_id

然後,您可以在劇本中使用該指令碼作為清單:

ansible-playbook -i azure_rm.py playbook.yml

在此命令中,-i azure_rm.py 告訴 Ansible 使用 azure_rm.py 指令碼作為清單。

使用 Google Cloud Platform (GCP) 動態清單

您還可以使用 GCP 動態清單。以下是如何操作:

首先,您需要安裝 google-auth 庫:

pip install google-auth

接下來,您需要建立一個檢索您的 GCP 例項的指令碼。Ansible 提供了一個用於此目的的指令碼。

您還需要為指令碼建立一個配置檔案,它可能如下所示:

[gce]
project = your_project_id
auth_kind = serviceaccount
service_account_file = /path/to/your/service/account/file.json

然後,您可以在劇本中使用該指令碼作為清單:

ansible-playbook -i gce.py playbook.yml

在此命令中,-i gce.py 告訴 Ansible 使用 gce.py 指令碼作為清單。

使用 Docker 動態清單

您也可以使用 Docker 動態清單。以下是如何操作:

首先,您需要安裝 docker 庫:

pip install docker

接下來,您需要建立一個檢索您的 Docker 容器的指令碼。Ansible 提供了一個用於此目的的指令碼。

然後,您可以在劇本中使用該指令碼作為清單:

ansible-playbook -i docker.py playbook.yml

在此命令中,-i docker.py 告訴 Ansible 使用 docker.py 指令碼作為清單。

結論

您選擇在 Ansible 中使用靜態清單還是動態清單將取決於您的具體用例。靜態清單簡單直接,但是隨著伺服器數量的增加,它們可能變得難以管理。另一方面,動態清單更復雜,但可以更容易地處理大量伺服器,尤其是在這些伺服器託管在雲提供商上的情況下。

更新於:2023年7月13日

464 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告