Ansible Roles 將相關任務、變數和檔案組織成可重複使用的模組,簡化 Playbook 的管理和維護。本文首先將現有的 Playbook 重構為 web_server 和 db_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 伺服器。
建立角色目錄結構
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_prefork和cgi模組,以支援 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。
處理程式(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角色。
執行 Playbook
ansible-playbook -i hosts site.yml
### 建立資料函式庫伺服器角色
接下來,我們將建立一個名為 `db_server` 的角色,用於組態和管理資料函式庫伺服器。
1. **建立角色目錄結構**
```bash
mkdir -p roles/db_server/{files,handlers,meta,tasks,templates,vars,defaults}
定義任務
將原有的
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}
- 定義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
- 複製樣本資料:將包含樣本資料的
dump.sql檔案複製到roles/db_server/files/目錄下。
將Roles新增到Playbook
- 更新site.yml:編輯
site.yml檔案,將web_server和db_serverRoles新增到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
建立Django App Role:為Django應用程式建立一個新的Role,負責安裝Django並進行初始設定。
mkdir -p roles/django_app/{defaults,files,handlers,meta,tasks,templates,vars}定義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 歡迎頁面。
程式碼解析:
settings.py中的資料函式庫設定:我們將資料函式庫引擎設定為django.db.backends.mysql,並指定資料函式庫名稱、使用者名稱、密碼、主機和連線埠。ALLOWED_HOSTS設定:我們將ALLOWED_HOSTS設定為['0.0.0.0'],以允許從任何 IP 位址存取 Django 應用程式。db_server角色的修改:我們修改了db_server角色,以建立一個名為web_app的資料函式庫。django_app角色的建立:我們建立了一個新的 Ansible 角色django_app,用於安裝 Django、建立 Django 應用程式、組態資料函式庫連線和建立超級使用者。