Ansible 自動化佈署工具簡化了伺服器管理流程,本文將詳細說明如何使用 Ansible Playbook 佈署 MySQL 資料函式庫伺服器。從安裝 MySQL 套件、設定 root 密碼和許可權,到建立測試資料函式庫和表格,每個步驟都有對應的程式碼和說明。此外,文章也涵蓋了 Ansible 的進階用法,例如使用 include 和 import 組織 Playbook,以及使用 Roles 和 Templates 建立可重複使用的組態模組,以應對更複雜的佈署環境。這些技巧能幫助工程師更有效率地管理和維護伺服器基礎設施。
使用Ansible Playbook佈署MySQL資料函式庫伺服器
在前面的章節中,我們已經成功地使用Ansible Playbook安裝和組態了Apache2網路伺服器。現在,我們將繼續佈署LAMP堆積疊的最後一部分:MySQL資料函式庫伺服器。
建立MySQL資料函式庫伺服器Playbook
首先,我們需要建立一個新的Playbook檔案,名為dbserver-playbook.yml。這個檔案將包含安裝和組態MySQL資料函式庫伺服器的所有任務。
變數定義
在Playbook的開始部分,我們定義了一個變數mysql_root_password,用於儲存MySQL的root密碼。
vars:
mysql_root_password: password
注意: 在實際生產環境中,應使用更安全的方式儲存密碼,例如使用Ansible Vault。
安裝MySQL和相關套件
接下來,我們定義了第一個任務,用於安裝MySQL和相關的Python套件。
- name: install mysql and python-mysqldb
apt:
name: "{{ item }}"
update_cache: yes
cache_valid_time: 3600
state: present
with_items:
- python3-mysqldb
- mysql-server
啟動MySQL服務
安裝完成後,我們需要啟動MySQL服務並確保它在系統啟動時自動執行。
- 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
組態MySQL root密碼和許可權
接下來,我們使用mysql_user模組更新MySQL的root密碼和許可權。
- name: update mysql root password for all root accounts
mysql_user:
name: root
host: "{{ item }}"
password: "{{ mysql_root_password }}"
login_user: root
login_password: "{{ mysql_root_password }}"
check_implicit_admin: yes
priv: "*.*:ALL,GRANT"
with_items:
- "{{ ansible_hostname }}"
- 127.0.0.1
- ::1
- localhost
建立測試資料函式庫和表格
最後,我們建立了一個名為testdb的測試資料函式庫,並在其中建立了一個名為test的表格。
- name: create a new database
mysql_db:
name: testdb
state: present
login_user: root
login_password: "{{ mysql_root_password }}"
- name: add sample data to database
copy:
src: dump.sql
dest: /tmp/dump.sql
- name: insert sample data into database
mysql_db:
name: testdb
state: import
target: /tmp/dump.sql
login_user: root
login_password: "{{ mysql_root_password }}"
SQL指令碼
在執行Playbook之前,我們需要建立一個名為dump.sql的SQL指令碼檔案,用於建立test表格和插入測試資料。
CREATE TABLE IF NOT EXISTS test (
message varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO test(message) VALUES('Ansible To Do List');
INSERT INTO test(message) VALUES('Get ready');
INSERT INTO test(message) VALUES('Ansible is fun');
執行Playbook
完成所有設定後,我們可以使用以下命令執行Playbook:
ansible-playbook -i hosts dbserver-playbook.yml
執行完成後,我們可以使用MySQL客戶端連線到資料函式庫伺服器,驗證資料函式庫和表格是否正確建立。
使用Ansible佈署Web伺服器與資料函式庫連線的完整
在本章中,我們將學習如何使用Ansible Playbook佈署一個能夠與資料函式庫互動的Web伺服器。我們將逐步完成設定Apache2、安裝必要的Python模組、以及建立一個簡單的Python指令碼以從資料函式庫提取資料並顯示在網頁上。
步驟1:準備工作環境
首先,確保您位於test_playbooks目錄下,並且之前的練習中建立的資料函式庫正在運作且可被Web伺服器存取。
步驟2:修改Apache2設定
- 開啟
000-default.conf檔案,並在<VirtualHost *:80>下方新增以下設定:同時,將<Directory /var/www/test> Options +ExecCGI DirectoryIndex index.py </Directory> AddHandler cgi-script .pyDocumentRoot修改為/var/www/test。
內容解密:
<Directory /var/www/test>:指定/var/www/test目錄的設定。Options +ExecCGI:允許該目錄執行CGI指令碼。DirectoryIndex index.py:指定當存取目錄時,預設執行的檔案為index.py。AddHandler cgi-script .py:將.py檔案與CGI處理程式關聯起來。- 修改
DocumentRoot為/var/www/test,以使Apache2將該目錄作為網站根目錄。
步驟3:更新Web伺服器Playbook
- 編輯
webservice-playbook.yml,新增以下任務:- name: disable mpm_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
內容解密:
- 第一個任務停用
mpm_event模組,因為它與CGI不相容。 - 第二個任務啟用
mpm_prefork和cgi模組,以支援CGI應用。 - 第三個任務使用
pip3安裝pymysql模組,以便Python指令碼能夠連線MySQL資料函式庫。 - 第四個任務建立
/var/www/test/目錄。 - 第五個任務將
index.py複製到目標目錄,並設定為可執行。
步驟4:建立index.py
- 建立一個名為
index.py的檔案,並新增以下內容:#!/usr/bin/python3 import pymysql # Print necessary headers. print("Content-Type: text/html") print() # Connect to the database. conn = pymysql.connect( db='testdb', user='root', passwd='password', host='localhost') c = conn.cursor() # Print the contents of the table. c.execute("SELECT * FROM test;") for i in c: print(i)
內容解密:
- 該指令碼首先輸出必要的HTTP頭資訊。
- 然後,它連線到本地的MySQL資料函式庫,選取
testdb資料函式庫,並執行查詢以從test表中檢索所有資料。 - 最後,它列印出查詢結果。
使用Ansible Playbook管理複雜佈署環境
在前面的章節中,我們已經瞭解瞭如何使用Ansible Playbook來佈署簡單的LAMP堆積疊。然而,當佈署環境變得越來越複雜時,我們需要考慮如何組織和管理Playbook,以確保它們保持可讀性和可維護性。
引入Include和Import
為了組織更大的Playbook,Ansible提供了include和import兩個指令。這兩個指令允許我們將任務分離出來,並在多個Playbook中重複使用它們。
Include和Import的區別
import指令在Playbook解析時被預處理,而include指令在Playbook執行時被處理。- 在Ansible 2.4之前的版本中,只有
include指令可用。
建立新的Playbook
為了示範如何使用import指令,我們將建立一個新的Playbook,名為new-playbook.yml,它將匯入我們之前建立的webserver-playbook.yml和dbserver-playbook.yml。
建立new-playbook.yml
登入到工作環境,並進入之前建立資料函式庫和Web伺服器的目錄。
使用以下命令建立新的Playbook:
touch new-playbook.yml
3. 使用文字編輯器開啟新的Playbook,並新增以下程式碼:
```yml
---
- import_playbook: webserver-playbook.yml
- import_playbook: dbserver-playbook.yml
#### 內容解密:
* 這段程式碼使用`import_playbook`指令匯入了兩個之前建立的Playbook:`webserver-playbook.yml`和`dbserver-playbook.yml`。
* 這樣,我們就可以在新的Playbook中重複使用之前建立的Playbook,而無需重複編寫相同的程式碼。
執行新的Playbook
儲存檔案後,可以使用以下命令執行新的Playbook:
ansible-playbook -i hosts new-playbook.yml
內容解密:
- 這條命令使用
ansible-playbook指令執行新的Playbook,並指定了主機清單檔案hosts。 - 執行結果應該與之前單獨執行每個Playbook的結果相似。
重用任務
除了匯入整個Playbook之外,我們還可以建立一組通用任務,並在多個Playbook中重複使用它們。例如,我們可以建立一個名為apache_handlers.yml的檔案,其中包含重新啟動Apache2的任務:
---
- name: restart apache2
service: name=apache2 state=restarted
內容解密:
- 這段程式碼定義了一個名為
restart apache2的任務,使用service模組重新啟動Apache2服務。 - 這個任務可以被其他Playbook匯入並重複使用。
然後,在我們的Web伺服器Playbook中,我們可以使用include_tasks或import_tasks指令來參照這個任務:
handlers:
- include_tasks: apache_handlers.yml
# 或
- import_tasks: apache_handlers.yml
內容解密:
- 這段程式碼在處理程式(handlers)部分匯入了之前建立的
apache_handlers.yml檔案。 - 這樣,當組態發生變化時,Apache2服務將被重新啟動。
擴充套件Playbook:使用Roles與Templates
在前一章的結尾,我們簡要探討瞭如何組織Playbook,以便在保持一定控制的同時,讓它們能夠增長。我們討論瞭如何在Playbook中使用import和include來重用之前建立的Playbook。
為何需要Roles
目前我們的環境只包含兩台伺服器,但我們需要一種標準化的方式來組織環境中的每個部分,以便能夠建立更小、更簡單的組態語法和專案。如果我們想要不僅重用程式碼和組態,還希望與他人分享我們的組態,並使用其他人編寫的組態,那麼Ansible的Roles就是解決方案。
Ansible Roles簡介
Ansible提供了兩種重用組態管理任務的方法:使用import和include,以及使用Roles。Roles提供了更大的靈活性,不僅可以封裝任務,還可以設定特定的結構來包含變數、處理程式、模組和其他外掛。所有這些都可以上傳到Ansible Galaxy,這是一個分享、查詢和重用Ansible程式碼的中央倉函式庫。
建立Web伺服器Role
我們將從之前建立的Web伺服器Playbook開始,將其分解並轉換成一個Ansible Role。
步驟1:建立Roles目錄
首先,在工作目錄中建立一個名為roles的新目錄:
mkdir roles
步驟2:建立Web伺服器Role目錄
在roles目錄中,建立一個名為web_server的新目錄:
mkdir roles/web_server
步驟3:建立Role所需的子目錄
對於每個Role,需要建立一組標準的子目錄來存放資料。執行以下命令來建立所有必要的子目錄:
mkdir -p roles/web_server/{files,handlers,meta,templates,tasks,vars,defaults}
這些子目錄包括:
files:存放支援檔案,如組態檔案。handlers:存放處理程式。meta:存放用於建立Role依賴關係的檔案。templates:存放範本檔案。tasks:存放任務定義檔案。vars:存放變數定義檔案。defaults:存放預設變數定義檔案。
步驟4:轉換Playbook為Role
將原來的webserver-playbook.yml檔案複製到tasks目錄下,並命名為main.yml:
cp webserver-playbook.yml roles/web_server/tasks/main.yml
然後,編輯roles/web_server/tasks/main.yml檔案,移除與任務無關的部分,如主機資訊和通知程式部分。修改後的內容應如下所示:
---
- name: ensure apache is installed and up to date
apt: name=apache2 state=latest
- name: write the apache config file
copy: src=000-default.conf dest=/etc/apache2/sites-available/000-default.conf
notify:
- restart apache2
- name: apache is running and enable it at boot
service: name=apache2 state=started enabled=yes
內容解密:
- 任務1:確保Apache已安裝並更新 - 使用
apt模組確保Apache2已安裝並保持最新狀態。 - 任務2:寫入Apache組態檔案 - 使用
copy模組將本地的000-default.conf檔案複製到遠端主機的/etc/apache2/sites-available/目錄下,並通知處理程式重啟Apache2。 - 任務3:啟動Apache並設定為開機啟動 - 使用
service模組確保Apache2服務正在執行並設定為開機啟動。