返回文章列表

Ansible自動化AWS虛擬機器佈署WordPress

本文介紹如何使用 Ansible 自動化在 AWS 上佈署 WordPress。從建立虛擬機器、組態安全群組、安裝必要套件到 WordPress 的設定,完整涵蓋自動化流程,讓您輕鬆快速地在雲端環境中架設 WordPress 網站。

DevOps 雲端運算

Ansible 提供了便捷的模組和功能,簡化了在 AWS 雲端環境中佈署和管理 WordPress 的流程。透過 Ansible 的自動化能力,可以有效減少手動操作,降低錯誤率,並提升佈署效率。此方法尤其適用於需要快速擴充套件或頻繁更新 WordPress 網站的場景,讓開發者更專注於應用程式本身的開發與維護,而非底層基礎設施的管理。結合 AWS 的彈性雲端資源和 Ansible 的自動化組態管理,能有效提升網站的可靠性和可維護性。

在AWS上進行協調

安全性組態與例項建立

要開始使用Ansible與AWS協同工作,首先需要進行一些基礎的安全性組態。這包括建立SSH金鑰對和設定安全組。

建立SSH金鑰對

在AWS控制檯中,導航至「EC2」服務,然後在左側邊欄選擇「金鑰對」。點選「建立金鑰對」,並為其命名,例如aws-ansible。建立後,私鑰檔案將自動下載到本地電腦的「下載」資料夾中。請妥善保管此私鑰檔案,因為您將需要它來登入即將建立的虛擬機器。

組態安全組

預設情況下,新建立的虛擬機器具有防火牆規則,阻止所有進出例項的通訊。為了執行Ansible並存取您的網站,需要允許透過兩個埠的流量:SSH(埠22)和HTTP(埠80)。在AWS控制檯中,點選左側邊欄中的「安全組」,然後建立一個新的安全組,命名為ssh-and-http,並給予簡短描述。新增兩條規則:一條允許來自您當前IP地址的SSH存取,另一條允許任何來源的HTTP存取。

前置條件

要使Ansible能夠與AWS API互動,需要安裝名為Boto的函式庫。使用Pip安裝Boto:

$ pip install boto

安裝完成後,即可開始編寫與AWS互動的playbook。

建立例項

ansible-aws資料夾中建立一個名為playbook.yml的檔案,內容如下:

---
- hosts: all
  connection: local
  gather_facts: False
  tasks:
  - ping:

這個playbook是一個協調型別的playbook,它在本地機器上執行,而不是登入到遠端機器。使用以下命令執行playbook:

$ ansible-playbook -i 'localhost,' playbook.yml

連線到AWS

為了連線到AWS,需要提供存取令牌給Boto。可以透過兩種方式實作:建立一個包含相關詳細資訊的~/.aws/credentials檔案,或者在每次呼叫EC2模組時傳遞存取金鑰、秘密金鑰和區域。

對於本文,採用AWS組態檔案的方法。建立一個名為~/.aws/credentials的檔案,內容如下:

[default]
aws_access_key_id = <your_access_key_here>
aws_secret_access_key = <your_secret_key_here>
region = us-west-2

使用EC2模組建立例項

更新playbook.yml以使用EC2模組建立虛擬機器:

---
- name: Create AWS resources
  hosts: all
  connection: local
  gather_facts: False
  tasks:
  - ec2:
      image: ami-b9ff39d9
      region: us-west-2
      instance_type: t2.micro
      instance_tags:
        Name: Demo

再次執行playbook:

$ ansible-playbook -i 'localhost,' playbook.yml

驗證結果

playbook執行完成後,登入AWS控制檯,導航至EC2服務,您應該會看到一個名為“Demo”的例項正在執行。選中該例項,然後點選「操作」>「例項狀態」>「終止」,以停止例項,避免產生額外費用。

重點解析

  1. 安全性組態:建立SSH金鑰對和組態安全組是使用Ansible與AWS協同工作的基礎。
  2. 前置條件:安裝Boto函式庫是使Ansible能夠與AWS API互動的必要步驟。
  3. 協調型playbook:與組態型playbook不同,協調型playbook在本地機器上執行,使用公共API完成任務。
  4. EC2模組:使用EC2模組建立虛擬機器,需要指定區域、映像ID和例項型別等引數。

程式碼解析

以下程式碼展示瞭如何使用Ansible的EC2模組建立一個虛擬機器:

- ec2:
    image: ami-b9ff39d9
    region: us-west-2
    instance_type: t2.micro
    instance_tags:
      Name: Demo

