[ 實戰 CI / CD Pipeline ] Jenkins + Ansible + Windows Host

更新於 發佈於 閱讀時間約 12 分鐘
raw-image

前言

隨著越來越多公司導入 DevOps 、Agile、Scrum 開發模式,作為基礎設施的 CI / CD Pipeline 也越來越被需要。但是導入的過程中,
總會遇到一些問題:

CI / CD Pipeline 該怎麼建 !?
Pipeline 工具該怎麼選擇 !?
該找誰負責 Devs、QAs、Ops !?

總之,不知道該怎麼辦的時候只好問天 XD

老天 : 去看書 !

要讀那些呢 ? 不外乎就是這幾本 ----- DevOps 聖經

掌握 DevOps 以下三個要點:

自動化、可視化、快速回饋

CI / CD 常見的工具有:

  • Jenkins
  • GitLab CI
  • AWS CodePipeline
  • Azure DevOps
  • Travis CI
  • Circle CI
  • Drone CI
該選誰呢...?
不管了 !!
先從最老工具的開始練習~~
持續整合一哥 --------- Jenkins
raw-image

來建一條 Pipeline 吧 !

Environment Requirements :

  • Jenkins + Ansible (Ubuntu 16.04)
  • Remote Host ( Windows 10 )

由於測試環境需求,需要遠端控制一台或多台 Windows VM,如果透過 Jenkins Slave 來控制遠端電腦,在以往的經驗中,若是網路斷線或是 VM Snapshot Revert 的環境中常常造成 Jenkins 主控端與遠端不同步的狀況,必須靠著各種 Workaround 來排除困難。

這次的實驗,我想用 Jenkins + Ansible 來搭建測試環境的 Pipeline,因 Ansible 僅支援 Linux 作業系統,所以我選擇將 Jenkins 安裝在 Ubuntu 上。

======== 實驗開始 ========

Jenkins Installation

可以將以下 commands 存成 jenkins_install.sh,將 shell script 版控處理。


