17

我不熟悉配置管理和部署工具。我必須實施一個持續交付/持續部署工具,用於我曾經投入的最有趣的項目之一。Docker和Ansible如何配合實現Continuos Delivery/Continuous Deployment

首先,我個人很喜歡AWS,我知道Ansible是什麼,它背後的邏輯及其目的。我對Docker的理解水平並不相同,但我明白了。我經歷了很多互聯網資源,但我無法得到大局。

我一直在努力的是他們是如何融合在一起的。使用Ansible,我可以將我的基礎架構作爲代碼進行管理;構建EC2實例,安裝軟件包......我甚至可以通過拉取代碼,修改配置文件並啓動Web服務器來部署完整的應用程序。 Docker本身就是一個打包應用程序的工具,並確保它可以在您部署它的任何位置運行。

我的問題是:

如何泊塢(或Ansible和碼頭工人)延長持續集成過程!?

假設我們有一個源代碼庫,團隊成員完成了一個功能的工作,他們推動他們的工作。詹金斯檢測到這一點,運行所有的驗收/單元/集成測試套件,如果他們都通過了,它會將其聲明爲穩定版本。 Docker如何適合這裏?我的意思是,當團隊推動他們的工作時,Jenkins是否必須將應用程序中編碼的Docker文件源編譯,構建應用程序的映像,啓動容器並運行所有測試,或者按照經典方式運行測試一切都很好,那麼它會從Docker文件構建Docker鏡像並將其保存在一個私人位置? Jenkins應該用x.y.z標記最終圖像!

Docker容器配置:

假設我們通過Jenkins內置圖像存儲的地方,如何處理部署相同的圖像到不同的環境,甚至,不同的配置參數(虛擬主機配置,DB主機,隊列URLs,S3端點等)在不破壞Docker原則的情況下,處理這個問題的最靈活方法是什麼?這些配置是否在構建時或者基於它的容器開始時支持在映像中,如果是,它們是如何被注入的?

Ansible和泊塢

Ansible提供Docker模塊來管理Docker容器。假設我解決了上面提到的問題,當我想部署一個新版本的x.t.z我的應用程序時,我告訴Ansible從存儲它的位置拉取該映像,啓動應用程序容器,以便如何注入配置設置! Ansible是否必須在運行之前登錄Docker鏡像(這聽起來令人覺得很瘋狂),並且以與經典主機相同的方式使用它的Jinja2模板!如果不是,這是如何處理的?!

對不起,如果這是一個很長的問題,或者我拼錯了一些東西,但這是我的想法大聲。我在過去兩週內被封鎖,無法找出正確的工作流程。我希望這是未來讀者的參考。

請閱讀您的經驗和解決方案非常有幫助,因爲這看起來像一個常見的工作流程。 預先感謝您。任何幫助深表感謝。

+1

Ansible + Docker ==魔法!這裏有一篇很棒的博客文章:https://developer.rackspace.com/blog/ansible-and-docker/,另外還有一個專門討論Ansible + Docker的小節http://www.ansiblefordevops.com/ – Homer6

回答

5

我想在部分

回答如何泊塢(或Ansible和碼頭工人)延長持續集成過程!?

由於碼頭圖像處處相同,因此您使用泊塢窗圖像就好像它們是生產圖像一樣。因此,當有人提交了代碼時,您可以構建您的泊塢窗圖像。你對它進行測試。當所有測試通過時,都會相應地標記該圖像。由於碼頭速度很快,這是一個可行的工作流程。 碼頭更改也是增量式的;因此,您的圖像對存儲影響最小。此外,當您的測試失敗時,您也可以選擇保存該圖像。通過這種方式,開發人員將拉取該圖像並輕鬆調查您的測試失敗的原因。開發人員也可能選擇在他們的機器上運行測試,因爲詹金斯和他們的機器中的碼頭圖像沒有區別。

