DevOps課程-Configuration Management with Ansible 19

Project: Run Docker applications — Part 2

ZONGRU Li
9 min readOct 12, 2023

Use “community.docker” Ansible Collection

前一篇最後有寫到一個測試docker pull是透過command module

並且一般會使用command或shell兩個module只在真的沒有專屬module才用

因為這兩個沒有state的管理(i.e.會一直執行)

但實際上docker有專屬的module可以使用

查找會看到一堆:

實際要找的會是"docker_image"

找到的module名稱組成如下:

其中範例更是會使用這樣完整名稱(FQDN):

但是在ansible.builtin底下的就不用

這邊Nana做一個示範針對舊版Ansible只用module name執行時候

Ansible是怎麼轉化成FQDN的:

#Nana執行另一個腳本,加上-vv:
ansible-playbook deploy-docker-new-user.yaml -vv

會看到底下:

如上看到Ansible自動解析成FQDN名稱

但是我們應當還是要自行寫成FQDN

以免被轉成我們不想要的namespace或collection

因為module name很可能會有重複的

尤其是針對Ansible 2.10之後一定要寫成FQDN

Pull Docker Image

這邊就改寫為如下:

但是執行上會錯誤(講師畫面):

因為在使用這個module的時候會要求事先被控機要安裝python 針對docker的套件(不論py2或py3):

放大講師的錯誤訊息看到:

所以回到腳本最上面安裝的Play中

#主控機上執行:
ansible-playbook deploy-docker.yaml

我這邊執行後還是有錯:

這邊有確認到主控機上py3版本是:

重要的被控機:

看起來有符合錯誤提示的要求

但是錯誤提示到還有urllib3套件問題(我找到這篇)

所以嘗試安裝該套件:

執行就正常了:

另外講師有提到在DigitalOcean上的Linux不需要裝pip的docker套件

DigitalOcean上的Linux預設就有

Write 5th Play Start docker Containers

移除前面的Pull redis的Play

然後嘗試將其他課程完成的docker-compos.yaml檔案

可以在課程的這裡找到公開的git連結找到這份檔案:

裡面有一個私有image,及兩個公開image是在講師的docker hub的庫裡面

內容長這樣:

複製一份到ansible執行目錄,然後撰寫Play來傳遞到被控機台後執行!!

原本Test移除改成如下:

但是這邊要能夠取得講師的私有image:

可以自行去查看,會發現看不到的

所以過程會有要憑證登入才能取得該image的問題

就像直接在被控機上執行pull指令也會遇到:

講師畫面

所以要使用到可以登入docker hub的modul

實際登入的會是URL:https://index.docker.io/v1

另外密碼會是用變數形式,並且用prompt方式提供(執行的時候輸入)

因為我是跳著上課,並沒有這個image在我的docker hub裡

以下就擷取講師畫面

初步寫成如下:

講師畫面會是這樣,要輸入密碼:

講師畫面

最終就是成功執行:

並且被控機EC2上就可以正常pull該image,因為已經有對應的docker憑證檔

講師畫面

另一種寫法就是塞到變數檔(例如檔案名稱叫project-vars)去

腳本改成這樣即可執行:

接著動作就是執行被控機啟動docker-compose啟動指令

#類似直接執行,但是要改用Ansible腳本Play實現:
docker-compose -docker-compose.yaml up

最終變成:

最後講師還是遇到被控機pip的docker-compose套件問題:

所以前面pip只安裝docker還不夠,再加安裝docker-compose

最終講師成功畫面看到:

到被控機台上面看到:

Execute Playbook on new server

講師也是用tf直接移除被控機,然後立刻apply後建立新機台

然後用新機台IP給Ansible去設置

調整hosts檔案內的docker_server對應的IP

這時候重複執行以上Ansible腳本會有最後一個錯誤要修正

會出現再執行到全新的被控機的時候

這邊問題在於:

所以簡單修正就是蒐集資訊的步驟跳過:

執行後:

看到正常:

講師畫面

到新機台也確實能看到:

Make the Playbook more generic

這邊帶入一個重要概念是:

盡可能地讓Playbook可以重複使用

(Try to make the Playbook as re-usable as possible!)

為了讓目前這份Playbook可以更廣泛地處理問題

會做一部分調整(不再針對ec2-user,而是創建新的User)

所以先調整該份YAML檔名從

deploy-docker.yaml -->deploy-docker-ec2-user.yaml

然後並複製一份叫deploy-docker-new-user.yaml

調整deploy-docker-new-user.yaml裡面使用到ec2-user改成創建新user

原本這段移除:

變成:

後面每一步都變成使用上述這個user

甚至建立user並且設定groups部分改為變數提供:

所以當前課程必要的Ansible檔案內容如下:

ansible.cfg:

deploy-docker-ec2-user.yaml:

deploy-docker-new-user.yaml:

docker-compose-full.yaml:

hosts:

project-vars:

#然後執行以下動作創建新的local branch儲存到Github ansible這個Repo去:
git checkout -b RunDockerApplications
git add .
git commit -m "RunDockerApplications"
git push -u origin RunDockerApplications
(然後敲帳號跟token)

參考課程reference

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

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

No responses yet