執行完成後,會印出一組初始的 Admin Password,打開瀏覽器連結至Jenkins Console ( https://localhost:8080 ),將初始密碼貼上後安裝官方建議 Plugins。

P.S. 若環境有任何防火牆,請記得把來源加入白名單

jenkins-ci.org
jenkins.io
pkg.jenkins.io
raw-image

等待一切都安裝完成後,進到 Jenkins > Manage Jenkins > Manage Plugin 選 Available 安裝以下 Plugins:

Blue Ocean --- Pipeline可視化
AnsiColor --- Logging colors display
Ansible-plugin

接著,點選 Blue Ocean 進入設定 --- [More]

raw-image
raw-image

讓 Jenkins account 擁有 sudo 權限 ( 不須可跳過 )

開啟 Linux Terminal 完成下列步驟後儲存離開。

1. sudo vim /etc/sudoers
2. add "Jenkins ALL=(ALL) NOPASSWPRD: ALL"

Jenkins 安裝的部分,暫時告一個段落,接著安裝 Ansible。

raw-image

Ansible 是一個 Base on Python 的自動化組態管理工具,經由執行 YAML 管裡設定,格式編寫容易,容易上手與維護簡單,不需要透過代理或安裝 Client 來控制遠端機器,僅透過 SSH ( Linux ) 與 Winrm ( Windows )來執行遠端程序,2015 年由 Red Hat 收購

Ansible 2.9.0 Installation


安裝 Windows Remote Control Packages

pip install pywinrm

開始建立 Ansible 專案

# create ansible folder
mkdir ansible
cd ansible

編輯 Ansible 設定檔 ansible.cfg,指定 inventory 與 ansible.log

vim ansible.cfg
[defaults]
inventory = inventory
log_path = ansible.log

這次的實驗我們需要一台 Windows 遠端主機,
Windows 遠端主機需要有 PowserShell 3.0 以上的版本。

raw-image

PowserShell 權限必須設置為 RemoteSigned 或 Unrestricted 並開啟 WinRm 相關設定。以系統管理員身分執行 PowerShell,確認 PowserShell 權限,若權限不為上述兩項,可以更改權限 Set-ExecutionPolicy RemoteSigned

PS C:\Users\Wis> Get-ExecutionPolicy
RemoteSigned

開啟 WinRm Service 進行基礎配置

winrm quickconfig
# Enable WinRm Auth
winrm set winrm/config/service/auth '@{Basic="true"}'
# Enable Allow Un-encrypt
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
# Verify WinRm Listener
winrm enumerate winrm/config/listener
raw-image

接著,編輯 inventory 檔,將遠端 Windows Host 資訊填入

vim inventory
[windows]  # group name
win10 ansible_host=10.1.2.1
[windows:vars] # define variable for windows group
ansible_user=win_user
ansible_password=win_password
ansible_port=5985
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore

測試一下 Ansible 連線

$> ansible windows -m win_ping
win10 | SUCCESS => {
"changed": false,
"ping": "pong"
}
連線成功囉!!

Ansible - 資料夾結構

- Jenkinsfile
- ansible
- ansible.cfg
- inventory
- playbook.yml
- remote_run.py

接下來,把想做的程序寫進 playbook.yml 裡,預期在遠端 Windows Host 執行 Python 程式 remote_run.py

vim playbook.yml
- hosts: windows
gather_facts: no
vars:
py_src_name: remote_run.py
py_dst_dir: C:\temp\ansible
tasks:
- name: Create folder on remote host
win_file:
path: '{{ py_dst_dir }}'
state: directory
- name: Copy python file to remote host
win_copy:
src: '{{ py_src_name }}'
dest: '{{ py_dst_dir }}\{{ py_src_name }}'
- name: Execute python program
win_shell: python '{{ py_dst_dir }}\{{ py_src_name }}'

簡單的寫一個執行5秒的 Python 程式,給遠端 Windows Host 執行 ---remote_run.py

vim remote_run.py
import time
for i in range(5):
print("this is loop [{}]".format(i))
time.sleep(1)

測試一下 Ansible Playbook

# 最後補上 -vvv 可顯示 debug info
ansible-playbook playbook.yml

Blue Ocean 會在 Jenkins console 上建立一個可視的 Pipeline,而設定完與 GitHub 連線, Jenkinsfile 會放在 Git repository 最上層 ( 可任意改變位置,Jenkins 也須跟著調整 Jenkinsfile Path )。

Jenkinsfile 內容如下:

pipeline {
agent any
stages {
stage('Windows Host Step') {
steps{
dir(path: 'ansible') {
ansiColor(colorMapName: 'xterm') {
ansiblePlaybook(
playbook: 'playbook.yml',
inventory: 'inventory',
colorized: true)
}
}
}
}
}
}

最後,將修改的檔案推上 GitHub, 就完成囉~!

  • 自動化 - 未來加入更多自動化測試與工作流程。
  • 工作流程可視化 - 藉由 Blue Ocean 的介面,可以得知 Pipeline 的狀態。
  • 快速回饋 - 藉由每次的 Code Commit 觸發一個 Jenkins CI Run 達成快速回饋的機制。

Reference:

留言
avatar-img
留言分享你的想法!
avatar-img
Wis Vocus
3會員
9內容數
Drunk Wis
Wis Vocus的其他內容
2021/12/11
2021 年底還是不免俗的幫自己來個回顧吧!自從 2018 年開始,我每年都會幫自己寫一篇今年的紀錄,紀錄著自己的成長、紀錄著自己做過的事情、紀錄遇見的朋友、紀錄很多發生的事情… 畢竟要記住的東西太多了~只好…寫下來才不會忘記,順便看看自己到底在幹嘛XD~長大之後再回來看看笑笑~ 工作 個人
Thumbnail
2021/12/11
2021 年底還是不免俗的幫自己來個回顧吧!自從 2018 年開始,我每年都會幫自己寫一篇今年的紀錄,紀錄著自己的成長、紀錄著自己做過的事情、紀錄遇見的朋友、紀錄很多發生的事情… 畢竟要記住的東西太多了~只好…寫下來才不會忘記,順便看看自己到底在幹嘛XD~長大之後再回來看看笑笑~ 工作 個人
Thumbnail
2020/07/19
Selenium WebDriver Page Object Model (POM) 設計模式,若是有開發過 UI 自動化測試或是寫網路爬蟲的多少都有聽過或是看過吧!  最近剛好有幸接觸到某外商的 SDET 面試考試,題目要求使用 POM 設計 UI 自動化測試,又再度幫自己複習一遍。 Why?
Thumbnail
2020/07/19
Selenium WebDriver Page Object Model (POM) 設計模式,若是有開發過 UI 自動化測試或是寫網路爬蟲的多少都有聽過或是看過吧!  最近剛好有幸接觸到某外商的 SDET 面試考試,題目要求使用 POM 設計 UI 自動化測試,又再度幫自己複習一遍。 Why?
Thumbnail
2020/05/07
幾年前,偶然的在某社群聽見 Robot Framework 這套開源框架,起初抱持著好奇的心情簡單的玩了一下,不過當時完全不理解,用這種 Keyword 方式去撰寫自動化測試的好處在哪? ( 不過就是…我知識不足罷了XD ) 。 接下來,我就可以跑測試拉~! 接著看 log.html:
Thumbnail
2020/05/07
幾年前,偶然的在某社群聽見 Robot Framework 這套開源框架,起初抱持著好奇的心情簡單的玩了一下,不過當時完全不理解,用這種 Keyword 方式去撰寫自動化測試的好處在哪? ( 不過就是…我知識不足罷了XD ) 。 接下來,我就可以跑測試拉~! 接著看 log.html:
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
在Kubernetes cluster上建立Jenkins,並且使用動態方式建立Jenkins Agent。透過K8S解決傳統的Jenkins一對多架構的問題,最終建立基本Pipeline在Jenkins Web UI上,簡單驗證Jenkins engine正常運行。
Thumbnail
在Kubernetes cluster上建立Jenkins,並且使用動態方式建立Jenkins Agent。透過K8S解決傳統的Jenkins一對多架構的問題,最終建立基本Pipeline在Jenkins Web UI上,簡單驗證Jenkins engine正常運行。
Thumbnail
前言 上次我們做了一次使用 Docker、Docker Compose 與 Gitlab CI/CD 做一次自動化佈署上線,今天我們要來再來教一個 Gitlab CI/CD 中的 environment 這個 script 怎麼使用 environment 作用 environment 是可以
Thumbnail
前言 上次我們做了一次使用 Docker、Docker Compose 與 Gitlab CI/CD 做一次自動化佈署上線,今天我們要來再來教一個 Gitlab CI/CD 中的 environment 這個 script 怎麼使用 environment 作用 environment 是可以
Thumbnail
前言 大家好上次講到在使用 Gitlab CI/CD 自動化佈署前,使用 Docker Compose 撰寫佈署計畫書,今天我們要將目標轉移到 Gitlab 我們要撰寫自動化上線佈署計畫書,我們之後還會講一套更完整的佈署流程,今天只是讓各位體驗,自動化佈署上線的快感 調整 CI/CD 變數 首
Thumbnail
前言 大家好上次講到在使用 Gitlab CI/CD 自動化佈署前,使用 Docker Compose 撰寫佈署計畫書,今天我們要將目標轉移到 Gitlab 我們要撰寫自動化上線佈署計畫書,我們之後還會講一套更完整的佈署流程,今天只是讓各位體驗,自動化佈署上線的快感 調整 CI/CD 變數 首
Thumbnail
前言 大家好上次教 Gitlab CI/CD 如何撰寫 CI/CD 腳本,使用 ssh 自動連線目標主機,很受到大家關注,在這裡先跟大家說一聲謝謝,以後會繼續做有意義的文章給各位,今天要教大家如何使用 scp 這個使令,將我們的檔案複製到目標主機,並進行佈署動作,我們之後會使用 Docker Co
Thumbnail
前言 大家好上次教 Gitlab CI/CD 如何撰寫 CI/CD 腳本,使用 ssh 自動連線目標主機,很受到大家關注,在這裡先跟大家說一聲謝謝,以後會繼續做有意義的文章給各位,今天要教大家如何使用 scp 這個使令,將我們的檔案複製到目標主機,並進行佈署動作,我們之後會使用 Docker Co
Thumbnail
上次我們講完了 only 操作方式,接下來我們要來講解 needs 操作方式,讓我們的 CI/CD 更加仔細,更加完整。 needs 作用 needs 可以在我們整個 CI/CD 流程,去定義在哪個工作之前做完,才會去做下一個工作,假設今天有三個工作,分別叫 "test-build"、"buil
Thumbnail
上次我們講完了 only 操作方式,接下來我們要來講解 needs 操作方式,讓我們的 CI/CD 更加仔細,更加完整。 needs 作用 needs 可以在我們整個 CI/CD 流程,去定義在哪個工作之前做完,才會去做下一個工作,假設今天有三個工作,分別叫 "test-build"、"buil
Thumbnail
前言 上次我們簡單的寫了 CI/CD 的工作,這次我們對 Pipeline 與 Job,來多加了解他們的運作,以及我們這些工作是怎麼處發的。 Pipeline 與 Job 首先我們先切到 Build 子清單,可以看到裡面有 Pipeline、Job、Pipeline editor、Pipeli
Thumbnail
前言 上次我們簡單的寫了 CI/CD 的工作,這次我們對 Pipeline 與 Job,來多加了解他們的運作,以及我們這些工作是怎麼處發的。 Pipeline 與 Job 首先我們先切到 Build 子清單,可以看到裡面有 Pipeline、Job、Pipeline editor、Pipeli
Thumbnail
持續集成 (CI) 和持續交付 (CD) 是現代軟體開發的核心原則之一。這些原則可以幫助團隊快速地交付高品質的軟體。在本章中,我們將研究如何在Gin應用中實現CI/CD。
Thumbnail
持續集成 (CI) 和持續交付 (CD) 是現代軟體開發的核心原則之一。這些原則可以幫助團隊快速地交付高品質的軟體。在本章中,我們將研究如何在Gin應用中實現CI/CD。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News