DevOps課程-Configuration Management with Ansible 24

Project: Run Ansible from Jenkins Pipeline — Part 2

ZONGRU Li
8 min readOct 23, 2023

Jenkinsfile: Copy Files from Jenkins to Ansible Server

目前架構大概是像這樣(直接用課程圖):

首先先拿到課程中的Java搭配Jenkinsfile的專案:

其內容有很多其實是寫好的,我先還原成空白的狀態,照著課程編寫

開頭除了Java程式外,另外有Jenkinsfile內容初始如下開始編輯:

而Ansible腳本部分則會需要三個檔案

Playbook本身,deploy-docker-new-user.yaml的內容

這邊不用hosts檔,而是inventory檔案-->inventory_aws_ec2.yaml

Ansible的設定檔

過程中會透過Jenkins PIPELINE將Ansible腳本拋給Ansible主控機台

所以在程式專案(有Jenkinsfile)內額外建立ansible資料夾

把上述三個Ansible相關檔案放進去程式專案內:

改寫deploy-docker-new-user.yaml改名成my-playbook.yaml

擷取原檔留下到安裝Py與docker與docker-compose的Play

在執行過程中,就是要透過Jenkins Server轉交上述Ansible三個相關檔案

到Ansible主控機上,然後Jenkins遠端驅動Ansible主控機台執行Ansible腳本

另外要注意到的是Ansible連線EC2使用的pem檔案,也要一併拋過去:

Jenkins執行過程要轉移檔案到Ansible主控機,會需要SSH的scp功能

這個可以在Jenkins機台上面安裝SSH Agent的Plugin:

接著要在Jenkins上面建立連線到Ansible主控機的憑證(也就是私鑰)

這邊使用的就是我個人電腦的~/.ssh/id_rsa

另外講師提到,比較新的openssh產出的key,如果開頭長下面這樣:

上面這種Jenkins不認得這樣的格式

用這樣的key去連Digitial Ocean的Ansible機台

很可能會見到非法的key格式等錯誤

解決辦法是轉換格式

#執行以下來轉換格式(如果有必要的話),後面P是舊密碼,N是新密碼,可以如下空白:
ssh-keygen -p -f .ssh/id_rsa -m pem -P "" -N ""

最後如果完成會,內容開頭會變成:

我看到我目前私鑰格式應該是可以正常使用,不需要執行上述指令

直接到Jenkins Web上建立ansible-server-key這個憑證:

另一個Jenkins上要使用的憑證是EC2兩台主機被連線要使用的pem檔

也就是前一篇PART 1筆記最後產出的ansible-jenkins.pem

接著實際撰寫第一個Stage的Jenkinsfile內容:

目前專案長這樣:

先推上ansible repository去,branch叫做:feature/ansible

然後嘗試執行目前的jenkinsfile內容

Create Jenkins PIPELINE

嘗試執行發生錯誤

然後多了K

然後在很愚蠢的兩邊防火牆22也沒開這件事調整後,看到

實際連線到Digital Ocean上的Ansible主控機看到:

確實檔案都傳到Ansible主控機台上了

然後點到該次執行的相關頁面去會看到警告:

這主要是因為我們透過指令方式暴露了重要的keyfile資訊

也就是這行

真的會暴露隱私資訊到scp傳遞的指令上

所以特別改變寫法:

調整為上述寫法後,就可以避免groovy在執行過程中暴露隱私資訊

一樣commit到Git Server中,再次執行

Jenkinsfile: Execute Ansible Playbook from Jenkins

所以接著寫下一段stage

過程中會需要驅動遠端的Ansible主控機去操作EC2機台

會需要另一個Plugin叫:SSH Pipeline Steps

裝完後可以去查看連結的文件:

例如參考以下寫法

撰寫第二段stage內容如下:

將上述PIPELINE commit到git上面後再次執行:

然後確實看到結果:

以上只是確認在遠端執行指令正常,接著就把ls指令改成執行ansible腳本

再次commit push後執行

首先確認到Ansible主控機上有py3:

#在Ansible主控機home目錄執行確認EC2機台指令:
ansible-inventory -i inventory_aws_ec2.yaml --graph

我最後發現連不上的那台是我stop的機台,前面課程用的Terraform發動機

所以乾脆移除

不過也暴露一點是,目前寫法是針對該region所有機台執行Ansible腳本動作

而實際指定的特定tag機台等方式前面也有教了

移除不必要的機台後後再次執行

參考(LINK)

這邊也再次印證,即便是一樣的雲端,一樣的Region

VM差一個型號,Ansible腳本可能就不能用

所以這邊先仿照前面Terraform建置Ansible被控機使用的VM來建立

先移除前面網頁自建的兩台

重新從網頁上建置,但是選到特定型號

重建AMI ID為:ami-0a3d21ec6281df8cb

後面就一樣建兩台

建立完成後再次執行Jenkins Job:

細節log:

最終完成講師課程的結果:

相關程式碼就放在:

參考課程reference

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet