DevOps課程-Configuration Management with Ansible 18

Project: Run Docker applications-Part1

ZONGRU Li
13 min readApr 15, 2022

Ansible 與 Docker

Overview:

  1. 建置EC2機台
  2. 撰寫Ansible Playbook完成以下事項:
  • 安裝Dockerdocker-compose
  • 啟動Docker container運行Application

第一步的部分,相較前面課程使用DigitalOceanDroplet(Ubuntu)來說

AWSEC2使用的Amazon Linux image會有許多建置步驟上的差異

(順便練習yum的指令,有別於Ubuntuaptapt-get)

整體步驟如下:

  • 1.透過Terraformscript來建置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(目標機):

首先目前本機上:

這個就是我目前用作建立主控機的Terraform專案

所以另外COPY一份來做目標機:

然後再VScode的專案空白處右鍵"將資料夾新增到工作區"

完成後看到:

其中講師提醒Terraform建置要注意:

建置有使用到本機的pub key

也就是:

另外針對這個專案,同主控機一樣,不執行"user_data":

另外我這時候注意到,我可能還要調整一個

Target用!
#針對該Terraform專案做初始化:
terraform init

一些目錄又長回來了:

然後var檔內改好我的本機連過去的IP後

#執行Terraform建置指令:
terraform apply -auto-approve

然後我很驚人發現它取代我的舊有的主控機…

所以我才恍然大悟,Terraform與實際機台對應不是依靠剛剛移除的這些目錄:

剛剛移除的圖

為了恢復主控機設定,所以用回主控機的Terraform專案目錄執行apply:

到主控機目錄執行:

最後我才發現我少刪以下這個實際跟機台綁定的檔案:

最後剩下這樣:

用上述這兩樣來建立新的目標機台!!!!

apply過程中看到:

改寫給定不同key名稱:

Tar的是Target目標機

後來針對該專案還有調整成Amozon的機台(用yum的),而不是Ubuntu

所以重建:

在解問題過程問了許多社群,得到兩個關鍵字未來可以利用:

  1. workspace(相關參考)
  2. terragrunt

Ansible設置Inventory檔案連到上述EC2 instance

改寫本機上既有的ansible專案,首先調整hosts:

然後建立新的Playbook — deploy-docker.yaml:

首先開始撰寫安裝dockerPlay(記得這邊就要用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

但是前面安裝python3play就會有蛋生雞

還是雞(python3)生蛋(python2)的問題

好在可以解決這個問題是在安裝python3Play上指定該Playpython2

相當於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來找到更多資訊

LINK

之後執行還會卡到/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機台上完課就會移除,所以還好

參考課程reference

--

--

ZONGRU Li
ZONGRU Li

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

No responses yet