Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CI/CD 落地指南:用開源 Jenkins & Ansible 
打造自動化部署平台 @ D...

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

CI/CD 落地指南:用開源 Jenkins & Ansible 
打造自動化部署平台 @ DevOps Taiwan Meetup #76

導入自動化工具不難,難的是讓整間公司跟著你的腳步動起來。
本次將分享如何利用全開源工具鏈(Git, Jenkins, Ansible)
為企業量身打造一套可持續成長的自動化架構。
除了談論技術建置細節,從零到一的演變過程,
探討如何建立標準化、可維護的部署流程,
更分享讓他人腦袋做個小小革命,解決開發與運維團隊之間的協作斷層。

Avatar for Johnny Sung

Johnny Sung

March 27, 2026

More Decks by Johnny Sung

Other Decks in Technology

Transcript

  1. Full stack developer Johnny Sung (宋岡諺) https://fb.com/j796160836 https://blog.jks.co ff ee/

    https://www.slideshare.net/j796160836 https://github.com/j796160836
  2. 大 綱 • 手工 部署的痛點 • Jenkins + Ansible 解決

    方 案介紹 • 怎麼做?實作細節 • 導入效益,如何推廣
  3. 你有沒有看過這樣的場景 星期五的下午五點半,客 戶 回報線上系統異常,需緊急上版。 負責部署的同事早就請假,電話打不通。 其他 人 翻遍共 用 資料夾,找到三份不同版本的部署

    SOP, 沒 人 確定哪份是最新的。 硬著頭 皮手 動操作,結果改錯了設定檔,狀況更嚴重了。 ——這可能是很多團隊的 日 常。 https://www.irasutoya.com/2014/10/blog-post_89.html
  4. 手 動部署的痛點 知識斷層 部署步驟散落在各 人 腦中 人 員異動就斷鏈 配置漂移 (Configuration

    Drift) 問題 人 為失誤 手 動操作無法保證 一 致 壓 力 越 大 越容易出錯 協作斷層 開發說「我的程式沒問題,你部署有問題吧」 維運說「我照你 方 式部署,你程式才有問題」 恐懼上版 累積越多變更 一 次上版風險越 高
  5. 手 動部署的痛點 知識斷層 部署步驟散落在各 人 腦中 人 員異動就斷鏈 配置漂移 (Configuration

    Drift) 問題 人 為失誤 手 動操作無法保證 一 致 壓 力 越 大 越容易出錯 協作斷層 開發說「我的程式沒問題,你部署有問題吧」 維運說「我照你 方 式部署,你程式才有問題」 恐懼上版 累積越多變更 一 次上版風險越 高 惡性循環
  6. 至 少還有 一 點點規則 • 程式要做源碼掃描(SAST、 白 箱測試) • 定期要做:

    • 帳號記錄盤點檢視 • 修補更新 • 弱點掃描、滲透測試

  7. Jenkins 是 一 款開源的 自 動化伺服器,廣泛 用 於 持續整合(CI)與持續交付(CD)流程。它以 Java

    開發,可在 Windows、macOS 及 Linux 等多種平台運 行 。 Jenkins 的核 心 優勢在於其豐富的外掛 生 態系統,擁有超過 1,800 個 外掛,能與各種版本控制系統(如 Git)、建置 工 具及部署平台無縫整 合。開發團隊可透過 Jenkins 自 動執 行 程式碼編譯、測試與部署, 大 幅減少 手 動操作並加速軟體交付週期。 其 Pipeline as Code 功能允許以 Jenkins fi le 定義建置流程,便於版本 控管與團隊協作。Jenkins 是 DevOps 實踐中不可或缺的 工 具之 一 。 Jenkins https://www.jenkins.io/
  8. Ansible Ansible 是 一 款開源的 自 動化 工 具, 用

    於配置管理、應 用 程式部署和 任務 自 動化。它採 用 無代理架構,透過 SSH 連接遠端主機,無需在 目 標機器上安裝額外軟體。 Ansible 使 用 YAML 格式撰寫 Playbook,語法簡潔易讀,降低學習 門 檻。它具備冪等性,確保重複執 行 相同任務不會產 生 副作 用 。 主要應 用 場景包括: 伺服器環境配置、軟體安裝與更新、雲端基礎設施管理,以及 CI/CD 流程整合。Ansible 由 Red Hat 維護,擁有活躍的社群和 豐富的模組 生 態系統,是 DevOps 領域廣泛採 用 的 自 動化解決 方 案。
  9. Ansible 特 色 • Control node(控制端) • Playbook 腳本、YAML 格式,簡單好上

    手 • Managed node(被控端) • 不需要另外安裝軟體,使 用 系統預設 SSH & Python 即可
  10. 為何選擇 Jenkins 與 Ansible? • 統 一 技術線與標準 • 工

    具全開源,零授權費 • 完整社群 生 態鏈
  11. 為何選擇 Jenkins 與 Ansible? • 統 一 技術線與標準 (長官有聽過) •

    工 具全開源,零授權費 (公司要省錢) • 完整社群 生 態鏈 (有事都你扛)
  12. 不想污染環境?Docker! https:// fl y.io/docs/languages-and-frameworks/docker fi le/ Docker 是 一 個開源的容器化平台,讓開發者能將應

    用 程式及其所有依賴項 目 (函式庫、設定 檔等)打包成 一 個輕量級、開箱即 用 、可攜帶的「容器」。 與傳統虛擬機器不同,Docker 容器共享主機作業系統的核 心 ,因此啟動速度更快、資源消耗 更少。透過 Docker,開發者可以確保應 用 程式在任何環境(開發、測試、正式環境)中都能 一 致運 行 ,徹底解決「在我電腦上明明可以跑」的問題。 Docker 的核 心 概念包含: • Image(映像檔):應 用 程式的藍圖 • Container(容器):Image 執 行 後的實例 • Docker fi le:定義如何建構 Image 的腳本 • Docker Hub:存放與分享 Image 的公共倉庫 Docker 已成為現代 DevOps 與微服務架構不可或缺的 工 具。
  13. 不想污染環境?Docker! • 開發 工 具封裝在 docker image • 工 廠流

    水 線,產品由不同機具加 工 https://thenounproject.com/icon/automation-8199504/
  14. What is GitOps? GitOps 是 一 種 用 於基礎架構和應 用

    配置管理的技術 方 法,透過 Git 作為版本控 制系統來 自 動化和管理。它使得部署和運維過程變得更加透明、可追蹤及可重 現。在 GitOps 的實踐中,所有的配置 文 件都存儲在 Git 倉庫中,這樣任何的 更改都必須通過 Git 的提交和審核流程。當配置 文 件被更新後, 自 動化的 工 具 會檢測到變更並將新配置應 用 到 生 產環境中,從 而 保證系統的持續性和 一 致 性。 https://foxutech.com/lets-understand-about-gitops/
  15. • 版本控制和審計跟蹤:使 用 Git 作為單 一 資訊來源 (Single source of

    truth),確 保所有變更都有記錄和可追溯。 • 持續部署: 自 動化的部署流程減少 手 動錯誤,加快交付速度。 • 一 致性和標準化:確保環境之間的設置 一 致性,降低複雜性。 • 增強安全:透過 Pull Request 和 Code Review 強化變更的安全性和合規性。 • 易於回滾和錯誤恢復:如果部署失敗或是有問題,可以輕鬆回滾 (Rollback) 
 到先前的穩定版本。 GitOps 的優點
  16. Jenkins + Ansible 架構 (PROD) https://thenounproject.com/icon/user-1994976/ https://www.svgrepo.com/svg/353929/jenkins https://en.wikiversity.org/wiki/Version_Control/Git https://en.m.wikipedia.org/wiki/File:Ansible_logo.svg https://thenounproject.com/icon/server-5079184/

    https://builtonpower.com/ibm-aix-ibm-i-and-linux-on-power-logos/ Created by Alice Design from the Noun Project Commit Webhook SSH WinRM SSH PROD (Linux Managed node) (Windows Managed node) (AIX Managed node) (Control node) playbook.yml Inventory
  17. HashiCorp Vault 是 一 套專為現代基礎設施設計的機密管理 工 具,能夠安全地 儲存、存取及管理敏感資料,如 API 金

    鑰、密碼、憑證和加密 金 鑰。 其核 心 功能包括動態機密(Dynamic Secrets)——可依需求即時產 生 短效憑 證, 大 幅降低憑證外洩風險;資料加密服務讓應 用 程式無需 自行 處理加密邏 輯;以及細粒度存取控制,透過策略(Policy)精確定義誰能存取哪些資源。 Vault 支 援多種驗證 方 式(如 AWS IAM、Kubernetes、LDAP),並提供完整 的稽核 日 誌, 方 便合規追蹤。無論是地端部署或雲端環境,Vault 都能統 一 管 理機密,是 DevOps 與零信任架構中不可或缺的安全基 石 。 HashiCorp Vault
  18. Developer 觸發 Pipeline Jenkins Pipeline 執⾏ Vault Plugin ① 驗證⾝分

    HashiCorp Vault Auth Methods Secret Engines Policies Audit Logs ② 回傳 Token ⽬標服務 使⽤取得的 Secret ③ 注入 Secret 到 Pipeline 環境 Vault 的驗證 方 式
  19. 1. 使⽤ AppRole 認證 2. 回傳短期 Token 3. ⽤ Token

    請求密鑰 4. 回傳動態密碼(TTL 限時) 5. 使⽤動態密碼連線部署 密碼到期⾃動失效 Jenkins HashiCorp Vault ⽬標主機 Vault 的驗證 方 式
  20. Jenkins + Ansible 架構 (PROD) https://thenounproject.com/icon/user-1994976/ https://www.svgrepo.com/svg/353929/jenkins https://en.wikiversity.org/wiki/Version_Control/Git https://en.m.wikipedia.org/wiki/File:Ansible_logo.svg https://thenounproject.com/icon/server-5079184/

    https://builtonpower.com/ibm-aix-ibm-i-and-linux-on-power-logos/ Created by Alice Design from the Noun Project Commit Webhook SSH WinRM SSH PROD (Linux Managed node) (Windows Managed node) (AIX Managed node) (Control node) playbook.yml Inventory Get secret
  21. 建立制度與 文 化 • Git 教育訓練 (不要笑,他們是真的不會...) • Pull Request

    (Merge Request) 機制建立 • 固定的 Review 程式碼討論會議 • CI/CD 撰寫教育訓練 • 資安:上版前送原始碼掃描
  22. Pull Request (Merge Request) Pull Request (PR) 是 一 種請求將你的程式碼變更合併到主分

    支 的機制, 常 見 於 GitHub、GitLab 等平台。 通常流程是:從主分 支 建立 一 個新分 支 → 在新分 支 上開發功能或修復問題 → 完成後發出 PR,請求合併回主分 支 。 PR 的核 心 價值在於團隊協作:其他成員可以審查你的程式碼(Code Review)、留 言 討論、提出修改建議,確保程式碼品質後再正式合併。許多團 隊也會在 PR 觸發 自 動化測試,確保新程式碼不會破壞既有功能。 簡單說,PR 就是「我改好了,請 大 家看過、沒問題再合進去」的正式流程。 Created by IconPai from Noun Project https://thenounproject.com/icon/pull-request-7983901/
  23. Code Review 文 化建立 • Four-eyes principle:
 你的程式碼「 至 少」要有另外

    一人 看過
 (另外 一人 幫你背鍋)
 
 「不要只靠 自己 的兩隻眼睛,要再加上別 人 的兩隻眼睛,
 總共要 用 四隻眼睛來確保品質。」 • 程式碼討論會議 ➡ 自 然 而 然的 Pair Programming
  24. Jenkins Pipeline script (Jenkins fi le) • 基於 Groovy script

    • (CI/CD) Pipeline as Code • GitOps 單 一 資訊來源 (Single source of truth) 可稽可控可 Review
  25. pipeline { agent any // Specifies that the pipeline can

    run on any available agent stages { stage('Build') { steps { echo 'Building the application...' // Run shell commands (sh) for Linux/macOS or batch commands (bat) for Windows sh 'make build' } } stage('Test') { steps { echo 'Running tests...' sh 'make test' // You can add steps to publish test results } } stage('Deploy') { steps { echo 'Deploying the application...' sh 'make publish' } } } } Jenkins Pipeline script (Jenkins fi le) pipeline.jenkins fi le Created by Eugene Belyakov from the Noun Project Created by Eugene Belyakov from the Noun Project Created by Eugene Belyakov from the Noun Project
  26. 錯誤處理與通知 Pipeline Post Block 通知 方 式整合 Email(內建) 無需額外 plugin

    Microsoft Teams Office 365 Connector Plugin Slack Slack Notification Plugin post { success { echo '部署成功' // 發送通知 } failure { echo '部署失敗' // 發送告警 } always { cleanWs() // 清理暫存 } }
  27. pipeline { agent any stages { stage('Build') { // Build

    Stage } stage('Test') { // Build Stage } stage('Deploy') { // Deploy Stage } } post { success { echo '部署成功' // 發送通知 } failure { echo '部署失敗' } always { cleanWs() // 清理暫存 } } } Jenkins Pipeline script (Jenkins fi le) pipeline.jenkins fi le ✅ 🛑 🤖
  28. Jenkins Pipeline script (Jenkins fi le) pipeline.jenkins fi le pipeline

    { agent any environment { SSHKEY = credentials('192.168.1.10_linux') } stages { stage('test ansible') { steps { script { docker.image('docker.io/johnnyworks/ansible:3.20.2-alpine').inside { def playbookContent = """ --- - name: test hosts: jenkins gather_facts: no tasks: - name: test_whoami ansible.builtin.command: whoami - name: test_list_dir ansible.builtin.stat: path: "/home/my_user/workingDir" register: out """ writeFile file: 'playbook.yml', text: playbookContent sh 'cat playbook.yml' sh""" cat > inventory <<- END [jenkins] 192.168.1.10 ansible_user=my_srv_account ansible_ssh_private_key_file=$SSHKEY ansible_connection=ssh ansible_port=22 END """ sh 'export ANSIBLE_HOST_KEY_CHECKING=False && ansible-playbook -vvv -i inventory playbook.yml' } } } } } }
  29. Jenkins Pipeline script to Linux Demo (Jenkins fi le) pipeline.jenkins

    fi le playbook.yml inventory pipeline { agent any environment { SSHKEY = credentials('192.168.1.10_linux') } stages { stage('test ansible') { steps { script { docker.image('docker.io/johnnyworks/ansible:3.20.2-alpine').inside { def playbookContent = """ --- - name: test hosts: linux-servers gather_facts: no tasks: - name: test_whoami ansible.builtin.command: whoami - name: test_list_dir ansible.builtin.stat: path: "/home/my_user/workingDir" register: out """ writeFile file: 'playbook.yml', text: playbookContent sh 'cat playbook.yml' def inventoryContent = ''' [linux-servers] 192.168.1.10 ansible_user=my_srv_account ansible_connection=ssh ansible_port=22 ''' writeFile file: 'inventory', text: inventoryContent sh ''' export ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -vvv -i inventory --private-key="$SSHKEY" playbook.yml ''' } } } } } }
  30. Jenkins Pipeline script to Windows Demo (Jenkins fi le) pipeline.jenkins

    fi le playbook.yml inventory pipeline { agent any environment { winCredentialId = '192.168.1.30_windows' } stages { stage('ansible demo (windows)') { steps { script { docker.image('docker.io/johnnyworks/ansible:3.20.2-alpine').inside { def playbookContent = ''' --- - name: test hosts: windows-servers gather_facts: no tasks: - name: test_hello ansible.windows.win_powershell: script: echo "Hello World" ''' writeFile file: 'playbook.yml', text: playbookContent sh 'cat playbook.yml' withCredentials([ [$class: 'UsernamePasswordMultiBinding', credentialsId: winCredentialId, usernameVariable: 'SYS_USERNAME', passwordVariable: 'SYS_PASSWORD'] ]) { sh ''' cat > inventory <<END [windows-servers] 192.168.1.30 ansible_user=${SYS_USERNAME} ansible_password=${SYS_PASSWORD} ansible_connection=winrm ansible_winrm_transport=basic ansible_winrm_server_cert_validation=ignore ansible_port=5985 END ''' } sh 'export ANSIBLE_HOST_KEY_CHECKING=False && ansible-playbook -vvv -i inventory playbook.yml' } } } } } }
  31. Jenkins Pipeline script to AIX (Jenkins fi le) pipeline.jenkins fi

    le playbook.yml inventory pipeline { agent any environment { SSHKEY = credentials('192.168.1.20_aix') } stages { stage('ansible demo (aix)') { steps { script { docker.image('docker.io/johnnyworks/ansible:3.20.2-alpine').inside { def playbookContent = ''' --- - name: test hosts: aix-servers gather_facts: no tasks: - name: test ansible.builtin.shell: "oslevel" register: out ''' writeFile file: 'playbook.yml', text: playbookContent sh 'cat playbook.yml' def inventoryContent = ''' [aix-servers] 192.168.1.20 ansible_user=my_srv_account ansible_connection=ssh ansible_port=22 ansible_python_interpreter=/opt/bin/python3.9 ''' writeFile file: 'inventory', text: inventoryContent sh ''' export ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -vvv -i inventory --private-key="$SSHKEY" playbook.yml ''' } } } } } }
  32. Pipeline 對於 Secrets 的處理細節 • 消除 Jenkins 的 credential masking

    警告,
 這樣 Jenkins 才能正確遮蔽 log 中的值。 • 不要把密碼變數 SSHKEY 寫進 inventory
 改在 ansible-playbook 指令中 用 --private-key • sh 指令 用 單引號 '''...''' 包起來 (在 Groovy 中不做插值)
 讓密碼變數 $SSHKEY 由 shell 在執 行 階段展開, 而 不是 Groovy 先展開。 • 密碼不要加單引號包起來。
 原本寫 ansible_password='$SYS_PASSWORD'
 如果密碼本 身 含有單引號就會壞掉。
  33. pipeline { agent any stages { stage('deploy with vault') {

    steps { withVault( configuration: [ vaultUrl: 'http://my.vault.server:8200', vaultCredentialId: 'vault-approle' ], vaultSecrets: [ [ path: '192.168.1.10_ssh_key', secretValues: [ [envVar: 'DEPLOY_KEY', vaultKey: 'ssh_private_key'] ] ] ] ) { script { docker.image('docker.io/johnnyworks/ansible:3.20.2-alpine').inside { def playbookContent = """ ...(略)... """ writeFile file: 'playbook.yml', text: playbookContent def inventoryContent = ''' [linux-servers] 192.168.1.10 ansible_user=my_srv_account ansible_connection=ssh ansible_port=22 ''' writeFile file: 'inventory', text: inventoryContent // DEPLOY_KEY 由 Vault 動態注入,pipeline 結束後 自 動清除 writeFile file: 'temp_key', text: env.DEPLOY_KEY sh 'chmod 600 temp_key' sh 'export ANSIBLE_HOST_KEY_CHECKING=False && ansible-playbook -vvv -i inventory --private-key temp_key playbook.yml' sh 'rm -f temp_key' } } } } } } } Jenkins Pipeline script with Vault (Jenkins fi le) pipeline.jenkins fi le
  34. Pipeline 失敗 擷取 Console Log(最後 200 ⾏) 送出 log +

    prompt 回傳:錯誤摘要 + 可能原因 + 建議修復 通知團隊,附上 AI 分析報告 Jenkins Pipeline LLM API Teams / Email AI 可以幫我們什麼? • 中後期(維運階段):協助除錯
  35. 連線設定:SSH Key & WinRM SSH Key(Linux / AIX) 1. 建立

    金 鑰 ssh-keygen -t ed25519 -f my_key 2. 複製 至 伺服器 ssh-copy-id -i ~/.ssh/my_key user@host 3. 新增到 Jenkins Credentials Kind: SSH Username with private key 權限:.ssh(700) 私鑰(600) authorized_keys(600)
  36. 連線設定:SSH Key & WinRM SSH Key(Linux / AIX) 1. 建立

    金 鑰 ssh-keygen -t ed25519 -f my_key 2. 複製 至 伺服器 ssh-copy-id -i ~/.ssh/my_key user@host 3. 新增到 Jenkins Credentials Kind: SSH Username with private key 權限:.ssh(700) 私鑰(600) authorized_keys(600) WinRM(Windows) 1. 啟動 WinRM 服務 Start-Service WinRM 2. 基本設定 winrm quickconfig winrm set winrm/config/service/auth '@{Basic="true"}' winrm set winrm/config/service '@{AllowUnencrypted="true"}' 3. 防火牆開放 HTTP: port 5985 / HTTPS: port 5986 生 產環境請使 用 WinRM HTTPS
  37. 常 用 Ansible 模組 Linux / AIX — ansible.builtin 模組

    用 途 ansible.builtin.command 執 行 指令(不經過 shell) ansible.builtin.shell 執 行 指令(經過 shell, 支 援管線) ansible.builtin.copy 複製檔案到遠端 ansible.builtin.file 管理檔案/ 目 錄屬性 ansible.builtin.stat 取得檔案資訊 Windows — ansible.windows 模組 用 途 ansible.windows.win_powershell 執 行 PowerShell 腳本 ansible.windows.win_shell 執 行 shell 指令 ansible.windows.win_service 管理 Windows 服務 ansible.windows.win_copy 複製檔案到遠端 ansible.windows.win_file 管理檔案/ 目 錄
  38. builtin.command vs builtin.shell • ansible.builtin.command → 有安全過濾(會過濾指令) • ansible.builtin.shell →

    直接下指令(個 人 推薦這個) • ansible.builtin.raw → 原始指令(網通設備等沒有 python 環境使 用 ) Created by Jovi Ming https://thenounproject.com/icon/command-line-8295079/
  39. 用 Ansible 控制 Windows • Ansible 主要使 用 WinRM 來控制(不是

    SSH) • Ansible 指令 collection 不同 • 指令回應亂碼 • 操作者權限問題
  40. Windows 指令亂碼? • 設定 Powershell 輸出編碼為 Big5 - name: Execute

    a command and register the output hosts: windows_hosts gather_facts: false tasks: - name: Run a PowerShell command ansible.windows.win_shell: C:\somescript.ps1 args: output_encoding_override: big5 register: shell_result # The output will be stored in a variable named 'shell_result' - name: Display the standard output ansible.builtin.debug: var: shell_result.stdout playbook.yml Powershell
  41. Windows 指令亂碼? • 設定 cmd 輸出編碼為 Big5 - name: Execute

    a command and register the output hosts: windows_hosts gather_facts: false tasks: - name: Run a command in cmd ansible.windows.win_command: C:\someprog.exe args: output_encoding_override: big5 register: shell_result # The output will be stored in a variable named 'shell_result' - name: Display the standard output ansible.builtin.debug: var: shell_result.stdout playbook.yml 命令提 示 字元 (cmd)
  42. • Windows 服務需要:管理員 (Administrator) 權限 • 最 小 權限原則,只開必要權限 •

    開普通使 用 者帳號,只開授權必要服務操作權限 • 操作安全性描述元定義語 言 (SDDL)
 沒有 GUI 操作者(機器帳號)權限問題 https://thenounproject.com/icon/permission-7961121/
  43. IBM AIX IBM AIX(Advanced Interactive eXecutive)是 IBM 開發的商業 Unix 作業

    系統, 自 1986 年 首 次發布以來,主要運 行 於 IBM Power Systems 伺服器 上,歷經數 十 年演進,始終是企業級運算的重要基 石 。 AIX 以 高 可靠性、 高 可 用 性與卓越穩定性著稱,廣泛應 用 於 金 融、電 信、製造等對系統中斷容忍度極低的產業環境。在技術層 面 ,AIX 提供 JFS2 日 誌檔案系統以確保資料完整性,並 支 援 WPAR 輕量級虛擬化技術 與不停機核 心 更新(Live Kernel Update), 大 幅降低維護作業對業務的 衝擊。此外,其強化安全機制也符合政府與 金 融機構的嚴格 合規需求。 AIX 與 IBM Power 硬體深度整合,在處理 大 規模交易與關鍵 任務 工 作負載時展現出 色 的效能與容錯能 力 ,至今仍是許多 跨國企業核 心 基礎架構不可或缺的選擇。 https://www.midlandinfosys.com/ibm-8286-42a-s824-aix-power8-24-core-server
  44. Jython 是 一 個在 Java 虛擬機(JVM)上執 行 的 Python 實作版本,由

    Jim Hugunin 於 1997 年創建(最初稱為 JPython)。它將 Python 程式碼編譯成 Java 位元組碼,讓開發 者能夠在 Java 環境中無縫使 用 Python 語法。 Jython 最 大 的優勢在於它能夠直接呼叫 Java 類別庫,讓 Python 程式碼與 Java 程式碼 互相整合,開發者可以同時享有 Python 的簡潔語法與 Java 生 態系的豐富資源。此外, Jython 天然 支 援多執 行 緒,並能受益於 JVM 的效能優化。 然 而 ,Jython 的發展相對緩慢,長期停留在 Python 2.7 版本,對 Python 3 的 支 援仍在 進 行 中。它也無法使 用 以 C 語 言 撰寫的 Python 擴充套件(如 NumPy),這使其在科學 計算領域的應 用 受到限制。 目 前主要 用 於企業級 Java 應 用 程式的腳本擴充情境。 https://www.jython.org/ Jython ?
  45. IBM AIX • CPU 架構不同:PowerPC(不是 x86_64 也不是 arm64) • UNIX

    系統,指令不同(很像 Linux 但不是 Linux) • ksh (KornShell)(不是 bash...)(Auto-complete 快捷鍵是 Esc) • 只有 vi。沒有 vim(無法 用方 向鍵,只能學 H J K L) • 沒有套件管理程式(dnf 至 少...預設沒有裝)
  46. ppc64le 請記得 一 個關鍵字 這是它的 CPU Architecture 也是 Google 可以

    用 的關鍵字 ✅ 蘋果 Mac 也 用 過 Power PC (CPU) 但跟 IBM 使 用 的 Power PC (CPU) 不同
  47. 用 Ansible 控制 AIX • 指令不同 • topas (功能同 top)

    • du -m ( 用 MegaBytes 來顯 示 檔案 用 量) • installp (套件安裝程式,類似 dpkg 指令) • 沒有 Python 無法使 用 進階功能
 (只能使 用 ansible.builtin.raw 模組) • 沒有 Bash
  48. 不忍了!爆改 AIX ! • 裝 bash ! • 裝 Python

    ! • 裝 vim ! • 裝 curl ! • 裝 wget ! https://en.wikipedia.org/wiki/IBM_AIX#/media/File:IBM_AIX_screenshot.Png
  49. 複製檔案很慢? • 4hr 與 5min 的差距 • scp 複製 +

    校驗 ➡ 慢 • 解法: • 改 用 rsync • ansible.builtin.copy ➡ ansible.posix.synchronize https://www.irasutoya.com/2016/03/blog-post_36.html
  50. 準備 Jenkins 就有困難 • Jenkins 裝在 離線環境 / 隔離網路 (Air-Gapped

    Network) • Jenkins plugins dependencies • 解法:包 自 定義 docker image 
 開箱即 用 、 一 次裝好 https:// fl y.io/docs/languages-and-frameworks/docker fi le/
  51. Jenkins 的定時陷阱 • Jenkins 排程參照 cron 只有 月 / 日

    /時/分/秒,沒有「年」 • 一 年過後, 又 要寫報告了 https://www.lenar.io/jenkins-schedule-build-periodically/
  52. 導入階段與預期效益 Phase 1 試 行 專案 選 1 個團隊先跑 Phase

    2 建立範本 標準化流程 Phase 3 橫向推廣 全公司導入 預期效益 指標 導入前 導入後 部署頻率 每 月 1-2 次 每週 部署效率 40min / 每模組 5min 同時 5 模組 部署失敗率 人工 失誤頻繁 自 動化 大 幅降低 新 人 上 手 時間 數天~數週(看 文 件、跟著老 手 學) 一 天(看 文 件跑 pipeline) 部署依賴特定 人 是 否 20 / 22
  53. 推廣阻 力 與應對 「 手 動部署 又 沒出過事」 用 數據說話:統計

    人工 錯誤次數與修復時間 「學新 工 具太花時間」 提供範本與 文 件,降低 門 檻;先從簡單任務開始 「老系統不想動」 正因為風險 高 ,更需要標準化流程降低出錯機率 「這是 Ops 的事」 Pipeline as Code 讓開發參與,打破協作斷層 從痛點到解法 部署靠 人 腦 → 步驟不 一 致 → 密碼到處放 Pipeline 版控 → Ansible 標準化 → Vault 安全 → 通知稽核
  54. 你明天就能做的三件事 1 選 一 個最痛的部署流程,把 手 動步驟寫成 Ansible Playbook 2

    在 Jenkins 上建 一 個 Pipeline 專案,把 Jenkinsfile 放進 Git 3 跑 一 次給團隊看——看到 自 動化實際運作,比任何投影片都有說服 力
  55. 結語 • 自 動化不是 一 步到位的 大工 程, 而 是

    一 連串 小小 的改善。 • 重要的不是 工 具多厲害,
 而 是讓團隊願意跟著你 一 起踏出第 一 步。 https://www.irasutoya.com/2019/03/blog-post_84.html