內容解密:

  • ec2:Ansible模組,用於與AWS EC2服務互動。
  • image:指定要使用的映像ID,例如Ubuntu 16.04。
  • region:指定要在哪個區域建立例項。
  • instance_type:指定例項型別,例如t2.micro
  • instance_tags:為例項新增標籤,例如名稱“Demo”。

透過這種方式,可以自動化地在AWS上建立和管理虛擬機器,實作基礎設施即程式碼(Infrastructure as Code)的理念。

在AWS上進行例項管理與WordPress佈署

刪除例項

在前面的章節中,我們使用AWS控制檯刪除了建立的例項。然而,我們希望能夠自動化這個過程,而不必每次都手動登入並執行刪除操作。Ansible提供了一種方式來刪除例項。

使用state=absent引數刪除例項

首先,我們可以使用EC2模組中的state=absent引數來刪除例項。以下是一個範例Playbook:

---
- name: 刪除AWS資源
  hosts: all
  connection: local
  gather_facts: False
  tasks:
    - ec2:
        region: us-west-2
        instance_ids: ['i-0736f00b2cfad8957']
        state: absent

使用ec2_remote_facts模組取得例項資訊

然而,使用state=absent方法需要知道要刪除的例項ID。我們可以使用ec2_remote_facts模組來取得正在執行的例項資訊。

---
- name: 檢視AWS機器
  hosts: all
  connection: local
  gather_facts: False
  tasks:
    - ec2_remote_facts:
        region: us-west-2
        filters:
          "instance-state-name": running
      register: instance_list
    - debug: var=instance_list

使用Jinja2的map過濾器轉換資料

一旦我們獲得了所需的資料,我們需要使用Jinja2的map過濾器將資料轉換為所需的格式。我們可以使用set_fact模組將例項ID列表儲存為一個變數。

---
- name: 刪除AWS資源
  hosts: all
  connection: local
  gather_facts: False
  tasks:
    - ec2_remote_facts:
        region: us-west-2
        filters:
          "instance-state-name": running
      register: instance_list
    - set_fact:
        instance_ids: "{{ instance_list.instances | map(attribute='id') | list }}"
    - ec2:
        region: us-west-2
        instance_ids: "{{ instance_ids }}"
        state: absent

管理例項基數

另一種控制例項數量的方法是使用exact_count引數。這允許我們指定應該執行的例項的確切數量。

使用exact_count建立例項

以下是一個範例Playbook,用於建立兩個標記為AnsibleScaling專案的例項:

---
- name: 建立AWS資源
  hosts: all
  connection: local
  gather_facts: False
  tasks:
    - ec2:
        image: ami-9abea4fb
        region: us-west-2
        instance_type: t2.micro
        instance_tags:
          project: AnsibleScaling
        count_tag:
          project: AnsibleScaling
        exact_count: 2

使用exact_count刪除例項

要刪除例項,我們可以將exact_count設定為0。

---
- name: 建立AWS資源
  hosts: all
  connection: local
  gather_facts: False
  tasks:
    - ec2:
        image: ami-9abea4fb
        region: us-west-2
        instance_type: t2.micro
        instance_tags:
          project: AnsibleScaling
        count_tag:
          project: AnsibleScaling
        exact_count: 0

組態新例項

建立例項後,我們可以使用Ansible在新例項上安裝WordPress。

複製角色資料夾

首先,我們需要複製之前建立的角色資料夾到新的工作目錄。

mkdir aws-wordpress
cd aws-wordpress
touch manage-instances.yml
touch install-wordpress.yml
cp -r ~/ansible-wordpress/provisioning/roles ./

在新例項上安裝WordPress

接下來,我們可以使用ansible-playbook命令在新例項上執行Playbook,以安裝WordPress。

ansible-playbook -i 'localhost,' install-wordpress.yml

此時,我們已經成功地在AWS上建立了例項,並使用Ansible在新例項上安裝了WordPress。

在AWS上佈署WordPress的完整

建立AWS虛擬機器

首先,您需要在AWS上建立虛擬機器。開啟manage-instances.yml檔案並新增以下內容:

---
- name: 管理AWS資源
  hosts: all
  connection: local
  gather_facts: False
  tasks:
    - ec2:
        image: ami-9abea4fb
        region: us-west-2
        instance_type: t2.micro
        instance_tags:
          project: AnsibleWordPress
        count_tag:
          project: AnsibleWordPress
        exact_count: 1
        group: ssh-and-http
        key_name: aws-ansible

