伺服器自動化是一種安全且可靠的程序,能以有效且具科技感的方式管理和監控伺服器。與由專門專家團隊控制的資料中心管理伺服器的傳統方式不同,所有伺服器都使用自動化進行管理。因此,人為錯誤被降至最低。
組態管理工具如 Ansible, Puppet, Terraform等(僅舉幾例),通常用於自動化伺服器。這些工具透過為新伺服器建立標準程序來使用自動化設定伺服器,同時消除手動操作時可能發生的錯誤。
Ansible 是一個強大的開源專案。它具有彈性、易於使用,且擁有最簡化的架構。使用 Ansible playbook 不需要任何程式設計背景,而且不需要在節點上安裝軟體。最重要的是,它配備了出色的功能,可以編寫指令碼並簡化自動化流程。
在本指南中,我們將 引導您完成在 Ubuntu 20.04 上使用 Ansible 安裝和設定 LAMP 的步驟.
先決條件
若要跟隨本教學,您需要:
- 已安裝 Ubuntu 於您的系統中。
- 一部或多部 Ansible 主機:最初必須設定一部或多部執行最新版本 Ubuntu 的遠端 Ansible 主機。請按照教學課程 使用 Ansible 和 Ubuntu 20.04 自動化伺服器設定 進行設定。
- 一個 Ansible 控制節點:一部已安裝、設定 Ansible,並已連線至您的 Ansible 主機的 Ubuntu 機器(透過 SSH 金鑰:
-
- )。該控制節點必須具有一個 具備 sudo 權限的使用者 且防火牆處於 開啟.
- 如果您在設定 Ansible 時需要協助,請參閱關於 在 Ubuntu 20.04 上安裝和設定 Ansible.
Ansible Playbook 的用途是什麼?
此 Ansible playbook 是執行我們指南中所述步驟的另一種方式:LAMP 堆疊設定 – Linux Apache MySQL PHP.
執行 Ansible playbook 將在您的 Ansible 主機上執行以下操作:
-
安裝 aptitude,這是 Ansible 偏好的 apt 套件管理員替代方案。
-
安裝所有必要的 LAMP 套件。
-
建立一個新的 Apache VirtualHost 並設定專用的文件根目錄。
-
啟用(ON) 新的 VirtualHost.
-
停用(OFF) 預設的 Apache 網站,即將 disable_default 變數設定為 true.
-
為 MySQL root 使用者選擇密碼。
-
移除匿名 MySQL 帳戶和測試資料庫。
-
設定 UFW 以允許所設定連接埠上的 HTTP 流量,預設為 80.
-
設定 PHP 測試指令碼。
在 Ansible playbook 執行完成後,您將會看到一個根據我們所做設定在 Apache 上執行的網頁 PHP 環境。
使用 Ansible Playbook
首先,從 do-community/ansible-playbooks 儲存庫取得 LAMP playbook 及其相依性。接下來,將含有 LAMP playbook 的儲存庫複製到 Ansible 控制節點內部的本機資料夾中。
執行 git pull 指令,以確保您能存取我們在本教學中將要使用的正確內容:
|
1 2 |
cd ~/ansible-playbooks git pull |
如果您是第一次使用 do-community/ansible-playbooks 儲存庫,請考慮將該儲存庫複製到您的家目錄:
|
1 2 3 |
cd ~ git clone https://github.com/do-community/ansible-playbooks.git cd ansible-playbooks |
前往 lamp_ubuntu2004 資料夾,您將會看到以下結構:
|
1 2 3 4 5 6 7 8 |
lamp_ubuntu2004 ├── files │ ├── apache.conf.j2 │ └── info.php.j2 ├── vars │ └── default.yml ├── playbook.yml └── readme.md |
以下是這些檔案代表意義的概覽:
-
files/info.php.j2:這是一個範本檔案,您可以在其中於網頁伺服器的根目錄設定 PHP 測試頁面。
-
files/apache.conf.j2:另一個用於設定 Apache VirtualHost 的範本檔案。
-
vars/default.yml:這是一個用來自訂 playbook 設定的變數檔案。
-
playbook.yml:此檔案包含要在遠端伺服器上執行的所有任務內容。
-
readme.md:包含此 playbook 資訊的讀取檔案。
讓我們透過修改 playbook 的變數檔案來自訂 MySQL 和 Apache 設定。導覽至 lamp_ubuntu2004 目錄並開啟 vars/default.yml 檔案,使用 nano 編輯器:
|
1 2 |
cd lamp_ubuntu2004 nano vars/default.yml |
開啟 vars/default.yml 檔案後,將會看到需要修改的變數列表:
|
1 2 3 4 5 6 7 |
--- mysql_root_password: "mysql_root_password" app_user: "justin" http_host: "your_domain" http_conf: "your_domain.conf" http_port: "80" disable_default: true |
讓我們詳細了解每個變數:
-
mysql_root_password:儲存 root MySQL 帳戶的密碼。
-
app_user:這是 Ansible 主機上的遠端非 root 使用者,作為應用程式檔案的擁有者。
-
http_host:顯示您的網域名稱。
-
http_conf:顯示在 Apache 中建立的設定檔名稱。
-
http_port:這是此虛擬主機的 HTTP 連接埠,而 80 是預設值。
-
disable_default:用於取消 Apache 隨附的預設選項。
然後,儲存並關閉 vars/default.yml 檔案。
完成所有設定後,我們就可以在伺服器上執行此 playbook 了。預設情況下,playbook 中的大多數伺服器都設定為在清單中的每台伺服器上執行。讓我們使用 -l 旗標,以僅影響受 playbook 影響的單一伺服器或選定的群組子集。或者,我們可以使用 -u 旗標,以詳細檢視正在連接哪台遠端伺服器並在遠端主機上執行。
讓我們在一部伺服器 server1 上執行,並以使用者 justin:
|
1 |
ansible-playbook playbook.yml -l server1 -u justin |
您將獲得類似以下的輸出:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
PLAY [all] ********************************************************************************************************* TASK [Gathering Facts] *********************************************************************************************************ok: [server1] TASK [Install prerequisites] *********************************************************************************************************ok: [server1] => (item=aptitude) ... TASK [UFW - Allow HTTP on port 80] ********************************************************************************************************* changed: [server1] TASK [Sets Up PHP Info Page] ********************************************************************************************************* changed: [server1] RUNNING HANDLER [Reload Apache] ********************************************************************************************************* changed: [server1] RUNNING HANDLER [Restart Apache] ********************************************************************************************************* changed: [server1] PLAY RECAP ********************************************************************************************************* server1 : ok=15 changed=11 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
當您看到 playbook 執行完成後,請導覽至您的網頁瀏覽器並存取伺服器的主機。別忘了在 IP 的末尾加上 /info.php:
|
1 |
http://server_host_or_IP/info.php |
點擊此 URL 後,您將看到如下頁面:
|
警告: 顯示的頁面包含關於您 PHP 環境的敏感資訊。因此,建議使用以下命令從伺服器中移除您的個人資訊: rm -f /var/www/info.php |
Playbook 中有什麼?
接下來,讓我們了解在 中所使用檔案的意義與重要性ansible-playbook 內容:
-
vars/default.yml
該 default.yml 變數檔案包含 MySQL root 帳號的網域名稱和密碼。這些是 中使用的預設值ansible-playbook 任務:
|
1 2 3 4 5 6 7 |
--- mysql_root_password: "mysql_root_password" app_user: "justin" http_host: "your_domain" http_conf: "your_domain.conf" http_port: "80" disable_default: true |
- files/apache.conf.j2
該 apache.conf.j2 檔案是一個 Jinja 2 範本檔案,用於設定新的 Apache VirtualHost。此範本中使用的變數必須在 中定義vars/default.yml 變數檔案:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<VirtualHost *:{{ http_port }}> ServerAdmin webmaster@localhost ServerName {{ http_host }} ServerAlias www.{{ http_host }} DocumentRoot /var/www/{{ http_host }} ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Directory /var/www/{{ http_host }}> Options -Indexes </Directory> <IfModule mod_dir.c> DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm </IfModule> </VirtualHost> |
- files/info.php.j2
類似於 files/apache.conf.j2, info.php.j2 檔案也是一個 Jinja 範本。我們使用此檔案在全新設定的 LAMP 伺服器的文件根目錄中建立一個測試 PHP 指令碼:
|
1 2 |
<?php phpinfo(); |
-
playbook.yml
該 playbook.yml 檔案是定義此設定中所有任務的地方。在此檔案中,設定了所有的 LAMP 堆疊。它首先定義目標伺服器群組,並將其設定為 all。此外,它將 become 值設為 true ( become: true),並定義所有需要執行的任務。接下來, yaml 檔案包含預設檔案,即 vars/default.yml 變數檔案,以載入設定選項:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
--- - hosts: all become: true vars_files: - vars/default.yml tasks: - name: 安裝 必要條件 apt: name={{ item }} update_cache=yes state=latest force_apt_get=yes loop: [ 'aptitude' ] #Apache 設定 - name: 安裝 LAMP 套件 apt: name={{ item }} update_cache=yes state=latest loop: [ 'apache2', 'mysql-server', 'python3-pymysql', 'php', 'php-mysql', 'libapache2-mod-php' ] - name: 建立 網頁 根目錄 file: path: "/var/www/{{ http_host }}" state: directory owner: "{{ app_user }}" mode: '0755' - name: 設定 up Apache 虛擬主機 template: src: "files/apache.conf.j2" dest: "/etc/apache2/sites-available/{{ http_conf }}" notify: 重新載入 Apache - name: 啟用 新 網站 shell: /usr/sbin/a2ensite {{ http_conf }} notify: 重新載入 Apache - name: 停用 預設 Apache 網站 shell: /usr/sbin/a2dissite 000-default.conf when: disable_default notify: 重新載入 Apache # MySQL 設定 - name: 設定 the root 密碼 mysql_user: name: root password: "{{ mysql_root_password }}" login_unix_socket: /var/run/mysqld/mysqld.sock - name: 移除 所有 匿名 使用者 帳號 mysql_user: name: '' host_all: yes state: absent login_user: root login_password: "{{ mysql_root_password }}" - name: 移除 the MySQL 測試 資料庫 mysql_db: name: test state: absent login_user: root login_password: "{{ mysql_root_password }}" # UFW 設定 - name: "UFW - 允許連接埠 {{ http_port }} 上的 HTTP" ufw: rule: allow port: "{{ http_port }}" proto: tcp # PHP 資訊頁面 - name: 設定 Up PHP 資訊 頁面 template: src: "files/info.php.j2" dest: "/var/www/{{ http_host }}/info.php" handlers: - name: 重新載入 Apache service: name: apache2 state: reloaded - name: 重啟 Apache service: name: apache2 state: restarted |
您可以根據專案的需求和要求修改這些檔案。
結論
在本教學中,我們介紹了使用 Ansible 在遠端伺服器上安裝和設定 LAMP 的步驟。您還可以嘗試許多其他自訂選項。例如,使用 Ansible 官方文件 並使用 mysql_user 模組的案例是提升技能的絕佳方式。此外,請按照本指南中討論的步驟,使用其他組態管理工具和作業系統來練習自動化,以增加難度。
您是 LAMP 架構的新手並想深入探討此主題嗎?歡迎探索我們 部落格上的以下教學:
- 如何在 Ubuntu 20.04 上使用 LAMP 安裝 WordPress
- 如何在 Centos-7 上安裝 Linux, Apache, MySQL, PHP (LAMP) 堆疊
- 如何在 Ubuntu 20.04 上安裝 LEMP 堆疊 Linux Nginx MySQL PHP
祝您使用愉快!

留言
目前尚無留言。成為第一個留言的人吧。