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使用者
登入AWS網頁控制檯後,點選螢幕左上角的Services選單。當你可以輸入搜尋框時,輸入IAM,然後選擇IAM。這是AWS管理使用者和身份的地方,我們將在這裡建立一個新的使用者。或者,你也可以直接前往以下網址:https://console.aws.amazon.com/iam/home。
在IAM網頁控制檯的左側,點選Users選項,然後點選Add user按鈕。
新增使用者時,首先會看到一個類別似於圖5-1的畫面,可以在這裡輸入使用者的使用者名稱和其他詳細資訊。輸入一個對你來說熟悉的使用者名稱,並選擇AWS Management Console access核取方塊。如果你希望在此時為使用者設定密碼,可以這樣做,但你也可以讓AWS為你產生一個密碼。如果保持Require password reset核取方塊被選中,你需要在開始使用帳戶之前以新使用者的身份登入。完成選擇後,點選Next: Permissions按鈕。
此圖示說明瞭新增使用者的流程現在你將看到一個類別似於圖5-2的畫面,可以在這裡為新使用者新增許可權。目前,點選AdministratorAccess,然後點選Next: Tags按鈕繼續。
如果需要,可以為新使用者新增標籤,但也可以留空。然後檢閱新使用者的詳細資訊並建立使用者。
建立新使用者後,記下使用者名稱和密碼(如果需要),然後傳回IAM網頁控制檯中的Users畫面。
選擇剛剛建立的使用者,因為這將是用於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 }}"
內容解密:
建立EC2例項任務:此任務使用
ec2模組在AWS上建立一個新的EC2例項。我們指定了金鑰名稱、例項型別、映像ID,並等待例項啟動。輸出EC2例項資訊任務:此任務輸出剛剛建立的EC2例項的公有IP地址。我們使用
register關鍵字將ec2模組的輸出註冊到變數ec2中,然後使用debug模組輸出該變數中的公有IP。
在Amazon雲端環境中使用Ansible進行作業
建立AWS帳戶及存取金鑰
若要在AWS上使用Ansible,首先需要建立AWS帳戶並建立存取金鑰。依照以下步驟建立新的AWS使用者並產生存取金鑰:
- 登入AWS管理主控台並進入IAM(Identity and Access Management)服務。
- 點選「使用者」並建立新的使用者,選擇「程式化存取」作為存取型別。
- 將新使用者新增至群組或直接附加必要的許可權原則。
- 完成使用者建立後,點選「安全憑證」分頁並點選「建立存取金鑰」按鈕。
- 系統將提示您下載包含存取金鑰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_id和aws_secret_access_key分別對應您的AWS存取金鑰ID和秘密存取金鑰,請替換YOUR_ACCESS_KEY_ID和YOUR_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
內容解密:
- 建立新的 EC2 金鑰:使用
ec2_key模組在指定的區域(ap-southeast-2)建立一個名為ansible-answers-key的新金鑰對。 - 儲存私鑰:將上一步驟中產生的私鑰內容儲存到本地檔案
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 }}'
內容解密:
建立主機安全群組:使用
ec2_group模組建立一個新的安全群組,並定義入站和出站規則。- 入站規則允許來自任何 IP 的 TCP 連線,分別針對 SSH(22)、HTTP(8000)和 HTTPS(443)埠。
- 出站規則允許所有協定連線到任何 IP。
啟動新的 EC2 例項:使用
ec2模組啟動一個新的 EC2 例項,並指定安全群組、例項型別、映像檔、區域、金鑰對等引數。等待 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"
內容解密:
ec2_sg_name:定義了安全組的名稱,用於控制對 EC2 例項的存取。ec2_region:指定了 EC2 例項將被佈署的區域。ec2_instance_type:定義了 EC2 例項的型別,例如t2.micro,這是一種免費的例項型別。ec2_image:指定了將被用於啟動 EC2 例項的 Amazon Machine Image(AMI)ID。ec2_keypair:定義了用於連線到 EC2 例項的金鑰對名稱。
編寫 Ansible Playbook
接下來,我們需要建立一個 Ansible Playbook 來佈署我們的 Splunk 伺服器。建立一個名為 server_deploy.yml 的檔案,並新增以下內容:
---
- hosts: localhost
connection: local
gather_facts: false
user: root
roles:
- splunk_server
內容解密:
hosts: localhost:指定了 Playbook 將在本地主機上執行。connection: local:表示 Ansible 將在本地主機上執行任務,而不是透過 SSH 連線到遠端主機。gather_facts: false:停用了 Ansible 的事實收集功能,以加快 Playbook 的執行速度。user: root:指定了執行 Playbook 的使用者身份。roles: - splunk_server:指定了將被執行的角色名稱,即splunk_server。
執行 Ansible Playbook
最後,我們可以執行 Ansible Playbook 來佈署我們的 Splunk 伺服器。執行以下命令:
ansible-playbook -i hosts server_deploy.yml
內容解密:
ansible-playbook:是 Ansible 的命令列工具,用於執行 Playbook。-i hosts:指定了 Ansible 的 inventory 檔案,即hosts檔案。server_deploy.yml:是我們建立的 Playbook 檔名稱。
執行完成後,您應該能夠在 AWS 控制檯中看到新建立的 EC2 例項,並可以使用 SSH 連線到該例項。
連線到 EC2 例項
使用以下命令連線到 EC2 例項:
ssh -i splunkserver.pem ec2-user@<public_ip_address>
內容解密:
ssh:是 Secure Shell 的命令列工具,用於安全地連線到遠端主機。-i splunkserver.pem:指定了用於身份驗證的私鑰檔案。ec2-user@<public_ip_address>:指定了要連線的 EC2 例項的使用者名稱和公有 IP 地址。
終止 EC2 例項
當您完成測試後,可以使用以下命令終止 EC2 例項:
# 使用 ec2 Ansible 模組終止例項
內容解密:
- 需要使用
ec2Ansible 模組來終止 EC2 例項。 - 需要提供例項 ID 作為引數。
透過以上步驟,您可以使用 Ansible 在 Amazon Cloud 中佈署 Splunk 伺服器。