返回文章列表

Ansible自動化佈署AWS雲端Splunk

本文介紹如何使用 Ansible 自動化佈署 Splunk 伺服器至 Amazon EC2 例項。文章涵蓋建立 SSH 金鑰對、設定安全群組、啟動 EC2 例項、等待 SSH 連線可用,以及使用 Ansible Playbook 佈署 Splunk。同時也提供了一些常用的 Ansible 模組和 AWS CLI

雲端運算 DevOps

Ansible 是一款功能強大的自動化工具,可以簡化在 AWS 等雲端平台上的佈署流程。本文將逐步示範如何使用 Ansible 在 AWS 上自動化佈署 Splunk 伺服器。首先,我們會利用 Ansible 的 ec2_key 模組建立 SSH 金鑰對,確保與 EC2 例項的安全連線。接著,使用 ec2_group 模組設定安全群組,限制例項的網路存取。然後,利用 ec2 模組啟動 EC2 例項,並指定所需的例項型別、映像檔和區域等引數。完成例項啟動後,我們會使用 wait_for 模組確認 SSH 連線可用,最後再透過 Ansible Playbook 和 splunk_server 角色完成 Splunk 伺服器的佈署。過程中也會示範如何設定必要的變數,例如安全群組名稱、區域、例項型別、映像檔 ID 和金鑰對名稱等。

在Amazon雲端中使用Ansible

為何選擇Amazon Web Services(AWS)

AWS提供基礎設施和IT服務的方式類別似於公共事業公司提供電力和熱水。你無需支付額外的費用來購買和授權基礎設施,一旦你不再使用這些服務,就可以將其關閉並停止支付費用。

雖然市場上有許多主要的雲端服務供應商,包括Azure(微軟)、Google Cloud、IBM Cloud和Oracle,但截至目前為止,AWS仍然是該領域的主要玩家。如果你正在使用其他主要的雲端服務平台,很可能會有相應的Ansible模組來與之整合。

AWS的費用

AWS並非免費,但我們將盡力保持成本低廉。雖然我們將盡量使用免費層級的服務,但AWS採用的是按需付費的定價模式。這是其具有廣泛吸引力的部分原因,因為世界各地的公司都利用AWS來幫助降低其基礎設施的成本。

瞭解AWS的定價

如果你有興趣將AWS用於你的專案,請參考以下連結以瞭解更多關於其定價和服務費率的計算方式:https://aws.amazon.com/pricing/services/。

取得AWS的存取許可權

如果你已經熟悉AWS,可以跳過本文,因為我們將討論有關允許Ansible與應用程式介面並在需要時進行更改的AWS基礎知識。

設定AWS帳戶

如果你是AWS的新手,需要先設定你的AWS帳戶存取許可權。你需要建立一個使用者名稱和密碼。這很可能是用於根使用者,因此建立一個新的使用者是有意義的,該使用者可以在你的AWS帳戶中作為管理員工作,而無需擁有完整的根使用者許可權。

你可以透過以下連結建立新的AWS帳戶:https://portal.aws.amazon.com/billing/signup#/start。

建立新的AWS使用者

  1. 登入AWS網頁控制檯後,點選螢幕左上角的Services選單。當你可以輸入搜尋框時,輸入IAM,然後選擇IAM。這是AWS管理使用者和身份的地方,我們將在這裡建立一個新的使用者。或者,你也可以直接前往以下網址:https://console.aws.amazon.com/iam/home。

  2. 在IAM網頁控制檯的左側,點選Users選項,然後點選Add user按鈕。

  3. 新增使用者時,首先會看到一個類別似於圖5-1的畫面,可以在這裡輸入使用者的使用者名稱和其他詳細資訊。輸入一個對你來說熟悉的使用者名稱,並選擇AWS Management Console access核取方塊。如果你希望在此時為使用者設定密碼,可以這樣做,但你也可以讓AWS為你產生一個密碼。如果保持Require password reset核取方塊被選中,你需要在開始使用帳戶之前以新使用者的身份登入。完成選擇後,點選Next: Permissions按鈕。

     此圖示說明瞭新增使用者的流程
    
  4. 現在你將看到一個類別似於圖5-2的畫面,可以在這裡為新使用者新增許可權。目前,點選AdministratorAccess,然後點選Next: Tags按鈕繼續。

  5. 如果需要,可以為新使用者新增標籤,但也可以留空。然後檢閱新使用者的詳細資訊並建立使用者。

  6. 建立新使用者後,記下使用者名稱和密碼(如果需要),然後傳回IAM網頁控制檯中的Users畫面。

  7. 選擇剛剛建立的使用者,因為這將是用於Ansible與AWS介面的使用者。你應該會看到一個類別似於圖5-3的畫面,顯示我們建立的新使用者的詳細資訊。如你所見,這個帳戶附加了AdministratorAccess策略,以允許它執行我們在下一章中需要的任務。