這是什麼帶來了所有開發人員將有相同的環境,相同版本的所有軟件,因爲你決定哪一個將在碼頭圖像中使用。我遇到了由於開發人員機器之間的差異而導致的錯誤。例如,在相同的操作系統中,unicode設置可能會影響您的代碼。但是在docker映像中,所有開發人員都將測試相同的設置,相同版本的軟件。

Docker容器配置:

如果您使用的是專用庫,你應該使用一個,那麼配置更改不會影響硬盤空間很大。因此,除安全性配置(如db密碼)外,可以將配置更改應用於泊塢窗圖像(Baking the Configuration into the Container)。然後,您可以使用ansible在啓動之前/之後使用環境變量或Docker卷將未存儲的配置應用於已部署的映像。

https://dantehranian.wordpress.com/2015/03/25/how-should-i-get-application-configuration-into-my-docker-containers/

確實Ansible必須登錄泊塢窗圖像中,它的運行之前( 這聽起來很瘋狂的我)並使用其模板的Jinja2以同樣的方式 採用了經典的主機!?如果不是,這是如何處理的?!

不,可以登錄Docker鏡像,但可以使用Jinja2模板來更改dockerfile。您可以使用模板更改dockerfile,並可以將您的配置注入到不同的文件中。相應地標記文件,並將圖像配置爲旋轉起來。

+0

我只是沒有得到Ansible在哪裏適合??!編排的事情?! –

1

雖然不是一個完整的解決方案,但我有兩個問題的建議。雖然它們可能並不完美,但這些是我們在工作流程中使用的做法,並且迄今已證明自己。

  1. 定義不同的環境 - 假設你寫的每次啓動環境不同Ansible作用,我們定義了一個環境變量設置,我們希望容器屬於環境。然後,我們使用之前設置的env變量,將一個合適的配置文件從S3存儲桶下載到容器中(如果您提供AWS creds或爲您的服務器提供IAM角色,這應該是可能的),並在構建代碼時將這些參數注入代碼中。

  2. Ansible不需要登錄泊塢窗應用程序,但解決方案有點棘手。我嘗試了兩種解決這個問題的方法,但都不理想。第一個是將配置文件作爲docker image命令行的一部分下載,並在容器啓動時構建應用程序。雖然這個解決方案有效 - 它違反了Docker的理念,並使圖像極易出現錯誤。 另一個解決方案是將幾張圖像推送到您的碼頭中心倉庫,然後根據當前的環境提取適當的圖像。

在更廣泛的行程,我已經試過完全啓動我們的應用程序與Ansible,這是地獄,很多配置步驟是棘手的,並得到棘手,當你試圖實現他們的劇本。當我轉向使用Ansible單獨維護服務器時,使用Docker部署應用程序本身變得更容易。

+0

當你開始時將Docker視爲應用程序封裝技術會更好。這有助於解釋爲什麼Ansible能很好地補充它。在最簡單的情況下需要安裝Docker並啓動容器。最後,我建議查看一些支持Docker應用程序直接部署的新興技術:Docker Swarm,Kubernetes和Marathon/Mesos。與Ansible相比,確實更復雜,但還有其他值得探索的美德。 –

4

關於您使用同一個Docker鏡像處理多個環境配置的問題,我一直在計劃使用Consul之類的服務發現工具作爲集中式配置/屬性管理工具。因此,當你啓動你的容器時,你設置一個ENV變量,告訴它它是什麼應用程序(appID),以及它應該使用什麼樣的環境配置(例如:MyApplication:Dev),並且它將在啓動時從Consul中取出它的配置。我仍然需要調查Consul周圍的安全性(就像我們在那裏存儲數據庫連接憑證,例如,我們如何限制誰可以查詢/更新這些值)。我不想只用這個容器,但一般來說所有的應用程序。另一個很酷的功能是更改Consul中的配置值,並將鉤子放回到您的應用中以立即應用這些更改(也許就像應用上的REST端點一樣,將更改推送到動態應用它)。當然你的應用必須寫成支持這個!

你可能會想看看Martin Fowler的關於immutable infrastructurePhoenix servers的博客文章。