Ansible 提供了便捷的工具和技術,可以簡化在 AWS 上佈署和管理 Splunk 伺服器的過程。透過 Ansible 的 ec2 模組,我們可以輕鬆地控制 EC2 例項的生命週期,包含建立、組態和終止。不可變基礎設施的實踐,確保每次佈署都從一個乾淨的基礎開始,避免了手動組態可能帶來的錯誤和不一致性。User Data 指令碼允許在例項啟動時自動執行安裝和組態任務,例如安裝 Splunk、設定密碼和啟動服務。更進一步地,Ansible 範本引擎 Jinja2 讓組態檔案的管理更加彈性,可以根據不同環境調整引數,避免重複勞動和人為錯誤。
使用Ansible在AWS雲端佈署Splunk伺服器
透過Ansible終止EC2例項
在前面的章節中,我們已經學會瞭如何使用Ansible建立和組態EC2例項。現在,我們將學習如何使用Ansible終止這些例項。終止例項的過程非常簡單,只需要使用ec2模組並指定state=absent即可。
終止EC2例項的Ansible命令
ansible localhost -m ec2 -a "instance_ids=i-05160b77e9b81a731 region=ap-southeast-2 state=absent"
命令輸出結果
localhost | SUCCESS => {
"changed": true,
"instance_ids": [
"i-05160b77e9b81a731"
],
...
"tagged_instances": []
}
執行上述命令後,您可以登入AWS控制檯確認伺服器是否已經終止或正在關閉。需要注意的是,一旦例項被終止,就無法再次存取。
為何使用不可變基礎設施
我們之所以在未安裝Splunk之前就終止例項,是因為我們採用了不可變基礎設施的做法。這種做法的好處是,我們可以完全自動化地組態和佈署伺服器,而無需對伺服器本身進行任何更改。
使用User Data佈署Splunk
現在,我們將學習如何使用Amazon的User Data功能,在EC2例項啟動時自動安裝Splunk。
建立User Data指令碼
首先,我們需要在roles/splunk_server/files目錄下建立一個名為user_data.sh的指令碼檔案。
touch roles/splunk_server/files/user_data.sh
編輯User Data指令碼
在user_data.sh檔案中,新增以下內容:
#!/bin/bash
set -e -x
wget -O splunk-8.0.5-a1a6394cc5ae-linux-2.6-x86_64.rpm 'https://www.splunk.com/bin/splunk/DownloadActivityServlet?architecture=x86_64&platform=linux&version=8.0.5&product=splunk&filename=splunk-8.0.5-a1a6394cc5ae-linux-2.6-x86_64.rpm&wget=true'
rpm -i splunk-8.0.5-a1a6394cc5ae-linux-2.6-x86_64.rpm
sleep 30
sudo -u splunk /opt/splunk/bin/splunk start --answer-yes --no-prompt --accept-license --seed-passwd newpassword
User Data指令碼解析
- 第1-2行:使指令碼可執行。
- 第3行:使用
wget下載Splunk安裝檔案。 - 第4行:使用
rpm安裝Splunk。 - 第5行:等待30秒,確保安裝完成。
- 第6行:啟動Splunk並設定管理員密碼。
在Ansible Playbook中參照User Data指令碼
編輯roles/splunk_server/tasks/main.yml檔案,在"launch the new ec2 instance"任務中新增以下內容:
- name: Launch the new EC2 instance
ec2:
...
count: 1
user_data: "{{ lookup('file', 'user_data.sh') }}"
register: ec2
執行Ansible Playbook
ansible-playbook -i hosts server_deploy.yml -v
執行成功後,您將獲得新建立的EC2例項的公網IP地址。
存取Splunk Web介面
使用瀏覽器存取http://<公網IP地址>:8000,並使用預設的使用者名稱admin和密碼newpassword登入。
登入成功畫面
成功登入後,您將看到Splunk的儀錶板畫面。
使用Ansible範本與CloudFormation指令碼最佳化AWS佈署
在前面的章節中,我們已經成功地使用Ansible自動化了AWS例項的佈署。然而,我們的工作還遠未結束。本章將繼續探討Ansible在AWS環境下的應用,特別是在範本使用、ansible-pull命令以及建立自定義伺服器映像等方面的擴充套件。
排除AWS佈署故障
在開始本章內容之前,我們先簡要討論如何排查AWS和Ansible佈署過程中可能出現的問題。儘管Ansible的輸出可能顯示成功,但實際佈署仍可能遇到錯誤或無法完成。這是因為Ansible僅報告其命令是否執行完畢,而不一定能檢測到新例項上的實際問題。以下是一些排查問題的方法:
- 透過AWS控制檯驗證例項是否已啟動並可用。有時,您可能嘗試存取仍在建立中的伺服器。
- 如果AWS控制檯顯示伺服器已啟動並執行,您可以進一步檢視例項的詳細資訊。選擇例項後,點選“Actions”選單,選擇“Instance Settings”,然後點選“Get System Log”,這將顯示系統日誌,而無需登入或SSH到伺服器。
- 如果您可以登入到新伺服器,請檢視
/var/log/cloud-init-output.log或/var/log/cloud-init.log中的錯誤日誌。這些日誌將顯示伺服器啟動過程中的系統日誌,包括正在執行的user_data.sh檔案的進度。 - 檢查應用程式日誌,例如Splunk的日誌位於
/opt/splunk/var/log/splunk/目錄下。該目錄中有多個日誌檔案,可能會指出應用程式的問題。
使用Ansible範本
本章的第一部分將介紹如何在Ansible角色中使用範本,以實作基礎設施管理的自動化。範本功能允許您根據不同的環境和需求,動態生成組態檔案,從而提高佈署的靈活性和可重用性。
介紹ansible-pull命令
接下來,我們將探討Ansible的一個較少被提及的功能——ansible-pull命令。該命令允許您從版本控制倉函式庫下載程式碼並直接在目標主機上執行Ansible playbook,從而簡化了佈署流程並提高了效率。
建立自定義伺服器映像
我們還將學習如何使用Ansible建立自定義的伺服器映像,這些映像可以佈署到不同的環境中,進一步縮短佈署時間。透過建立包含預組態應用和設定的映像,您可以確保在不同環境中的一致性和可靠性。
使用CloudFormation範本
最後,本章將指導您如何建立新的Ansible角色,以使用CloudFormation範本來整合您新建立的伺服器映像。CloudFormation是AWS提供的一種服務,用於以範本的形式定義和佈署基礎設施資源。透過結合Ansible和CloudFormation,您可以實作對AWS資源的自動化和可重複佈署。
注意AWS成本管理
在進行這些練習時,請記住定期清理不再使用的例項和服務,以避免產生不必要的費用。您可以透過AWS控制檯的計費服務來監控您的使用情況和預計成本。
透過本章的學習,您將能夠進一步擴充套件Ansible在AWS環境下的應用,提升自動化佈署的效率和靈活性,為您的基礎設施管理帶來更大的價值。
在AWS中使用Ansible範本佈署Splunk伺服器
在前面的章節中,我們已經介紹瞭如何使用Ansible佈署Splunk伺服器到AWS雲端。本章節將進一步探討如何使用Ansible範本來簡化組態管理,並提高佈署的靈活性。
為什麼使用Ansible範本?
在佈署過程中,我們經常需要根據不同的環境(如開發環境、生產環境)調整組態引數。手動修改組態檔案不僅耗時,而且容易出錯。Ansible範本提供了一種動態生成組態檔案的方法,可以根據變數自動填充組態引數,從而簡化了組態管理。
Ansible範本的工作原理
Ansible使用Jinja2範本引擎來處理範本檔案。範本檔案通常以.j2為副檔名,可以包含變數、條件陳述式、迴圈等結構。當Ansible執行playbook時,它會根據範本檔案和變數生成最終的組態檔案。
在Splunk伺服器佈署中使用Ansible範本
步驟1:修改main.yml檔案
首先,我們需要修改roles/splunk_server/tasks/main.yml檔案,將user_data指令碼的來源從files目錄改為templates目錄中的user_data.j2範本。
33 count: 1
34 user_data: "{{ lookup('template', 'user_data.j2') }}"
35 register: ec2
步驟2:建立templates目錄和user_data.j2範本
建立roles/splunk_server/templates目錄,並將原來的user_data.sh檔案複製到該目錄下,重新命名為user_data.j2。
mkdir roles/splunk_server/templates
cp roles/splunk_server/files/user_data.sh roles/splunk_server/templates/user_data.j2
步驟3:修改user_data.j2範本
開啟user_data.j2檔案,將密碼設定部分改為使用變數admin_password。
6 sudo -u splunk /opt/splunk/bin/splunk start --answer-yes --no-prompt --accept-license --seed-passwd {{ admin_password }}
並新增一個迴圈來建立多個使用者帳號。
8 {% for item in userlist %}
9 sudo -u splunk /opt/splunk/bin/splunk add user {{ item }} -role admin -auth admin:{{ admin_password }}
10 {% endfor %}
步驟4:定義變數
開啟roles/splunk_server/vars/main.yml檔案,定義admin_password和userlist變數。
7 admin_password: newpassword
8 userlist: ['user1 -password changeme1', 'user2 -password changeme2', 'user3 -password changeme3']
步驟5:加密變數檔案
使用ansible-vault命令加密包含敏感資訊的變數檔案。
ansible-vault encrypt roles/splunk_server/vars/main.yml
步驟6:執行playbook
執行playbook時,需要提供ansible-vault密碼。
ansible-playbook -i hosts server_deploy.yml --ask-vault-pass
#### 內容解密:
- 修改main.yml:此步驟將
user_data的來源改為使用 Jinja2 範本引擎處理的user_data.j2檔案,使得組態可以動態生成。 - 建立templates目錄和user_data.j2:將原有的
user_data.sh複製並重新命名為user_data.j2,使其成為一個 Jinja2 範本。 - 修改user_data.j2:將靜態密碼替換為變數
admin_password,並加入了一個迴圈來動態建立使用者帳號。 - 定義變數:在
vars/main.yml檔案中定義了admin_password和userlist,前者用於 Splunk 的管理員密碼,後者用於建立額外的使用者帳號。 - 加密變數檔案:使用
ansible-vault對包含敏感資訊的vars/main.yml進行加密,確保安全。 - 執行playbook:執行 playbook 時,透過
--ask-vault-pass引數提供ansible-vault密碼,以解密並使用加密的變數。
使用Ansible範本和CloudFormation指令碼佈署Splunk伺服器
在前面的章節中,我們已經成功地使用Ansible建立了一個Splunk伺服器的AWS例項。在本章中,我們將進一步探討如何使用Ansible範本和CloudFormation指令碼來佈署和組態Splunk伺服器。
使用Ansible範本組態多個使用者
我們首先使用Ansible範本來組態多個使用者。透過範本,我們可以在不手動輸入使用者詳細資訊的情況下,自動建立多個使用者。
- name: Create multiple users
user:
name: "{{ item.name }}"
password: "{{ item.password }}"
state: present
with_items:
- { name: 'user1', password: 'password1' }
- { name: 'user2', password: 'password2' }
- { name: 'user3', password: 'password3' }
- { name: 'admin', password: 'newpassword' }
內容解密:
這段程式碼定義了一個Ansible任務,用於建立多個使用者。with_items引數允許我們傳遞一個使用者列表,每個使用者都有一個名稱和密碼。user模組用於建立或管理使用者帳戶。
使用Ansible Pull佈署Splunk應用
除了使用Ansible推播組態之外,我們還可以使用ansible-pull命令從GitHub倉函式庫中提取程式碼並佈署到我們的伺服器上。
- 首先,我們需要在
user_data.j2範本中新增必要的命令來安裝Git、Pip3和Ansible。
sudo yum update -y
sudo yum install git python3-pip -y
sudo pip3 install ansible
內容解密:
這三行命令用於更新系統包管理器,安裝Git和Pip3,然後使用Pip3安裝Ansible。這是使用ansible-pull命令的前提條件。
- 接下來,我們可以使用
ansible-pull命令從指定的GitHub倉函式庫中提取程式碼並執行local.yml劇本。
sudo /usr/local/bin/ansible-pull -U https://github.com/vincesesto/testsplunkapp -i hosts
內容解密:
這行命令使用ansible-pull從指定的GitHub倉函式庫下載程式碼,如果程式碼已經存在,則會更新它。-i hosts引數指定了庫存檔案。
啟用Splunk自啟動並重啟服務
最後,我們需要在user_data.j2範本中新增命令以啟用Splunk自啟動並重啟Splunk服務。
sudo /opt/splunk/bin/splunk enable boot-start
sudo -u splunk /opt/splunk/bin/splunk restart
內容解密:
第一行命令啟用Splunk在系統啟動時自動啟動。第二行命令則是以Splunk使用者身份重啟Splunk服務,以使更改生效。
使用Ansible範本和CloudFormation指令碼自動化佈署Splunk服務
在前面的章節中,我們探討瞭如何使用Ansible和CloudFormation來自動化佈署基礎設施。本章節將探討如何使用Ansible範本和CloudFormation指令碼來佈署一個完整的Splunk服務,包括安裝Splunk、組態使用者和佈署自定義應用。
自動化佈署Splunk服務的步驟
首先,我們需要建立一個user_data.j2範本檔案,用於定義在EC2例項啟動時要執行的指令碼。這個指令碼將負責安裝Splunk、組態使用者、安裝Ansible以及使用ansible-pull佈署自定義的Splunk應用。
範本檔案內容
#!/bin/bash
set -e -x
wget -O splunk-8.0.5-a1a6394cc5ae-linux-2.6-x86_64.rpm 'https://www.splunk.com/bin/splunk/DownloadActivityServlet?architecture=x86_64&platform=linux&version=8.0.5&product=splunk&filename=splunk-8.0.5-a1a6394cc5ae-linux-2.6-x86_64.rpm&wget=true'
rpm -i splunk-8.0.5-a1a6394cc5ae-linux-2.6-x86_64.rpm
sleep 30
sudo -u splunk /opt/splunk/bin/splunk start --answer-yes --no-prompt --accept-license --seed-passwd {{ admin_password }}
{% for item in userlist %}
sudo -u splunk /opt/splunk/bin/splunk add user {{ item }} -role admin -auth admin:{{ admin_password }}
{% endfor %}
sudo yum update -y
sudo yum install git python3-pip -y
sudo pip3 install ansible
sudo /usr/local/bin/ansible-pull -U https://github.com/vincesesto/testsplunkapp -i hosts
sudo /opt/splunk/bin/splunk enable boot-start
sudo -u splunk /opt/splunk/bin/splunk restart
內容解密:
- 下載並安裝Splunk:使用
wget下載Splunk安裝包,然後使用rpm進行安裝。 - 啟動Splunk並設定管理員密碼:使用
sudo -u splunk以Splunk使用者身份啟動Splunk服務,並設定管理員密碼。 - 建立並組態使用者:使用Jinja2範本語法迴圈建立使用者列表中的使用者,並賦予他們管理員角色。
- 安裝Ansible:更新yum源,安裝git和python3-pip,然後使用pip3安裝Ansible。
- 使用
ansible-pull佈署自定義應用:從指定的GitHub倉函式庫提取程式碼,並使用ansible-pull執行佈署。 - 組態Splunk啟動:啟用Splunk的開機自啟動,並重啟Splunk服務。
執行Ansible Playbook
接下來,我們需要執行Ansible Playbook來建立我們的Splunk伺服器例項。執行以下命令:
ansible-playbook -i hosts server_deploy.yml --ask-vault-pass
內容解密:
ansible-playbook命令:用於執行Ansible Playbook的命令。-i hosts:指定主機清單檔案。server_deploy.yml:指定要執行的Playbook檔案。--ask-vault-pass:提示輸入Vault密碼,用於解密Playbook中加密的變數。
驗證佈署結果
佈署完成後,可以透過存取http://<your_external_ip_address>:8000來驗證Splunk服務是否正常執行,並且自定義應用是否已經被正確佈署。
Ansible Pull GitHub倉函式庫佈署解析
在我們的例子中,ansible-pull命令從GitHub倉函式庫https://github.com/vincesesto/testsplunkapp提取程式碼。倉函式庫中包含三個主要檔案:ansible_answers_app目錄、hosts檔案和local.yml Playbook。
local.yml Playbook內容
---
- hosts: all
tasks:
- name: install ansible splunk app
copy:
src: ansible_answers_app
dest: /opt/splunk/etc/apps/
owner: splunk
group: splunk
內容解密:
hosts: all:指定Playbook執行的主機範圍。copy模組:用於將ansible_answers_app目錄複製到Splunk的應用目錄下。owner和group:設定目標目錄的所有者和組為Splunk使用者和組。
構建AWS映象以加快佈署速度
為了加快佈署速度,可以使用AWS提供的映象構建功能,將已經組態好的Splunk伺服器例項建立成一個自定義映象。這樣,在後續的佈署中,可以直接使用這個映象,從而節省時間。
本章節透過結合Ansible範本和CloudFormation指令碼,實作了自動化佈署一個完整的Splunk服務,包括安裝、組態和自定義應用的佈署。透過這種方式,可以大大簡化佈署過程,提高效率。