內容解密:

  • ec2模組用於建立AWS EC2例項。
  • image引數指定了要使用的AMI映像ID。
  • region引數指定了例項將被建立的區域。
  • instance_type引數定義了例項的型別。
  • instance_tagscount_tag用於標記和計數具有特定標籤的例項。
  • exact_count確保只建立一個具有指定標籤的例項。
  • group引數指定了例項所屬的安全組。
  • key_name引數指定了允許存取例項的SSH金鑰對。

執行此playbook以建立例項,然後檢查AWS控制檯以確認例項已建立並正在執行:

$ ansible-playbook -i 'localhost,' manage-instances.yml

連線到AWS例項

在執行WordPress playbook之前,您需要能夠連線到新建立的例項。這涉及建立一個包含例項主機名的inventory檔案。

登入AWS控制檯,選擇正在執行的例項,並複製其公共DNS名稱。建立一個名為inventory的檔案,並將此主機名放在第一行。

編寫簡單的Ansible Playbook

更新install-wordpress.yml以包含以下內容:

---
- name: 安裝WordPress
  hosts: all
  tasks:
    - ping:

如果直接執行此playbook,將會遇到連線錯誤,因為Ansible不知道使用哪個使用者登入或哪個SSH金鑰對。

更新inventory檔案以設定ansible_useransible_ssh_private_key_file

ec2-52-38-106-235.us-west-2.compute.amazonaws.com ansible_user=ubuntu ansible_ssh_private_key_file=~/Downloads/aws-ansible.pem

再次執行playbook:

$ ansible-playbook -i inventory install-wordpress.yml

組態WordPress安裝

現在您可以更新install-wordpress.yml以包含必要的組態:

---
- name: 安裝WordPress
  hosts: all
  become: true
  tasks:
    - ping:
  roles:
    - role: mheap.wordpress
      database_name: michaelwp
      database_user: michaelwp
      database_password: bananas18374
      wp_domain: aws.example.com
      initial_post_title: Hey There
      initial_post_content: >
        This is running on AWS

執行playbook:

$ ansible-playbook -i inventory install-wordpress.yml

驗證安裝

一旦playbook執行完成,您可以透過SSH登入機器並驗證一切是否按預期組態:

$ ssh -i ~/Downloads/aws-ansible.pem [email protected]

檢查nginx是否已安裝、PHP版本是否正確,以及WordPress是否位於正確的位置。

使用動態庫存管理AWS資源

在前面的章節中,我們已經瞭解瞭如何使用Ansible來佈建新的AWS例項。然而,當例項數量增加時,手動管理這些例項的清單變得越來越困難。幸運的是,Ansible支援動態庫存的概念。

什麼是動態庫存?

動態庫存是一種特殊的清單格式,它以JSON格式儲存例項資訊,而不是傳統的INI格式。當你將一個可執行的檔案作為清單檔案傳遞給ansible-playbook時,Ansible會嘗試執行它,並將其輸出的文字作為清單檔案。

使用AWS動態庫存指令碼

在這一節中,我們將使用AWS動態庫存指令碼(名為ec2.py)來存取我們的例項。首先,下載ec2.pyec2.ini檔案,並將它們儲存在你的aws-wordpress資料夾中。

下載ec2.py和ec2.ini

你可以從以下網址下載ec2.pyec2.ini

組態ec2.ini

由於我們使用的IAM使用者沒有存取所有AWS服務的許可權,因此需要編輯ec2.ini來組態指令碼只存取有許可權的服務(EC2和VPC)。開啟ec2.ini並搜尋rds = False(大約在第63行),取消註解該行。然後,向下幾行,找到elasticache = False並同樣取消註解。


#### ec2.ini 節選
rds = False
elasticache = False

執行ec2.py

執行python ec2.py來檢視從AWS API傳回的資訊。輸出的第一部分是hostvars,其中包含了每個執行中的主機的資訊。在你的情況下,只有一台例項,因此只有一個條目。

使用動態庫存執行Ansible Playbook

要使用動態庫存執行Ansible playbook,需要更新install-wordpress.yml,使其目標為tag_project_AnsibleWordPress而不是所有主機。然後,使用ec2.py作為清單檔案執行Ansible。

$ ansible-playbook -i ec2.py install-wordpress.yml

如果遇到錯誤,提示ec2.py應該是一個可執行的清單指令碼,你需要使ec2.py變為可執行。執行chmod +x ec2.py,然後再次執行ansible-playbook

指定連線詳細資訊

由於使用動態庫存,你需要在執行時指定連線詳細資訊,如使用者名稱和私鑰檔案。

$ ansible-playbook -i ec2.py -u ubuntu --key-file ~/Downloads/aws-ansible.pem install-wordpress.yml

這樣,Ansible就能正確地連線到你的AWS例項並執行playbook。