返回文章列表

Ansible Playbook 重構與 Django 佈署

本文說明如何將 Ansible Playbook 重構為 Roles,提升程式碼重複使用性與維護性,並示範如何使用 Ansible 佈署 Django 應用程式,包含設定資料函式庫、建立 Django 專案、組態設定檔與建立超級使用者等步驟。

DevOps Web 開發

Ansible Roles 將相關任務、變數和檔案組織成可重複使用的模組,簡化 Playbook 的管理和維護。本文首先將現有的 Playbook 重構為 web_serverdb_server 兩個 Roles,分別負責 Web 伺服器和資料函式庫伺服器的組態。接著,新增 django_app Role,負責 Django 應用程式的佈署,包含安裝 Django、建立專案目錄、組態 settings.py 檔案、資料函式庫遷移和建立超級使用者。最後,整合所有 Roles 至 site.yml 檔案,並透過 Ansible 命令列執行佈署,實作 Django 應用程式的自動化佈署。

將 Ansible Playbook 重構為角色(Roles)

在前面的章節中,我們學習瞭如何使用 Ansible 建立和管理伺服器。本章節將介紹如何將現有的 Playbook 重構為 Ansible 角色(Roles),以提高程式碼的可重用性和可維護性。

為什麼使用 Ansible 角色?

Ansible 角色是一種將相關任務、處理程式(handlers)、變數和範本組織在一起的方法。使用角色可以使你的 Playbook 更具結構和可重用性。

建立 Web 伺服器角色

首先,我們將建立一個名為 web_server 的角色,用於組態和管理 Web 伺服器。

  1. 建立角色目錄結構

mkdir -p roles/web_server/{files,handlers,meta,tasks,templates,vars,defaults}


   這條命令建立了 `web_server` 角色所需的目錄結構。

2. **定義任務**

   將原有的 `webserver-playbook.yml` 檔案中的任務複製到 `roles/web_server/tasks/main.yml` 中,並進行必要的修改,以移除不再需要的變數和主機資訊。

   ```yml
---
- name: disable pmp_event on apache
  shell: "a2dismod mpm_event"
  notify:
    - restart apache2

- name: enable cgi on apache
  shell: "a2enmod mpm_prefork cgi"
  notify:
    - restart apache2

- name: install pymysql module for index to use
  pip: name=pymysql executable=pip3

- name: add in a test directory
  file: path=/var/www/test/ state=directory

- name: add in your index file
  copy: src=index.py dest=/var/www/test/index.py mode=755
  notify:
    - restart apache2

內容解密:

  • a2dismod mpm_event:停用 Apache 的 mpm_event 模組。
  • a2enmod mpm_prefork cgi:啟用 mpm_preforkcgi 模組,以支援 CGI 指令碼。
  • pip: name=pymysql executable=pip3:安裝 pymysql 模組,用於 Python 3。
  • file: path=/var/www/test/ state=directory:建立 /var/www/test/ 目錄。
  • copy: src=index.py dest=/var/www/test/index.py mode=755:複製 index.py 檔案到目標目錄,並設定許可權為 755。
  1. 處理程式(Handlers)

    roles/web_server/handlers/main.yml 中定義處理程式。


  • name: restart apache2 service: name=apache2 state=restarted

   #### 內容解密:
   - 當觸發 `restart apache2` 處理程式時,重啟 Apache2 服務。

4. **執行角色**

   建立一個新的 Playbook 檔案 `site.yml`,用於執行 `web_server` 角色。

   ```yml
---
- hosts: webserver
  roles:
    - web_server

內容解密:

  • 指定在 webserver 主機上執行 web_server 角色。
  1. 執行 Playbook

ansible-playbook -i hosts site.yml


### 建立資料函式庫伺服器角色

接下來,我們將建立一個名為 `db_server` 的角色,用於組態和管理資料函式庫伺服器。

1. **建立角色目錄結構**

   ```bash
mkdir -p roles/db_server/{files,handlers,meta,tasks,templates,vars,defaults}
  1. 定義任務

    將原有的 dbserver-playbook.yml 檔案中的任務複製到 roles/db_server/tasks/main.yml 中,並進行必要的修改。


  • name: install mysql and python-mysqldb apt: name={{ item }} update_cache=yes cache_valid_time=3600 state=present with_items:

    • python3-mysqldb
    • mysql-server
  • name: start up the mysql service shell: “service mysql start”

  • name: ensure mysql is enabled to run on startup service: name=mysql state=started enabled=true

  • name: update mysql root password for all root accounts mysql_user: name: root host: “{{ item }}” login_unix_socket: /var/run/mysqld/mysqld.sock password: “{{ mysql_root_password }}” login_user: root login_password: “{{ mysql_root_password }}” check_implicit_admin: yes priv: “.:ALL,GRANT” with_items:

    列出主機項


   #### 內容解密:
   - 安裝 MySQL 和 Python 的 MySQLdb。
   - 啟動 MySQL 服務並設定為開機啟動。
   - 更新 MySQL root 使用者的密碼。

## 使用Ansible Roles擴充套件Playbook功能

在前面的章節中,我們已經學習瞭如何使用Ansible來自動化佈署一個簡單的LAMP(Linux、Apache、MySQL、PHP/Python/Perl)環境。本章節將探討如何使用Ansible Roles來擴充套件Playbook的功能,使其更加模組化和可重用。

### 建立DB Server Role

首先,我們需要為資料函式庫伺服器建立一個新的Role。這個Role將負責安裝MySQL資料函式庫並進行初始設定。

1. **建立Role目錄結構**:執行以下命令來建立`db_server` Role的目錄結構。
   ```bash
   mkdir -p roles/db_server/{defaults,files,handlers,meta,tasks,templates,vars}
  1. 定義Tasks:在roles/db_server/tasks/main.yml檔案中定義安裝和設定MySQL的Tasks。

  • name: 安裝MySQL伺服器 apt: name: mysql-server state: present

  • name: 設定MySQL root密碼 mysql_user: name: root password: “{{ mysql_root_password }}” priv: “.:ALL,GRANT”

  • name: 建立新的資料函式庫 mysql_db: name: testdb state: present login_user: root login_password: “{{ mysql_root_password }}”

  • name: 匯入樣本資料到資料函式庫 mysql_db: name: testdb state: import target: /tmp/dump.sql login_user: root login_password: “{{ mysql_root_password }}”


