注意:這篇並不是在說明ansible執行docker-compose.yml這件事,而是指ansible裡docker_compose的使用記錄
最近一樣是繼續踩坑填坑無限LOOP,好處是踩的越多,知道的也就越多,能融會貫通的地方也就更多 (公三小)
首先,這篇不是在說用ansible執行docker-compose.yml(不管是yml還是yaml),而是使用docker_compose
這個module
,因為我用的是Centos 7
,所以這坑的深度雖然沒這麼深,但他就跟滿地坑一樣,你不會只踩到一次,如果他是地雷,我大概已經死無全屍了連環爆看過嗎
曾經一度查到懷疑人生,懷疑是不是自己根本就誤會了
回到正題
第一個要注意的是,使用ansible內docker和docker_compose這兩個module的時候,要安裝的東西不是yum install
的docker
,而是pip install docker docker-compose
(然後就會踩到一連串的坑,如果你也用Centos7)
>會這樣做的原因只是為了讓ansible可以接到CI/CD的變數,所以直接使用內建的module,才會接到外部進來的變數
接下來當你改成
- name: pip install docker docker-compose
pip:
- docker
- docker-compose
state: latest
就會跟你說,不好意思不給你裝喔
會直接跟你說無法安裝,因為沒有pip
很好,沒有pip那就直接裝python2-pip
(直接中第二次陷井),開始懷疑自己曾經是不是這樣亂裝了,關於這邊不用python3的原因後面再說
- name: yum install python-pip
become: yes
yum:
name:
- python-setuptools
- python2-pip
state: present
執行到這直接也跟你說不給裝,後來去爬文是少了兩個套件,直接加上去吧,原來一開始就沒有gcc
…
- name: yum install python-pip
become: yes
yum:
name:
- gcc
- python-devel
- python-setuptools
- python2-pip
state: present
接著這邊,我一開始是用python3的方式然後到這踩到下面的坑後,這坑就像地雷一路把我炸回去;在執行docker_compose的時候,他會要求用pip裡的套件,所以前面沒灌就沒救了,而這時候我是先後灌了docker
和docker-py
,以經驗上來說應該沒什麼太大的問題,所以當我灌好docker-compose
後,他就跟我說,docker
和docker-py
請挑一個使用很難伺候,好啊,所以我直接進server砍掉docker-py
(官方文件比較推docker),先說這邊為啥會裝這兩個,因為我看了github上的討論(docker_compose的問題真的很大),砍完後繼續試,又噴錯,直接跟你說要用docker or docker-py
…(公三小),最後去找官方文件說,如果你兩個都裝了請移除一個,然後移除完後,記得重裝另一個。
因為是用腳本跑,所以記得在pip
裡加上state: latest
,他就會重跑了。
以為沒事了嗎?接著我想把templates
加進去,省得一些設定的東西我得每個server都一份,然後又出事了;使用python3的時候會噴權限問題,但問題是我已經把資料夾的權限改好了你他○的是有三小問題,他上面會顯示
"msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!
然後你跟著裝就完了,這個是在使用python3才會遇到的問題,你會想說那我就直接安裝就好啦,抱歉,python3無法使用yum
跑腳本,所以請你改成dnf
,然後你改成dnf
後他就會跟你說無法使用dnf
(無限公三小),接著我想說先用python2
裝好這完意行不行;抱歉,一樣不行。最後我是找到開發人員在github上的回覆,有想了解的可以點下面的連結過去。
大致上的意思是說這個是Centos7
底層的問題,不可能也無法改成python3
,建議最好的做法是直接改ansible
的設定檔,或是在執行腳本的時候加上ansible_python_interpreter: "/usr/bin/python"
即可,然後就沒有然後了。
其實上面這些經驗就解掉docker_compose
的問題,接下來的是使用docker_container
如果要掛進docker_compose
起好的network
時,記得在networks裡加上aliases
,才會掛載成功,這個參數是要讓同一個networks
的別的容器可以使用這個名稱呼叫到該容器,我也覺得很怪,但是加上後就成功啟動了。
後記
其實最近踩坑踩的有點累,但是經驗上來說還是賺飽飽,有空的話我再寫一篇用ansible安裝php7遇到的問題;至於為什麼堅持要用腳本跑完整套流程,沒什麼特別的,就只是因為我懶,我希望可以在固定的環境下,我直接下指令讓他跑完整包腳本就可以交差,何樂不為?以前光是LAMP或LNMP裝起來都是一小時上下,有時候插個單起來直接兩小時起跳,直接用腳本跑,被插單就插單,我還不用煩惱等等回神還要找我做到哪,多好?
Ansible dnf python3 is not working with Centos 7