啓迪雲Tuscloud · 程式 ·

運用「Ansible+Docker」高效簡化複雜任務

第十期 啟迪雲解決方案架構師 蔣運龍 譯

Ansible 是一個自動化工具,旨在減輕IT 人員的重複性工作。包括配置管理、應用程式部署和服務內部編排等工作。

Ansible 更像是一個配置管理和應用程式部署系統(同樣它可以在其他很多場景使用),同樣的配置管理工具還有Puppet、SaltStack 和Chef 等。它們通過簡化複雜任務,使開發人員能大幅提高工作效率。

在進入Ansible 的精彩細節之前,讓我們看一下Docker 如何與Ansible 合作。同時在閱讀這篇文章之前,您必須熟悉Docker 及其使用。開發人員喜歡Docker 的主要原因是:Docker 能在作業系統(物理機或者虛擬機)上運行多個隔離的應用程式,從而有助於提高計算密度。而Ansible 模塊附帶的Playbooks,則有助於將應用配置和部署到遠程機器。

Ansible 可幫助您自動化操作容器構建和部署過程。當您使用Ansible 自動化Docker 工具時,您將享受到許多優勢,如可移植性、可審計性、環境的管理等。在詳細介紹Ansible 和Docker 的組合如何在軟體產品管理中取得最佳效果之前,讓我們先來看看 Ansible。

什麼是Ansible?

Ansible 由Michael DeHaan 於2016 年1 月開發。它使用Python 和PowerShell 編寫,並在Linux、Unix 和Windows 作業系統上運行。

正如前面提到的,Ansible 是一個簡單的自動化IT 引擎,專門為複雜部署設計,它是IT 基礎設施的完美解決方案,因為它涉及到如何使系統相互關聯,並且專注於如何一次性管理一個系統。

Ansible 使用一種稱為YAML(Ansible Playbooks)的簡單語言來幫助開發人員描述自動化任務。它通過連接服務節點並將執行過程拆分為一個個稱之為Ansible 模塊的小程序來發揮作用。這些小程序充當資源模型,在任務執行期間部署,並在任務完成後刪除。

這些模塊都保存在一個庫中,它可以獨立運行在任何機器中而不需要額外的依賴,如伺服器或資料庫。你可以使用版本控制系統跟蹤內容的變化。默認情況下,Ansible 使用SSH 密鑰來代替密碼。

作為無代理架構,Ansible 通過提供安全的隧道功能和各種身份驗證方法,通過網絡流量加密使用OpenSSH 和WinRM 進行安全的網絡連接。

OpenSSH 也稱為OpenBSD Secure Shell,基於Secure Shell(SSH)協議。它是一種常見的連接工具,開發人員可以通過SSH 協議進行遠程登錄。

為什麼使用Ansible

虛擬機為進程提供高度隔離,因為它們在自己的作業系統實例中運行。該作業系統也不必與主機上運行的作業系統相同。Windows 虛擬機可以在 Linux 管理程序上運行,反之亦然。

Ansible可以自動化您的網絡、自動化您的應用程式部署。使用Ansible 有兩個主要原因:

  • 在IT 環境中工作需要您反覆執行相同的任務,這可能會導致工作中的無價值的重複性勞動。在使用Ansible 後這個問題可以得到解決。它可以消除工作環境中的複雜性並加速DevOps 的流水線。
  • Ansible 與Puppet,Chef 和SaltStack 等其他自動化工具相比,具有明顯的優勢。Ansible 是無代理的,代表著Ansible沒有運行特定操作所需的守護進程或代理。它通過SSH 協議推送命令自動進行配置。因此代表著在客戶端不需要額外安裝應用或者代理程序。


由於其他工具不是無代理的,因此需要在每台被控節點上單獨安裝每個工具的代理程序。

Ansible優勢


無代理架構

Ansible 這樣的無代理架構在網絡自動化中非常重要。目前許多網絡設備沒有API 接口。而API 在自動化中非常重要,它可以更輕鬆地自動化和管理傳統設備。

與需要防火牆配置的代理管理工具相反,Ansible 通過WinRM 和SSH 以無代理方式工作。所有連接都是通過預先配置的遠程訪問服務執行的,這是一種以非常有效的執行操作方式,並且具有最少量的網絡流量。無代理管理方法通過將所有自動生成的模塊傳輸到遠程計算機,來利用Windows 和SSH 遠程管理功能執行命令。

與基於代理的體系結構相比,無代理的體系結構優勢明顯,因為它更簡單、更安全並且滿足了IT 的需求。它僅在有要執行的工作時才啟動通信。無代理在物聯網中也非常有用,特別是在無法安裝代理程序的領域。

團隊的可復用性

Ansible 使用戶能夠在YAML 語言的幫助下,整個團隊共享自動化的解決方案。無論您屬於哪個IT 組織團隊開發團隊或運維團隊),使用Ansible 後可以使用一種通用語言自動化您的IT 基礎架構甚至DevOps 工具。

統一應用程式和作業系統配置

Ansible通過統一應用軟體和作業系統配置,可以減少過去IT配置更改中曾經發生的人工錯誤。

高度安全可靠

Ansible非常可靠和安全,Ansible使用了OpenSSH,特別是遠程的OpenSSH。由於OpenSSH是使用最廣泛的協議,因此很容易被發現和修復漏洞。

一致性

這是與Ansible 腳本相關的重要概念。一致性已經發展成為軟體開發中不斷使用的詞。當Ansible 執行腳本確認後,不需要任何干預行動,只執行一次操作就能完成相應任務。

極佳的可擴展性

Ansible 提供出色的可擴展性,無論模塊是在本地運行還是遠程運行、是配置OS 參數還是配置應用程式和伺服器。它允許使用日誌記錄回調用於執行,也可以從雲或者其他系統中收集所有的數據,並可以與外部數據存儲集成。

低學習曲線

任何人都可以學習使用Ansible。 Ansible 以其微調簡單而著稱;它的學習曲線較低,因為它使用YAML 語言作為其配置腳本。由於不需要編碼技能,對於那些沒有技術知識基礎的人來說並不困難。

社區成長

由於Ansible 是免費和開源的,這代表著您可以通過Github 和Meetup 等社區公開訪問所有代碼。

Ansible Tower

Ansible 的可用性功能通過Ansible Tower 得到增強,Ansible Tower 是Ansible 的產品,支持多租戶,基於角色的訪問控制或RBAC,Web UI,REST API 等等。

Ansible Tower 是一個非常強大的用戶界面和RESTful API,是Red Hat 公司的企業級商業產品。它有能力管理複雜的多層部署,提高生產力並輕鬆擴展IT 自動化。

Ansible Tower 有一個儀錶板,允許開發人員查看所有庫存詳細信息並調整作業狀態更新。開發人員可以訪問Ansible Tower 的儀錶盤,用於Ansible 環境的內容監控,包括所有最近的工作活動,以及包含日期和時間範圍的屏幕截圖。它允許您詳細和實時地查看每個成功和每個故障。

由於整個過程是自動化的,開發人員可以看到隊列的內容。此外,它可以查看誰正在執行什麼任務,以及記錄所有任務。Tower工作流程非常適合複雜的任務,支持多個工作流程,只需運行一次,或使用不同的憑據運行多次。


Ansible Tower儀錶板

Tower 的另一個主要功能是系統跟蹤。有了這個,開發人員可以審核並驗證所有機器是否相互兼容。它還可以幫助他們跟蹤隨時間變化的機器,比較變化以及如何根據需求配置和部署它們。

Tower 集成了一個非常簡單的門戶模式和手動功能,可以增強各種用戶的自動化任務,並直接從LDAP,Active Directory 等目錄進行同步。

跟蹤庫存是Tower 附加的另一項主要簡單任務。開發人員可以從許多雲伺服器(如Microsoft Azure,Amazon Web 伺服器)收集庫存,並將它們連接到Red Hat Satellite 或Red Hat CloudForms 環境,也可以用於自定義CMDB(配置管理資料庫)等數據存儲庫。

使用Ansible來管理Docker

Ansible 與Docker 的完美結合使您能夠成功實現軟體開發的自動化。除了操作Docker 容器外,您還可以自動完成構建和部署應用程式的過程。

Ansible 為管理基礎架構提供了可靠的框架。它可以遠程處理DevOps 中涉及的SSH 連接和複雜性。當Docker 和Ansible 一起工作時,您可以獲得許多好處:

· 可移植性 - 當Docker 與Ansible Playbook 結合使用時,可確保可移植性。使用純Dockerfile,您必須在Docker 容器中重現該應用程式。但是當使用Ansible Playbook 構建容器時,您可以在任何地方重現環境- 在Docker 中、或您喜歡的任何雲實例。即使是複雜的容器描述也可以輕鬆移植。

