如何使用Ansible部署容器?
譯文【51CTO.com快譯】容器不可逃避,因為它們繼續在企業IT部署中唱主角。你可以將它們部署為應用程序和服務等。此外,部署容器的方法與部署它們的原因一樣迥然不同:
•Docker
•Kubernetes
•Rancher
•Solaris Containers
•Rocket
•MicroK8s
•Tectonic
不一而足。但是你是否知道還有另一種部署容器的方法,這種方法可能讓遠程管理員想試一試?這種方法就是通過Red Hat的開源自動化工具Ansible。
簡單介紹一下,Ansible是一種在Linux上運行的開源軟件供應、配置管理和應用程序部署工具。Ansible含有自己的聲明性語言,使用的劇本(playbook)創建用于在遠程計算機上運行簡單或異常復雜的命令(或一組命令)的環境。
當然,Ansible可用于部署容器。
在你深入了解之前,我要展示的不一定是最佳實踐場景。由于每個人的情況和需求各不相同,下面介紹的只是使用Ansible來部署容器。有更好的方法嗎?當然。但這是否會讓你進而可以創建高度靈活且可行的Ansible劇本?肯定會。
你需要什么?
你至少需要兩臺服務器,一臺服務器已安裝并運行Ansible。我將演示Ubuntu Server 18.04的兩個實例。你還需要擁有sudo特權的用戶帳戶。最后,你需要在服務器之間建立了SSH密鑰驗證機制。若沒有SSH密鑰驗證,這種方法沒法使用。
以上就是你所需要的。
安裝Ansible
如果你尚未在一臺服務器上運行Ansible,請按照以下步驟來安裝:
1. 登錄到將托管Ansible的Ubuntu服務器。
2. 使用命令sudo apt-add-repository ppa:ansible/ansible安裝必要的存儲庫。
3. 使用命令sudo apt-get update更新apt。
4. 使用命令sudo apt-get install ansible -y安裝Ansible。
5. 如有必要,使用命令sudo apt-get install python -y安裝Python解釋器。
復制你的SSH密鑰
為了使這方法奏效,你必須建立SSH密鑰驗證機制。在Ansible服務器上,使用以下命令創建SSH密鑰:
- ssh-keygen
一旦創建了密鑰,使用以下命令將它復制到遠程計算機:
- ssh-copy-id SERVER_IP
其中SERVER_IP是遠程服務器的IP地址。
安裝Docker
接下來,你要在兩臺(或所有)計算機上安裝Docker引擎。想安裝Docker引擎,請登錄到其中一臺服務器,并執行以下命令:
- sudo apt-get install docker.io python3-docker -y
一旦安裝完畢,使用以下命令啟動并啟用Docker引擎:
- sudo systemctl start docker
- sudo systemctl enable docker
最后,使用以下命令將你的用戶添加到Docker組:
- sudo usermod -aG docker $USER
為了使更改生效,請注銷并重新登錄。
一旦你在所有計算機上完成了這些步驟,就可以下一步了。
目錄結構
現在,我們將創建必要的目錄和文件。這將在運行Ansible的計算機上完成。登錄該計算機,并執行命令:
- mkdir ~/docker_project
使用以下命令進入到剛創建的目錄:
- cd ~/docker_project
現在我們將創建主機文件。使用以下命令執行此操作:
- nano hosts
在該文件中,粘貼以下內容:
- [webserver]
- SERVER_IP
- [webserver:vars]
- ansible_python_interpreter=/usr/bin/python3
其中SERVER_IP是遠程服務器的IP地址。如果你有多臺服務器,該文件會是這樣子:
- [webserver]
- SERVER_IP
- SERVER2_IP
- [webserver:vars]
- ansible_python_interpreter=/usr/bin/python3
保存并關閉文件。
現在我們將創建Ansible劇本。該劇本將執行以下操作:
•安裝aptitude。
•安裝幾個依賴項。
•添加Docker存儲庫。
•安裝Docker社區版。
•安裝Docker Python模塊。
•拉取正式的Ubuntu映像。
•基于剛拉取的Ubuntu映像創建四個容器。
這個新文件將采用標準的YAML格式,這意味著你必須密切注意行縮進。縮進不一致會導致你的劇本失敗。使用以下命令創建一個新文件:
- nano ubuntu_playbook.yml
我們的劇本如下所示:
- - hosts: all</code> <code class=""> become: true</code> <code class=""> vars:</code> <code class=""> create_containers: 4</code> <code class=""> default_container_name: docker</code> <code class=""> default_container_image: ubuntu</code> <code class=""> default_container_command: sleep 1d</code> <code class=""> tasks:</code> <code class=""> - name: Install aptitude using apt</code> <code class=""> apt: name=aptitude state=latest update_cache=yes force_apt_get=yes</code> <code class=""> - name: Install required system packages</code> <code class=""> apt: name={{ item }} state=latest update_cache=yes</code> <code class=""> loop: [ 'apt-transport-https', 'ca-certificates', 'curl', 'software-properties-common', 'python3-pip', 'virtualenv', 'python3-setuptools']</code> <code class=""> - name: Add Docker GPG apt Key</code> <code class=""> apt_key:</code> <code class=""> url: https://download.docker.com/linux/ubuntu/gpg</code> <code class=""> state: present</code> <code class=""> - name: Add Docker Repository</code> <code class=""> apt_repository:</code> <code class=""> repo: deb https://download.docker.com/linux/ubuntu xenial stable</code> <code class=""> state: present</code> <code class=""> - name: Update apt and install docker-ce</code> <code class=""> apt: update_cache=yes name=docker-ce state=latest</code> <code class=""> - name: Install Docker Module for Python</code> <code class=""> pip:</code> <code class=""> name: docker</code> <code class=""> - name: Pull default Docker image</code> <code class=""> docker_image:</code> <code class=""> name: "{{ default_container_image }}"</code> <code class=""> source: pull</code> <code class=""> - name: Create default containers</code> <code class=""> docker_container:</code> <code class=""> name: "{{ default_container_name }}{{ item }}"</code> <code class=""> image: "{{ default_container_image }}"</code> <code class=""> command: "{{ default_container_command }}"</code> <code class=""> state: present</code> <code class=""> with_sequence: count={{ create_containers }}
保存并關閉文件。顯然,你可以根據需要修改劇本,因此仔細閱讀劇本,再作相應更改。
正如我所說,有多種方法可以處理上述任務。你在上面看到的只是其中之一。不過它很管用,正好可以看看如何使用Ansible部署容器。
運行劇本
有了劇本,我們現在可以使用以下命令運行它:
- ansible-playbook -i hosts ubuntu_playbook.yml --ask-become-pass
–ask-become-pass選項指示Ansible要求遠程用戶SSH密鑰使用sudo密碼(圖1)。一旦你輸入該密碼,按鍵盤上的回車鍵,劇本將運行。
圖1:輸入SSH密鑰后劇本會運行
劇本可能需要幾分鐘才能完成,這要看你的網絡連接和計算機的速度。完成后,登錄到遠程服務器,并執行命令:
- docker ps -a
你應該看到新容器已經部署(圖2)。
圖2.用GIMP創建
這就是使用Ansible部署容器的全部內容。有更好的方法可以做到這一點嗎?當然有。但如果你已經在Ansible方面有投入,何不將容器的部署添加到你越來越多的劇本中?
原文標題:How to Deploy a Container Using Ansible,作者:Jack Wallen
【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】