返回文章列表

Ansible Playbook 佈署 MySQL 資料函式庫伺服器

本文介紹如何使用 Ansible Playbook 佈署 MySQL 資料函式庫伺服器,涵蓋安裝 MySQL、設定 root 密碼和許可權、建立測試資料函式庫和表格等步驟,並提供完整的程式碼範例和執行說明。文章也進一步探討如何使用 Ansible 管理更複雜的佈署環境,包含如何利用 include 和 import

Web 開發 系統管理

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設定

  1. 開啟000-default.conf檔案,並在<VirtualHost *:80>下方新增以下設定:
    <Directory /var/www/test>
        Options +ExecCGI
        DirectoryIndex index.py
    </Directory>
    AddHandler cgi-script .py
    
    同時,將DocumentRoot修改為/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

  1. 編輯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_preforkcgi模組,以支援CGI應用。
  • 第三個任務使用pip3安裝pymysql模組,以便Python指令碼能夠連線MySQL資料函式庫。
  • 第四個任務建立/var/www/test/目錄。
  • 第五個任務將index.py複製到目標目錄,並設定為可執行。

步驟4:建立index.py

  1. 建立一個名為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提供了includeimport兩個指令。這兩個指令允許我們將任務分離出來,並在多個Playbook中重複使用它們。

Include和Import的區別

  • import指令在Playbook解析時被預處理,而include指令在Playbook執行時被處理。
  • 在Ansible 2.4之前的版本中,只有include指令可用。

建立新的Playbook

為了示範如何使用import指令,我們將建立一個新的Playbook,名為new-playbook.yml,它將匯入我們之前建立的webserver-playbook.ymldbserver-playbook.yml

建立new-playbook.yml

  1. 登入到工作環境,並進入之前建立資料函式庫和Web伺服器的目錄。

  2. 使用以下命令建立新的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_tasksimport_tasks指令來參照這個任務:

handlers:
  - include_tasks: apache_handlers.yml
  # 或
  - import_tasks: apache_handlers.yml

內容解密:

  • 這段程式碼在處理程式(handlers)部分匯入了之前建立的apache_handlers.yml檔案。
  • 這樣,當組態發生變化時,Apache2服務將被重新啟動。

擴充套件Playbook:使用Roles與Templates

在前一章的結尾,我們簡要探討瞭如何組織Playbook,以便在保持一定控制的同時,讓它們能夠增長。我們討論瞭如何在Playbook中使用importinclude來重用之前建立的Playbook。

為何需要Roles

目前我們的環境只包含兩台伺服器,但我們需要一種標準化的方式來組織環境中的每個部分,以便能夠建立更小、更簡單的組態語法和專案。如果我們想要不僅重用程式碼和組態,還希望與他人分享我們的組態,並使用其他人編寫的組態,那麼Ansible的Roles就是解決方案。

Ansible Roles簡介

Ansible提供了兩種重用組態管理任務的方法:使用importinclude,以及使用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. 任務1:確保Apache已安裝並更新 - 使用apt模組確保Apache2已安裝並保持最新狀態。
  2. 任務2:寫入Apache組態檔案 - 使用copy模組將本地的000-default.conf檔案複製到遠端主機的/etc/apache2/sites-available/目錄下,並通知處理程式重啟Apache2。
  3. 任務3:啟動Apache並設定為開機啟動 - 使用service模組確保Apache2服務正在執行並設定為開機啟動。