· 可組合性 - Docker 發布了一些工具,用於消除容器世界中的複雜性。但是仍然存在一些編排問題。Ansible 有助於解決這個問題。它甚至使複雜的Playbook 看起來很簡單。

· 可審計性 - 由於Ansible 劇本是可審計,可重複,Docker和Ansible的組合可以更好的構建容器,幫助追蹤潛在漏洞和監測代碼。您可以輕鬆跟蹤每個容器的部署人員以及容器的內容。

· 管理現有應用程式的可行性 - 容器管理是Ansible 的標準功能。在使用Ansible之前,管理和自動化現有應用程式是開發人員面臨的挑戰。

· 管理完整環境 - Ansible不僅可以管理容器,還可以管理容器的運行環境的環境。即使對於複雜的生產環境也是如此。

· 容器和非容器的同時構建 - 容器和非容器可以同時構建。這是一個巨大的好處,因為容器化與非容器化的應用經常需要一起被部署,比如容器化的應用程式經常與資料庫、存儲等組件一起部署(它們通常是非容器化運行)。

· Docker 和Ansible的語法幾乎相同 - 雖然Docker 有自己的腳本,Ansible Playbook 使用YAML 文件,但它們幾乎完全相同。兩者都可以做幾乎相同的事情,特別是在管理Docker 組件時。

Ansible管理Docker的模塊介紹

1.docker——用於管理docker容器

docker是用於運行Docker容器生命周期的原生Ansible模塊,它運行所需的條件是:

– python >=2.6

– docker-py >=0.3.0

– the docker server >=0.10.0

2.docker_image——用於管理Docker鏡像

鏡像在創建容器時被獲取,可以將鏡像打tag並push保存鏡像庫中,或者將其存到.tar文件里。

環境要求:

– python >=2.6

– docker-py >=1.7.0

– Docker API >=1.20

3.docker_network——用於管理Docker網絡

通過使用docker_network模塊,可以創建或刪除Docker網絡,將容器連接到網絡,或者創建一個帶有選項的網絡。也可以在斷開所有容器的同時刪除網絡。

這個模塊執行的功能與「docker network」的功能差不多相同。

環境要求:

– python >=2.6

– docker-py >=1.7.0

– The Docker server >=1.9.0

4.docker_service——用於管理Docker服務和容器

對應docker compose的功能,支持compose的版本包括version1和version2,可以打開docker-compose.yml(或.yaml)查看詳細信息。

環境要求:

– python >=2.6

– docker-compose >=1.7.0

– Docker API >=1.20

– PyYAML >=3.11

5.docker_login

對於docker的login功能,登陸鏡像倉庫。

使用Ansible和Docker進行持續部署

Docker 和Ansible 協同工作,提供持續交付和持續部署。由於Ansible 適用於多節點軟體部署,配置管理和臨時任務執行,因此被廣泛用於軟體開發。Ansible 中的模塊使用JSON,而您可以使用任何程式語言進行標準輸出。

以下是使用Ansible 時要考慮的5 個主要角色,如 bdd.yml 中所述:

- hosts: all

remote_user: vagrant

sudo: yes

roles:

- etcd

- confd

- docker

- nginx

- bdd

這是前四個角色etcd, confd, docker 和nginx ,他們確保藍綠色的部署工具都存在。以下是解釋Docker 角色的方法:

- name: Docker is present

apt: name=docker.io state=present

tags: [docker]

- name: Python-pip is present

apt: name=python-pip state=present

tags: [docker]

- name: Docker-py is present

pip: name=docker-py version=0.4.0 state=present

tags: [docker]

Ansible的Docker模塊對於管理容器非常重要。它可以通過apt-get,Python pip 和Docker-py的方式安裝。通過查看上面的代碼片段,您可以看到使用Ansible 非常容易。與Puppet 和Chef 相比,它提供了許多優勢。

安裝工具之後,接下來將執行Ansible rolebdd。在此步驟中,您將執行部署(遵循藍綠部署方式)。測試對於確保正確完成部署非常重要。執行以下操作以確保應用程式的正確部署。

• 獲取最新版本的應用程式容器

• 與新應用程式容器並行運行舊應用程式

• 運行部署後測試

• 通知etcd 新版本(埠,名稱等)

• 將nginx 配置轉換為指向新版本

• 最後,停止舊版本