@startuml skinparam backgroundColor #FEFEFE skinparam componentStyle rectangle

title Ansible自動化佈署AWS雲端Splunk

package “安全架構” { package “網路安全” { component [防火牆] as firewall component [WAF] as waf component [DDoS 防護] as ddos }

package "身份認證" {
    component [OAuth 2.0] as oauth
    component [JWT Token] as jwt
    component [MFA] as mfa
}

package "資料安全" {
    component [加密傳輸 TLS] as tls
    component [資料加密] as encrypt
    component [金鑰管理] as kms
}

package "監控審計" {
    component [日誌收集] as log
    component [威脅偵測] as threat
    component [合規審計] as audit
}

}

firewall –> waf : 過濾流量 waf –> oauth : 驗證身份 oauth –> jwt : 簽發憑證 jwt –> tls : 加密傳輸 tls –> encrypt : 資料保護 log –> threat : 異常分析 threat –> audit : 報告生成

@enduml

   此圖示說明瞭檢視使用者詳細資訊的流程

#### 程式碼組態與說明

以下是一個簡單的Ansible playbook範例,用於在AWS上建立一個EC2例項:
```yaml
---
- name: 建立EC2例項
  hosts: localhost
  gather_facts: no

  tasks:
  - name: 建立EC2例項
    ec2:
      key_name: my_key
      instance_type: t2.micro
      image: ami-xxxxxxxx
      wait: yes
      count: 1
    register: ec2

  - name: 輸出EC2例項資訊
    debug:
      msg: "{{ ec2.instances[0].public_ip }}"

內容解密:

  1. 建立EC2例項任務:此任務使用ec2模組在AWS上建立一個新的EC2例項。我們指定了金鑰名稱、例項型別、映像ID,並等待例項啟動。

  2. 輸出EC2例項資訊任務:此任務輸出剛剛建立的EC2例項的公有IP地址。我們使用register關鍵字將ec2模組的輸出註冊到變數ec2中,然後使用debug模組輸出該變數中的公有IP。

在Amazon雲端環境中使用Ansible進行作業

建立AWS帳戶及存取金鑰

若要在AWS上使用Ansible,首先需要建立AWS帳戶並建立存取金鑰。依照以下步驟建立新的AWS使用者並產生存取金鑰:

  1. 登入AWS管理主控台並進入IAM(Identity and Access Management)服務。
  2. 點選「使用者」並建立新的使用者,選擇「程式化存取」作為存取型別。
  3. 將新使用者新增至群組或直接附加必要的許可權原則。
  4. 完成使用者建立後,點選「安全憑證」分頁並點選「建立存取金鑰」按鈕。
  5. 系統將提示您下載包含存取金鑰ID和秘密存取金鑰的CSV檔案,或是直接複製這些金鑰。

重點提示

  • 存取金鑰是重要的安全憑證,請務必妥善保管,避免公開或分享給他人。
  • 一旦遺失存取金鑰,將無法再次檢視,因此請確保已安全儲存。

安裝AWS CLI並設定憑證

為了測試是否能成功連線至AWS,可以安裝AWS CLI工具。執行以下命令安裝AWS CLI:

pip3 install awscli

接著,建立一個目錄來存放AWS憑證:

mkdir -pv ~/.aws

然後,建立一個憑證檔案:

touch ~/.aws/credentials

在憑證檔案中加入您的存取金鑰:

[default]
aws_access_key_id = YOUR_ACCESS_KEY_ID
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
region = YOUR_PREFERRED_REGION

內容解密:

  • aws_access_key_idaws_secret_access_key 分別對應您的AWS存取金鑰ID和秘密存取金鑰,請替換YOUR_ACCESS_KEY_IDYOUR_SECRET_ACCESS_KEY為實際的值。
  • region 指定了預設的AWS區域,請根據您的需求替換YOUR_PREFERRED_REGION

執行以下命令測試憑證是否正確:

aws sts get-caller-identity

如果一切設定正確,您將看到類別似以下的輸出:

{
    "UserId": "YOUR_ACCESS_KEY_ID",
    "Account": "ACCOUNT_NUMBER",
    "Arn": "arn:aws:iam::ACCOUNT_NUMBER:user/newuser"
}

內容解密:

  • 該命令用於驗證目前使用者的身份,輸出結果反映了輸入的憑證資訊。

使用環境變數存取AWS

除了在憑證檔案中設定存取金鑰外,也可以使用環境變數來暫時存取AWS。執行以下命令:

export AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY_ID
export AWS_SECRET_ACCESS_KEY=YOUR_SECRET_ACCESS_KEY
export AWS_DEFAULT_REGION=YOUR_PREFERRED_REGION

這樣可以在不修改憑證檔案的情況下,使用指定的存取金鑰和區域。

內容解密:

  • 使用環境變數的好處是可以在不同的工作階段中使用不同的憑證,而不需要修改檔案。

使用Ansible佈署Splunk至AWS

本章節將介紹如何使用Ansible佈署Splunk至AWS上的EC2例項。首先,需要建立一個新的目錄來存放相關的設定檔和Playbook:

mkdir splunk_server; cd splunk_server

建立一個新的hosts檔案,並加入localhost的設定:

[local]
localhost

接著,建立一個Playbook來建立用於連線至EC2例項的金鑰對:

touch create_key_pair.yml

內容解密:

  • 這裡使用Ansible的EC2模組來建立金鑰對,以便能夠SSH連線至新建立的EC2例項。

在 Amazon Cloud 中使用 Ansible 進行自動化佈署

建立 SSH 金鑰對

要在 AWS 上建立 EC2 例項,首先需要建立 SSH 金鑰對。這可以透過 Ansible 的 ec2_key 模組來完成。下面是一個範例 playbook,用於建立一個新的 SSH 金鑰對:

---
- hosts: local
  connection: local
  gather_facts: no
  tasks:
    - name: 建立新的 EC2 金鑰
      ec2_key:
        name: ansible-answers-key
        region: ap-southeast-2
      register: ec2_key_result

    - name: 儲存私鑰
      copy:
        content: "{{ ec2_key_result.key.private_key }}"
        dest: "./splunkserver.pem"
        mode: 0600
      when: ec2_key_result.changed

內容解密:

  1. 建立新的 EC2 金鑰:使用 ec2_key 模組在指定的區域(ap-southeast-2)建立一個名為 ansible-answers-key 的新金鑰對。
  2. 儲存私鑰:將上一步驟中產生的私鑰內容儲存到本地檔案 splunkserver.pem 中,並且設定檔案許可權為 0600,確保私鑰的安全性。

執行此 playbook 後,您應該能在當前工作目錄下看到 splunkserver.pem 檔案,並且在 AWS 控制檯的 EC2 金鑰對列表中看到新建立的金鑰對。

建立 AWS EC2 例項

接下來,我們將建立一個 Ansible role,用於建立 EC2 例項。首先,建立一個名為 splunk_server 的 role,並在其中定義相應的任務。

建立 Role 結構

使用 ansible-galaxy init 命令建立 splunk_server role:

ansible-galaxy init splunk_server --role-path roles/

定義任務

roles/splunk_server/tasks/main.yml 中定義以下任務:

---
- name: 建立主機安全群組
  ec2_group:
    name: "{{ ec2_sg_name }}"
    description: 新主機的安全群組
    region: "{{ ec2_region }}"
    rules:
      - proto: tcp
        from_port: 22
        to_port: 22
        cidr_ip: 0.0.0.0/0
      - proto: tcp
        from_port: 8000
        to_port: 8000
        cidr_ip: 0.0.0.0/0
      - proto: tcp
        from_port: 443
        to_port: 443
        cidr_ip: 0.0.0.0/0
    rules_egress:
      - proto: all
        cidr_ip: 0.0.0.0/0
    register: basic_firewall

- name: 啟動新的 EC2 例項
  ec2:
    group: "{{ ec2_sg_name }}"
    instance_type: "{{ ec2_instance_type }}"
    image: "{{ ec2_image }}"
    wait: true
    region: "{{ ec2_region }}"
    keypair: "{{ ec2_keypair }}"
    count: 1
  register: ec2

- name: 等待 SSH 連線可用
  wait_for:
    host: '{{ item.public_ip }}'
    port: 22
    state: started
  with_items: '{{ ec2.instances }}'

內容解密:

  1. 建立主機安全群組:使用 ec2_group 模組建立一個新的安全群組,並定義入站和出站規則。

    • 入站規則允許來自任何 IP 的 TCP 連線,分別針對 SSH(22)、HTTP(8000)和 HTTPS(443)埠。
    • 出站規則允許所有協定連線到任何 IP。
  2. 啟動新的 EC2 例項:使用 ec2 模組啟動一個新的 EC2 例項,並指定安全群組、例項型別、映像檔、區域、金鑰對等引數。

  3. 等待 SSH 連線可用:使用 wait_for 模組等待新建立的 EC2 例項的 SSH 埠(22)變為可用狀態。

使用 Ansible 在 Amazon Cloud 中佈署 Splunk 伺服器

佈署前的準備工作

在開始佈署之前,我們需要設定一些必要的變數。這些變數將在後續的任務中使用。開啟 roles/splunk_server/vars/main.yml 檔案,並新增以下內容:

---
ec2_sg_name: "AnsibleSecurityGroup"
ec2_region: "ap-southeast-2"
ec2_instance_type: "t2.micro"
ec2_image: "ami-0099823645f06b6a1"
ec2_keypair: "ansible-answers-key"

內容解密:

  1. ec2_sg_name:定義了安全組的名稱,用於控制對 EC2 例項的存取。
  2. ec2_region:指定了 EC2 例項將被佈署的區域。
  3. ec2_instance_type:定義了 EC2 例項的型別,例如 t2.micro,這是一種免費的例項型別。
  4. ec2_image:指定了將被用於啟動 EC2 例項的 Amazon Machine Image(AMI)ID。
  5. ec2_keypair:定義了用於連線到 EC2 例項的金鑰對名稱。

編寫 Ansible Playbook

接下來,我們需要建立一個 Ansible Playbook 來佈署我們的 Splunk 伺服器。建立一個名為 server_deploy.yml 的檔案,並新增以下內容:

---
- hosts: localhost
  connection: local
  gather_facts: false
  user: root
  roles:
    - splunk_server

內容解密:

  1. hosts: localhost:指定了 Playbook 將在本地主機上執行。
  2. connection: local:表示 Ansible 將在本地主機上執行任務,而不是透過 SSH 連線到遠端主機。
  3. gather_facts: false:停用了 Ansible 的事實收集功能,以加快 Playbook 的執行速度。
  4. user: root:指定了執行 Playbook 的使用者身份。
  5. roles: - splunk_server:指定了將被執行的角色名稱,即 splunk_server

執行 Ansible Playbook

最後,我們可以執行 Ansible Playbook 來佈署我們的 Splunk 伺服器。執行以下命令:

ansible-playbook -i hosts server_deploy.yml

內容解密:

  1. ansible-playbook:是 Ansible 的命令列工具,用於執行 Playbook。
  2. -i hosts:指定了 Ansible 的 inventory 檔案,即 hosts 檔案。
  3. server_deploy.yml:是我們建立的 Playbook 檔名稱。

執行完成後,您應該能夠在 AWS 控制檯中看到新建立的 EC2 例項,並可以使用 SSH 連線到該例項。

連線到 EC2 例項

使用以下命令連線到 EC2 例項:

ssh -i splunkserver.pem ec2-user@<public_ip_address>

內容解密:

  1. ssh:是 Secure Shell 的命令列工具,用於安全地連線到遠端主機。
  2. -i splunkserver.pem:指定了用於身份驗證的私鑰檔案。
  3. ec2-user@<public_ip_address>:指定了要連線的 EC2 例項的使用者名稱和公有 IP 地址。

終止 EC2 例項

當您完成測試後,可以使用以下命令終止 EC2 例項:

# 使用 ec2 Ansible 模組終止例項

內容解密:

  1. 需要使用 ec2 Ansible 模組來終止 EC2 例項。
  2. 需要提供例項 ID 作為引數。

透過以上步驟,您可以使用 Ansible 在 Amazon Cloud 中佈署 Splunk 伺服器。