3. **定義變數**:在`roles/db_server/vars/main.yml`檔案中定義Role所需的變數。
```yml

---
mysql_root_password: password
  1. 複製樣本資料:將包含樣本資料的dump.sql檔案複製到roles/db_server/files/目錄下。

將Roles新增到Playbook

  1. 更新site.yml:編輯site.yml檔案,將web_serverdb_server Roles新增到Playbook中。

  • hosts: webserver roles:
    • web_server
    • db_server

2. **執行Playbook**:執行以下命令來佈署Roles。
```bash
ansible-playbook -i hosts site.yml

使用Ansible命令列變數和選項

Ansible允許透過命令列傳遞額外的變數,這些變數可以覆寫Role中定義的變數。使用--extra-vars-e選項可以實作這一點。

命令列變數範例

ansible-playbook -i hosts site.yml --extra-vars "mysql_root_password=newpassword"

擴充套件LAMP環境以支援Django

  1. 建立Django App Role:為Django應用程式建立一個新的Role,負責安裝Django並進行初始設定。

    mkdir -p roles/django_app/{defaults,files,handlers,meta,tasks,templates,vars}
    
  2. 定義Django App Tasks:在roles/django_app/tasks/main.yml檔案中定義安裝Django和建立應用程式目錄的Tasks。


  • name: 安裝Django並確保其為最新版本 apt: name: python3-django state: latest

  • name: 建立應用程式目錄 file: path: /path/to/django/app state: directory


#### 內容解密:
- **安裝Django**:使用`apt`模組安裝`python3-django`套件,確保系統上安裝了最新版本的Django。
- **建立應用程式目錄**:使用`file`模組建立一個新的目錄,用於存放Django應用程式的檔案。

## 使用 Ansible 佈署 Django 應用程式

### 介紹
本章節將介紹如何使用 Ansible 佈署 Django 應用程式。我們將建立一個新的 Ansible 角色 `django_app`,並將其新增到現有的 `site.yml` 檔案中。

### 建立 django_app 角色
首先,我們需要建立一個新的 Ansible 角色 `django_app`。在 `roles` 目錄下建立一個新的目錄 `django_app`,並在其中建立 `tasks` 目錄和 `main.yml` 檔案。

#### main.yml 檔案內容
```yml
---
- name: install python3-django
apt: name=python3-django state=present

- name: create a directory for our django app
file: path={{ django_app_location }}/web_app mode=0755 owner=user group=user state=directory

- name: create your new django app in the web_app directory
shell: django-admin startproject web_app {{ django_app_location }}/web_app

- name: configure your database to use work with django
copy: src=settings.py dest={{ django_app_location }}/web_app/web_app/settings.py

- name: apply a migration into the mysql database
shell: python3 {{ django_app_location }}/web_app/manage.py migrate

- name: populate admin with password
shell: python3 {{ django_app_location }}/web_app/manage.py shell -c "from django.contrib.auth.models import User; User.objects.filter(username='admin').exists() or User.objects.create_superuser('admin','[email protected]', 'changeme')"

設定 settings.py 檔案

我們需要建立一個 settings.py 檔案,並將其放置在 roles/django_app/files/ 目錄下。這個檔案將用於組態 Django 應用程式的資料函式庫連線。

settings.py 檔案內容(重點片段)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'web_app',
        'USER': 'root',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}

ALLOWED_HOSTS = ['0.0.0.0']

修改 db_server 角色

我們需要修改 db_server 角色,以建立一個名為 web_app 的資料函式庫。

修改後的 db_server/tasks/main.yml 檔案內容(重點片段)

- name: create a new database
  mysql_db: name=web_app state=present login_user=root login_password="{{ mysql_root_password }}"

將 django_app 角色新增到 site.yml 檔案中

---
- hosts: webserver
  roles:
    - web_server
    - db_server
    - django_app

執行 Ansible Playbook

使用以下命令執行 Ansible Playbook,並指定 django_app_location 變數:

ansible-playbook -i hosts site.yml --extra-vars django_app_location=`pwd`

測試 Django 應用程式

執行以下命令以啟動 Django 測試伺服器:

python3 web_app/manage.py runserver 0.0.0.0:8000

存取 http://localhost:8000/ 以檢視 Django 歡迎頁面。

程式碼解析:

  1. settings.py 中的資料函式庫設定:我們將資料函式庫引擎設定為 django.db.backends.mysql,並指定資料函式庫名稱、使用者名稱、密碼、主機和連線埠。
  2. ALLOWED_HOSTS 設定:我們將 ALLOWED_HOSTS 設定為 ['0.0.0.0'],以允許從任何 IP 位址存取 Django 應用程式。
  3. db_server 角色的修改:我們修改了 db_server 角色,以建立一個名為 web_app 的資料函式庫。
  4. django_app 角色的建立:我們建立了一個新的 Ansible 角色 django_app,用於安裝 Django、建立 Django 應用程式、組態資料函式庫連線和建立超級使用者。