確保先前的容器已通過單元和功能測試非常重要,因為您與舊版本並行運行新版本。

以下是rolebdd 的示範:

- name: TOML is present

copy:

src=bdd.toml

dest=/etc/confd/conf.d/bdd.toml

tags: [bdd]

- name: Config template is present

copy:

src=bdd.conf.tmpl

dest=/etc/confd/templates/bdd.conf.tmpl

tags: [bdd]

- name: Deployment script is present

copy:

src=deploy-bdd.sh

dest=/usr/local/bin/deploy-bdd.sh

mode="0755"

tags: [bdd]

- name: Deployment is run

shell: deploy-bdd.sh

tags: [bdd]

這裡有3 個任務:

  • 在第一個任務中,出現了模板資源bdd.toml。confd用於描述模板、路徑和要執行的命令。
  • 在第二個任務中,確保存在confd模板(bdd.conf.tmpl)。confd模板與bdd.toml將在部署期間指定新版本。
  • 在第三個任務中,確認部署腳本部署deploy-bdd.sh是可用的,然後開始運行。此實例還確定了部署後應用的顏色。根據您的偏好,它可以是藍色或綠色進行部署。


BLUE_PORT=9001

GREEN_PORT=9002

CURRENT_COLOR=$(etcdctl get /bdd/color)

if [ "$CURRENT_COLOR" = "" ]; then

CURRENT_COLOR="green"

fi

if [ "$CURRENT_COLOR" = "blue" ]; then

PORT=$GREEN_PORT

COLOR="green"

else

PORT=$BLUE_PORT

COLOR="blue"

fi

在此之後,停止並刪除任何現有容器。但是,當前版本將繼續運行。

docker stop bdd-$COLOR

docker rm bdd-$COLOR

接下來,啟動帶有新版本的容器並與現有容器並排運行。這裡部署了 BDD Assistant 容器 vfarcic / bdd。

docker pull vfarcic/bdd

docker run -d --name bdd-$COLOR -p $PORT:9000 vfarcic/bdd

為了確保部署的應用程式按預期工作,運行集成和壓力測試非常重要。最後Ansible將對容器上的應用進行單元測試和功能測試。

使用PhantomJS 運行一組BDD 方案

docker pull vfarcic/bdd-runner-phantomjs

docker run -t --rm --name bdd-runner-phantomjs vfarcic/bdd-runner-phantomjs

--story_path

data/stories/tcbdd/stories/storyEditorForm.story

--composites_path

/opt/bdd/composites/TcBddComposites.groovy

-P url=http://172.17.42.1:$PORT -P

widthHeight=1024,768

在所有測試通過後,使用etcd運行confd以存儲有關新版本的信息來更新nginx配置。到此,nginx處理舊版本的所有請求,用戶將被重定向到此部署的新版本。

etcdctl set /bdd/color $COLOR

etcdctl set /bdd/port $PORT

etcdctl set /bdd/$COLOR/port $PORT

etcdctl set /bdd/$COLOR/status running

confd -onetime -backend etcd -node 127.0.0.1:4001

Docker和Ansible實操

首先,您可以創建一個Vagrant 文件,該文件包含一個Ubuntu 虛擬機。接下來運行Ansible playbook。這將自動安裝和配置所需的一切。

請確保您安裝了Git,Vagrant,VirtualBox。

git clone https://github.com/vfarcic/provisioning.git

cd provisioning/ansible

vagrant up

如果您是第一次這樣做,因為所有組件都必須先下載,可能需要幾分鐘。運行以下命令開始部署。

vagrant provision

接下來,您可以通過SSH 連接到VM,然後版本從藍色(埠9001)更改為綠色(埠9002)。

vagrantssh

sudodockerps

此時,您可以在瀏覽器中鍵入 http:// localhost:8000 / 來訪問部署的版本。

總結

將Docker與Ansible結合,會簡化部署工作。在傳統IT環境中安裝如JDK、web伺服器等,要確保配置文件被正確配置,Docker正常工作。另一方面,通過容器也簡化了Ansible的操作,一旦所有組件都已ready,就可以朝著容器化開幹了。許多企業目前都在將Ansible和Docker放在一起工作,並收穫頗豐。而Ansible和Docker剛好語法也很相近,熟悉docker的基礎上也較容易上手Ansible。

聲明:文章觀點僅代表作者本人,PTTZH僅提供信息發布平台存儲空間服務。
喔!快樂的時光竟然這麼快就過⋯