命令,用Ansible完成JumpServer一鍵自動(dòng)化部署全流程)
只需幾個(gè)命令用Ansible完成JumpServer一鍵自動(dòng)化部署全流程【免費(fèi)下載鏈接】jumpserverJumpServer is an open-source Privileged Access Management (PAM) platform that provides DevOps and IT teams with on-demand and secure access to SSH, RDP, Kubernetes, Database and RemoteApp endpoints through a web browser.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ju/jumpserverJumpServer 是目前被廣泛使用的開(kāi)源特權(quán)訪問(wèn)管理PAM平臺(tái)企業(yè)內(nèi)負(fù)責(zé)運(yùn)維和研發(fā)的團(tuán)隊(duì)可以借助它在瀏覽器中安全地訪問(wèn) SSH、RDP、Kubernetes、數(shù)據(jù)庫(kù)以及各類(lèi)遠(yuǎn)程應(yīng)用。傳統(tǒng)安裝方式需要手工準(zhǔn)備依賴、逐一調(diào)整配置再啟動(dòng)多個(gè)組件任何一個(gè)環(huán)節(jié)出錯(cuò)都會(huì)消耗大量時(shí)間。如果你也想把部署變成一條可重復(fù)執(zhí)行的命令用 Ansible 做 JumpServer 自動(dòng)化部署是目前最省心的路線。先搞清楚這套自動(dòng)化方案到底在解決什么很多運(yùn)維都經(jīng)歷過(guò)手動(dòng)部署的痛點(diǎn)可以把它們歸結(jié)為四類(lèi)依賴不可控操作系統(tǒng)版本不同、Python 版本有差異同樣的腳本在 A 機(jī)器能跑、在 B 機(jī)器就報(bào)錯(cuò)。配置易出錯(cuò)數(shù)據(jù)庫(kù)密碼、密鑰、端口這些參數(shù)散落在各個(gè)配置文件里漏改一處就可能連不上服務(wù)。流程難復(fù)現(xiàn)部署步驟靠人肉記憶新機(jī)器來(lái)了要么重新摸索要么照著舊文檔踩坑。排障靠運(yùn)氣組件之間互相依賴問(wèn)題定位通常要在日志里翻很久。Ansible 的自動(dòng)化部署方案正好把這些問(wèn)題逐個(gè)擊破環(huán)境檢查交給劇本、配置生成由模板完成、整套流程固定為 inventory 加 playbook每一次部署的結(jié)果都是可預(yù)期的。在 JumpServer 的源碼中自動(dòng)化能力其實(shí)內(nèi)嵌在項(xiàng)目自身它自己就是通過(guò)apps/ops/ansible/interface.py這個(gè)模塊來(lái)調(diào)度 Ansible 任務(wù)的下面的代碼展示了運(yùn)行器的核心骨架class RunnerInterface: def __init__(self, runner_type, gateway_proxy_host127.0.0.1): if not issubclass(runner_type, BaseRunner): raise TypeError(f{runner_type} can not cast to {BaseRunner}) self._runner_type runner_type self._gateway_proxy_host gateway_proxy_host def run(self, **kwargs): runner_type self.get_runner_type() runner runner_type(**kwargs) return runner.run()這段代碼做的事情很簡(jiǎn)單校驗(yàn)運(yùn)行器類(lèi)型然后實(shí)例化并執(zhí)行。正是這種把任務(wù)描述給運(yùn)行器、運(yùn)行器負(fù)責(zé)執(zhí)行的思路構(gòu)成了整個(gè)自動(dòng)化部署的底層邏輯。第一步準(zhǔn)備目標(biāo)服務(wù)器看清最低要求在動(dòng)手之前先確認(rèn)目標(biāo)主機(jī)滿足硬件和軟件門(mén)檻。下表是建議的參考值配置項(xiàng)最低要求推薦配置操作系統(tǒng)CentOS 7 / Ubuntu 20.04CentOS 8 / Ubuntu 22.04CPU2 核4 核內(nèi)存4 GB8 GB磁盤(pán)50 GB SSD100 GB SSDPython3.83.9準(zhǔn)備工作分兩步走第一步克隆倉(cāng)庫(kù)到控制節(jié)點(diǎn)git clone https://gitcode.com/GitHub_Trending/ju/jumpserver cd jumpserver第二步讓劇本自己先體檢。部署劇本在正式安裝前會(huì)做一輪前置檢查覆蓋系統(tǒng)內(nèi)核版本、必要依賴包是否齊全、關(guān)鍵端口有沒(méi)有被占用、SELinux 與 AppArmor 的狀態(tài)等。對(duì)應(yīng)到項(xiàng)目?jī)?nèi)部apps/assets/tasks/utils.py中的check_asset_can_run_ansible函數(shù)就是這一套檢查邏輯的縮影——它會(huì)在執(zhí)行自動(dòng)化任務(wù)前先判斷資產(chǎn)是否具備被 Ansible 接管的條件def check_asset_can_run_ansible(asset): if not asset.is_active: msg _(Asset has been disabled, skipped: {}).format(asset) logger.info(msg) return False if not asset.is_support_ansible(): msg _(Asset may not be support ansible, skipped: {}).format(asset) logger.info(msg) return False return True把檢查放在前面而不是等裝到一半才發(fā)現(xiàn)問(wèn)題是這套方案降低失敗率的關(guān)鍵設(shè)計(jì)。第二步把 Ansible 任務(wù)和業(yè)務(wù)任務(wù)分開(kāi)跑JumpServer 的一個(gè)細(xì)節(jié)值得留意所有 Ansible 任務(wù)都被投遞到專(zhuān)門(mén)的ansible隊(duì)列里和核心業(yè)務(wù)請(qǐng)求互不干擾。以連通性測(cè)試為例apps/assets/tasks/ping.py中是這樣定義任務(wù)的shared_task( verbose_name_(Test assets connectivity), queueansible, activity_callbacklambda self, asset_ids, org_id, *args, **kwargs: (asset_ids, org_id), ) def test_assets_connectivity_task(asset_ids, org_id, task_nameNone): task_name PingAutomation.generate_unique_name(task_name) task_snapshot {assets: asset_ids} with tmp_to_org(org_id): quickstart_automation(task_name, AutomationTypes.ping, task_snapshot)這意味著當(dāng)你在資產(chǎn)詳情 - 基本設(shè)置里點(diǎn)擊測(cè)試資產(chǎn)連通性時(shí)請(qǐng)求會(huì)被異步丟進(jìn)ansible隊(duì)列由專(zhuān)門(mén)的 Worker 消費(fèi)不會(huì)拖慢主流程。同理生產(chǎn)環(huán)境的部署也建議把自動(dòng)化執(zhí)行與業(yè)務(wù)服務(wù)放在不同的資源池里方便獨(dú)立擴(kuò)容和觀察。第三步不同類(lèi)型資產(chǎn)走不同的 Ansible 策略不是所有資產(chǎn)都用同一套 Ansible 配置。JumpServer 在apps/assets/const/host.py里為不同平臺(tái)預(yù)置了差異化的約束cls.WINDOWS: { ansible_config: { ansible_shell_type: cmd, ansible_connection: smart, }, }默認(rèn)的 Linux / Unix 資產(chǎn)啟用ansible_connection: smart并支持 sudo、su 多種提權(quán)方式Windows 則額外指定cmd作為 shell 類(lèi)型而Other類(lèi)型的主機(jī)默認(rèn)完全關(guān)閉 Ansible 能力避免誤操作。在 inventory 里聲明主機(jī)時(shí)盡量明確標(biāo)注系統(tǒng)類(lèi)型讓自動(dòng)化適配層幫你選對(duì)參數(shù)。第四步編寫(xiě) inventory聲明部署參數(shù)現(xiàn)在進(jìn)入實(shí)戰(zhàn)環(huán)節(jié)。創(chuàng)建inventory.ini把目標(biāo)主機(jī)和部署參數(shù)寫(xiě)清楚[jumpserver] 192.168.1.100 ansible_ssh_userroot ansible_ssh_port22 [jumpserver:vars] ansible_python_interpreter/usr/bin/python3 jumpserver_versionv3.10.0 db_passwordyour_secure_password secret_keyyour_secret_key_here這里有兩個(gè)參數(shù)要特別上心secret_key用于 Django 加密生產(chǎn)環(huán)境務(wù)必用隨機(jī)字符串并且絕不能泄露。項(xiàng)目里也給出了生成方式cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 49;echodb_password是數(shù)據(jù)庫(kù)口令盡量選擇強(qiáng)度足夠的組合。第五步執(zhí)行劇本并學(xué)會(huì)看日志一切就緒后運(yùn)行一鍵部署ansible-playbook -i inventory.ini utils/playbooks/deploy.yml劇本會(huì)自動(dòng)幫你完成一串動(dòng)作安裝系統(tǒng)依賴 → 部署 PostgreSQL → 部署 Redis → 配置 Nginx 反向代理 → 初始化 JumpServer 數(shù)據(jù)庫(kù) → 拉起全部服務(wù)組件。部署過(guò)程可以開(kāi)一個(gè)終端實(shí)時(shí)盯日志tail -f /var/log/jumpserver/ansible-deploy.log遇到可自動(dòng)恢復(fù)的錯(cuò)誤Ansible 會(huì)重試無(wú)法自動(dòng)修復(fù)的問(wèn)題會(huì)在日志中標(biāo)記出具體主機(jī)和任務(wù)名方便你順著錯(cuò)誤定位。第六步部署后的驗(yàn)收按這三條過(guò)一遍1. 服務(wù)狀態(tài)確認(rèn)systemctl status jumpserver所有服務(wù)都應(yīng)顯示為active (running)。2. 登錄 Web 界面打開(kāi)瀏覽器訪問(wèn)http://目標(biāo)服務(wù)器IP:8080用初始賬號(hào)登錄用戶名admin密碼ChangeMe首次登錄會(huì)被強(qiáng)制修改密碼這是安全策略的一部分務(wù)必配合修改。3. 驗(yàn)證資產(chǎn)連通性登錄后添加一臺(tái)測(cè)試資產(chǎn)在資產(chǎn)詳情 - 基本設(shè)置里點(diǎn)擊測(cè)試資產(chǎn)連通性觀察任務(wù)是否正常落庫(kù)并返回結(jié)果。這一步本質(zhì)上是驗(yàn)證整套 Ansible 執(zhí)行鏈路隊(duì)列 → Worker → 運(yùn)行器是否暢通。進(jìn)階如何做定制化部署多環(huán)境復(fù)用同一套劇本通過(guò)變量文件區(qū)分環(huán)境一份劇本多處復(fù)用# 開(kāi)發(fā)環(huán)境 ansible-playbook -i inventory/dev.ini utils/playbooks/deploy.yml -e envdev # 生產(chǎn)環(huán)境 ansible-playbook -i inventory/prod.ini utils/playbooks/deploy.yml -e envprod自定義服務(wù)配置項(xiàng)目根目錄的config_example.yml是配置模板包含數(shù)據(jù)庫(kù)、Redis、Vault、LDAP、日志級(jí)別、端口等全部核心參數(shù)。修改后再通過(guò) Ansible 變量注入即可例如jumpserver_config: SECURITY: ALLOWED_HOSTS: - jumpserver.example.com SESSION_COOKIE_SECURE: True LOGGING: LEVEL: INFO其中ANSIBLE_RUNNER_JOB_TIMEOUT、ANSIBLE_AUTOMATION_TASK_TIMEOUT等參數(shù)控制自動(dòng)化任務(wù)的超時(shí)行為在大型資產(chǎn)規(guī)模下建議根據(jù)實(shí)際執(zhí)行時(shí)長(zhǎng)調(diào)優(yōu)避免任務(wù)被誤殺。常見(jiàn)問(wèn)題排查清單數(shù)據(jù)庫(kù)連不上。先看 PostgreSQL 狀態(tài)和網(wǎng)絡(luò)連通性systemctl status postgresql-13 psql -h 127.0.0.1 -U jumpserver -d jumpserver服務(wù)起來(lái)就退出。翻應(yīng)用日志定位tail -n 100 /var/log/jumpserver/jumpserver.log常見(jiàn)的幾個(gè)坑配置文件寫(xiě)錯(cuò)、端口被占用、權(quán)限不足、依賴庫(kù)缺失按順序排查通常能快速找到答案。Ansible 報(bào)權(quán)限不足。在目標(biāo)主機(jī)上執(zhí)行visudo為部署用戶放開(kāi)免密 sudousername ALL(ALL) NOPASSWD: ALL收尾從能跑到跑得穩(wěn)一套可重復(fù)執(zhí)行的部署只是起點(diǎn)。接下來(lái)建議按這個(gè)順序繼續(xù)優(yōu)化容器化改造把各組件遷移到 Kubernetes讓擴(kuò)縮容和滾動(dòng)更新變得可控。接入 CI/CD代碼更新后自動(dòng)觸發(fā)構(gòu)建與部署減少人工操作窗口。構(gòu)建高可用多區(qū)域部署加負(fù)載均衡避免單點(diǎn)故障。補(bǔ)齊監(jiān)控告警把服務(wù)狀態(tài)、任務(wù)執(zhí)行成功率接入現(xiàn)有監(jiān)控體系。深入理解這套自動(dòng)化的更多細(xì)節(jié)可以翻看項(xiàng)目源碼中的apps/ops/ansible/目錄和apps/assets/tasks/下的實(shí)現(xiàn)參與討論與貢獻(xiàn)請(qǐng)參考CONTRIBUTING.md安全問(wèn)題處理流程見(jiàn)SECURITY.md。實(shí)戰(zhàn)小貼士建議把utils/backup_db.sh接入 crontab 定期執(zhí)行并同步備份secret_key。數(shù)據(jù)庫(kù)好恢復(fù)密鑰一旦丟失已加密數(shù)據(jù)將無(wú)法解密——這兩樣?xùn)|西都要像對(duì)待生產(chǎn)資產(chǎn)一樣對(duì)待。【免費(fèi)下載鏈接】jumpserverJumpServer is an open-source Privileged Access Management (PAM) platform that provides DevOps and IT teams with on-demand and secure access to SSH, RDP, Kubernetes, Database and RemoteApp endpoints through a web browser.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ju/jumpserver創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考