Ansible Playbook 如何建立和配置劇本


如果您是系統管理員或 DevOps 工程師,您就會知道自動化在日常操作中的重要性。Ansible 是最流行的自動化工具之一,它是一個配置管理工具,可以簡化伺服器、網路裝置和其他 IT 基礎設施的管理。在本文中,我們將深入探討 Ansible 劇本,這是 Ansible 的一項強大功能,允許您自動化複雜的任務和配置。

什麼是 Ansible 劇本?

Ansible 劇本是一個 YAML 檔案,描述了一組要在一個或多個主機上執行的任務。劇本是 Ansible 自動化的核心,提供了一種結構化的方式來定義和按特定順序執行任務。劇本是用 YAML 編寫的,YAML 是一種人類可讀的資料序列化語言,並且它們可以像任何其他文字檔案一樣進行版本控制。即使是非程式設計師,也很容易閱讀、編寫和理解劇本。

Ansible 劇本的結構

Ansible 劇本由四個主要元件組成:

  • 主機 - 將要執行任務的目標主機。可以使用 IP 地址、主機名或與主機組匹配的模式來定義主機。

  • 變數 - 變數定義劇本中任務使用的資料。可以在劇本級別或任務級別定義變數。它們也可以設定為預設值,或在每個主機或每個組的基礎上進行覆蓋。

  • 任務 - 任務定義要在目標主機上執行的操作。任務可以由模組組成,模組是預構建的 Ansible 指令碼,執行特定功能,例如管理檔案、安裝軟體包或重新啟動服務。

  • 處理器 - 處理器定義要根據任務觸發的事件執行的操作。處理器類似於任務,但僅在任務通知它們時才執行。例如,處理器可用於僅在任務更改服務時重新啟動服務。

建立 Ansible 劇本

建立 Ansible 劇本是一個簡單的過程。首先,您需要建立一個 YAML 檔案並定義主機、變數、任務和處理器。以下是一個簡單劇本的示例,該劇本在一個主機組上安裝一個軟體包:

---
- hosts: webservers
	become: yes
	tasks:
	- name: Install Apache2
	apt:
		name: apache2
		state: latest
	handlers:
	- name: Restart Apache2
	service:
		name: apache2
		state: restarted

在這個示例中,我們定義了一個名為“webservers”的主機組,並指示我們希望以 root 使用者身份執行任務(使用“become: yes”)。我們定義了一個名為“安裝 Apache2”的任務,該任務使用 apt 模組安裝最新版本的 Apache2 Web 伺服器。最後,我們定義了一個名為“重新啟動 Apache2”的處理器,該處理器在任務更改它時使用 service 模組重新啟動 Apache2 服務。

執行 Ansible 劇本

建立劇本後,可以使用“ansible-playbook”命令執行它。以下是如何執行我們之前建立的劇本的示例:

ansible-playbook playbook.yml

此命令將在“webservers”組中定義的所有主機上執行劇本。Ansible 將透過 SSH 連線到每個主機並按劇本中定義的順序執行任務。Ansible 還將收集和顯示每個任務和處理器的輸出。

Ansible 劇本的高階功能

Ansible 劇本提供了許多高階功能,允許您自動化複雜的任務和配置。以下是一些示例:

迴圈

迴圈允許您對列表中的每個專案重複一個任務。例如,當安裝多個軟體包或建立多個檔案時,這很有用。以下是一個使用迴圈安裝多個軟體包的劇本示例:

---
- hosts: webservers
  become: yes
  vars:
	packages:
	- apache2
	- mysql-server
	- php
  tasks:
  - name: Install packages
	apt:
		name: "{{ item }}"
		state: latest
	loop: "{{ packages }}"

在此示例中,我們定義了一個名為“packages”的變數,其中包含軟體包名稱列表。然後,我們使用迴圈遍歷列表並使用 apt 模組安裝每個軟體包。

條件語句

條件語句允許您根據某些條件執行任務。例如,當僅在尚未安裝軟體包時才安裝軟體包時,這很有用。以下是一個僅在尚未安裝軟體包時才安裝軟體包的劇本示例:

---
- hosts: webservers
  become: yes
  vars:
    package: apache2
  tasks:
  - name: Check if package is installed
    command: "dpkg -s {{ package }}"
    register: result
    ignore_errors: true
  - name: Install package
    apt:
      name: "{{ package }}"
      state: latest
    when: result.rc != 0

在此示例中,我們定義了一個名為“package”的變數,其中包含要安裝的軟體包的名稱。我們使用“command”模組檢查軟體包是否已安裝,並將結果註冊到名為“result”的變數中。然後,我們使用條件語句僅在命令返回非零狀態程式碼(表示軟體包尚未安裝)時安裝軟體包。

角色

角色允許您將劇本組織成可重用的工作單元。角色包含特定於特定功能或應用程式的任務、處理器、變數和檔案。角色可以在多個劇本之間共享和重用。以下是一個安裝軟體包的簡單角色示例:

---
- name: Install Apache2
  become: yes
  apt:
    name: apache2
    state: latest

在此示例中,我們定義了一個名為“apache2”的角色,該角色使用 apt 模組安裝 Apache2 軟體包。然後,我們可以使用“include_role”模組在劇本中包含此角色:

---
- hosts: webservers
  become: yes
  tasks:
  - name: Install Apache2
    include_role:
      name: apache2

在此示例中,我們使用“include_role”模組在我們的劇本中包含“apache2”角色。Ansible 將自動執行角色中定義的任務。

以下是您可以用來自動化基礎設施的 Ansible 劇本的一些更高階功能:

變數和模板

Ansible 劇本允許您使用變數在任務之間傳遞值、定義預設值以及為特定主機或組覆蓋值。您還可以使用模板根據變數動態生成配置檔案。以下是一個使用變數和模板的劇本示例:

---
- hosts: webservers
  become: yes
  vars:
    server_name: example.com
    document_root: /var/www/html
  tasks:
  - name: Create virtual host file
    template:
      src: virtualhost.j2
      dest: /etc/apache2/sites-available/{{ server_name }}
  - name: Enable virtual host
    command: "a2ensite {{ server_name }}"
  - name: Create document root
    file:
      path: "{{ document_root }}"
      state: directory

在此示例中,我們為伺服器名稱和文件根目錄定義了變數。然後,我們使用模板模組根據名為“virtualhost.j2”的 Jinja2 模板生成虛擬主機配置檔案。我們使用“command”模組啟用虛擬主機,並使用“file”模組建立文件根目錄。

標籤

Ansible 劇本允許您為任務分配標籤,從而允許您根據其標籤選擇性地執行任務。這在除錯或測試劇本時很有用。以下是一個使用標籤的劇本示例:

---
- hosts: webservers
  become: yes
  tasks:
  - name: Install Apache2
    apt:
      name: apache2
      state: latest
    tags: apache
  - name: Install MySQL
    apt:
      name: mysql-server
      state: latest
    tags: mysql

在此示例中,我們為兩個任務“apache”和“mysql”分配了標籤。然後,我們可以使用“ansible-playbook”命令僅執行具有特定標籤的任務:

ansible-playbook playbook.yml --tags apache

此命令將僅執行具有“apache”標籤的任務。

Vault

Ansible 劇本允許您使用 Ansible Vault 對敏感資料進行加密。Vault 提供了一種方法以加密格式儲存和管理敏感資料,例如密碼、API 金鑰和 SSH 金鑰。以下是一個使用 Ansible Vault 的劇本示例:

---
- hosts: webservers
  become: yes
  vars:
    db_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          61646566336461333462323466633435386366663433663237663731346662336434303863316535
  tasks:
  - name: Create database user
    mysql_user:
      name: dbuser
      password: "{{ db_password }}"
      priv: '*.*:ALL,GRANT'

在此示例中,我們定義了一個名為“db_password”的變數,該變數使用 Ansible Vault 進行加密。然後,我們使用“mysql_user”模組建立一個數據庫使用者,並使用“{{ }}”語法傳遞加密的密碼。

結論

Ansible 劇本是自動化 IT 基礎設施的強大工具。劇本提供了一種結構化的方式來定義和按特定順序執行任務,從而可以輕鬆地自動化複雜的配置。即使是非程式設計師,也很容易閱讀、編寫和理解劇本。Ansible 提供了許多高階功能,例如迴圈、條件語句和角色,使您可以輕鬆地自動化複雜的任務和配置。如果您尚未使用 Ansible 劇本,現在就開始吧!

更新於: 2023年5月2日

705 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始
廣告