DevOps課程-Configuration Management with Ansible 18
Ansible 與 Docker
Overview:
- 建置EC2機台
- 撰寫Ansible Playbook完成以下事項:
- 安裝Docker及docker-compose
- 啟動Docker container運行Application
第一步的部分,相較前面課程使用DigitalOcean的Droplet(Ubuntu)來說
AWS的EC2使用的Amazon Linux image會有許多建置步驟上的差異
(順便練習yum的指令,有別於Ubuntu的apt或apt-get)
整體步驟如下:
- 1.透過Terraform的script來建置EC2機台
- 2.用Ansible設置Inventory檔案連到上述EC2 instance
- 3.安裝Docker & docker-compose
- 4.複製docker-compose file到該EC2 instance
- 5.啟動Docker container
但是由於我本機是windows不太方便用Ansible
所以我仍會維持Ansible主控機仍是遠端EC2
加上作業的目標機EC2
所以我最終會有兩台EC2 instance(沿用舊的主控機+新的目標機)
建置AWS EC2 Instance(目標機):
首先目前本機上:
所以另外COPY一份來做目標機:
然後再VScode的專案空白處右鍵"將資料夾新增到工作區"
完成後看到:
其中講師提醒Terraform建置要注意:
也就是:
另外針對這個專案,同主控機一樣,不執行"user_data":
另外我這時候注意到,我可能還要調整一個
#針對該Terraform專案做初始化:
terraform init
一些目錄又長回來了:
然後var檔內改好我的本機連過去的IP後
#執行Terraform建置指令:
terraform apply -auto-approve
然後我很驚人發現它取代我的舊有的主控機…
所以我才恍然大悟,Terraform與實際機台對應不是依靠剛剛移除的這些目錄:
為了恢復主控機設定,所以用回主控機的Terraform專案目錄執行apply:
到主控機目錄執行:
最後我才發現我少刪以下這個實際跟機台綁定的檔案:
最後剩下這樣:
用上述這兩樣來建立新的目標機台!!!!
apply過程中看到:
改寫給定不同key名稱:
有Tar的是Target目標機
後來針對該專案還有調整成Amozon的機台(用yum的),而不是Ubuntu
所以重建:
在解問題過程問了許多社群,得到兩個關鍵字未來可以利用:
- workspace(相關參考)
- terragrunt
用Ansible設置Inventory檔案連到上述EC2 instance
改寫本機上既有的ansible專案,首先調整hosts:
然後建立新的Playbook — deploy-docker.yaml:
首先開始撰寫安裝docker的Play(記得這邊就要用yum,而不是apt):
甚至與前面Nexus的建置不同的是
我們目前進去機台的角色不是root
但是像安裝docker應該用root帳號來做(因為觸及daemon)
這方面可以參考Ansible官網的yum模組
如上完成後可以先試著執行,將該檔案轉給主控機執行
#執行指令:
ansible-playbook deploy-docker.yaml
然後我才發現我的hosts要用底線:
改成:
然後hosts檔我也忘了拋給主控機...
最後還是..
這邊是因為我ansible.cfg上一篇更新也沒拋給主控機...
自然吃不到hosts檔,另外我還想到現在都是在同樣PVC
所以我該給的IP位置應當是內網的IP位置,所以又調整了hosts檔內的IP
最後看起來有吃到hosts檔:
但是不認內網IP,所以調整回外往IP看看:
看起來是需要另外設定防火牆了,所以直接調整該Terraform專案!
新增主控機的IP可以連到目標機:
做terraform變更:
之後主控機再執行Ansible到目標機:
其中看到粉紅色的字指的是目標機上用的python是2版
實際也可以聯到該機台確認:
所以為了解決這個問題,讓Ansible也來順便協助做python3的安裝
這邊講師是演練python3沒裝的狀況:
但是就算真的沒裝python3
再執行這段後,我們仍要告訴機台要使用到python3才行
這時候就要改造ansible.cfg檔
但是前面安裝python3的play就會有蛋生雞
還是雞(python3)生蛋(python2)的問題
好在可以解決這個問題是在安裝python3的Play上指定該Play用python2
相當於ansible.cfg上的interpreter_python設置設定在Play階層!
不過剛剛其實已經發現目標機上面有python3了
但是我想試著執行看看
看看state: present的效果,看會不會重複安裝的問題
但是講師又大大的提醒了一件事,yum只有支援python2
所以理論上剛剛的docker安裝的yum也必須要指定為python2才行
但是講師也故意先不設定安裝docker的步驟為指定python3
我執行看到:
看起來應該是Ansible幫我比對目標機有沒有裝,有裝就略過ok才對
但是講師畫面會看到紅字
所以她有在docker安裝步驟特地又加上yum使用python2
這樣看起來我現在用的yum是有改版過的,python3也可以
所以講師那邊最後合併兩個Play,方便都指定用python2
講師畫面:
我這邊就正常就不異動,紀錄如下
我自己當前code長這樣:
deploy-docker.yaml:
ansible.cfg:
hosts檔:
2023/10/11續寫,調整機台IP與key等
重建以下TF主控機專案:
參考前面重新在這機台上安裝Ansible工具(參考Ansible筆記2):
#依序執行:
sudo add-apt-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt-get install ansible
過程畫面不再重複貼
同樣重建被控機:
在主控機上面重建上述檔案(調整IP等設定):
然後直接在主控機寫入ssh連線金鑰檔並嘗試連線到被控機台:
看起來沒問題,就可以嘗試後面課程
這邊依照課程改造合併py3跟docker的安裝到同一個play中
#執行:
ansible-playbook deploy-docker.yaml
執行成功:
連到被控機確認真的有docker被安裝了:
Write 2nd Play Install docker-compose
這邊將繼續撰寫新的play來安裝docker-compose
但是直接執行會發現無法安裝:
所以會參考到我前面還沒完成到的TF CICD的腳本
實際在機台上執行會看到:
然後在Ansible腳本中就無法直接使用
所以前一個直接改寫為上面看到的Linux
後一個引用到"Lookup Plugins"
這是Ansible額外擴充使用jinja2 templating語言的Plugin
作用是讓Ansible可以取得外部data
變成以下Function格式:
可以查找Ansible jinja2 template來找到更多資訊
之後執行還會卡到/usr/local/bin目錄需要root才能使用,所以進一步調整:
此時deploy-docker.yaml:
#主控機上執行:
ansible-playbook deploy-docker.yaml
到被控機上檢查:
但是比對Nana的entry-script.sh腳本,我們尚未啟動docker
在被控機上驗證嘗試docker pull隨便一個image:
Write 3rd Play Start docker daemon
直接寫
#主控機上執行:
ansible-playbook deploy-docker.yaml
此時到被控機執行pull命令還是會看到錯誤:
因為此時還只有root有權限執行pull,所以加入sudo就可以了
或是腳本添加ec2-user到docker group去
Write 4th Play Add ec2-user to docker group
當前被控機ec2-user所在群組只有以下:
所以要寫Play,並且append額外docker群組到後面去
這邊Nana直接在被控機上執行腳本上新增群組的命令會發現沒用:
後來Nana重登才能看到真的有新增:
到時候這個Play一樣會有相同問題
為了驗證這個問題,後面加了一個測試用的Play
這邊Nana有先手動移除group
#移除groups(要重登才能生效):
sudo gpasswd -d ec2-user docker
#重登後確認:
groups
#主控機上執行:
ansible-playbook deploy-docker.yaml
看到錯誤:
為了這類需要重新連線才能生效的問題,Ansible有特殊解法
中間加入這個任務task:
#主控機上執行:
ansible-playbook deploy-docker.yaml
結果正常!!
Refactor the Playbook
例如調整每個Play的描述,或是將安裝啟動合併到一個Play中
deploy-docker.yaml變成:
其他
ansible.cfg:
hosts:
這些IP機台上完課就會移除,所以還好