DevOps課程-Configuration Management with Ansible 24
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
嘗試執行發生錯誤
然後在很愚蠢的兩邊防火牆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:
最終完成講師課程的結果:
相關程式碼就放在: