現代 IT 人一定要知道的 Ansible 自動化組態技巧
05. 怎麼用 Docker 練習 Ansible?
在前一章「04. 怎麼用 Vagrant 練習 Ansible?」我們是使用 Virtualbox + Vagrant 的組合來練習 Ansible,這次凍仁將會改用當前最火紅的 Docker 虛擬化容器技術來建置虛擬環境。
Docker 的好凍仁在此就不多談,大家若對 Docker 還不熟悉,可以看看凍仁以前分享過的「前端工程師一定要知道的 Docker 虛擬化容器技巧」簡報,這是一份讓人快速上手 Docker 的教學。
怎麼安裝 Docker?
請安裝最新版的 Docker 即可。這裡凍仁將不會特別介紹怎麼安裝,請參考以下文章。
- Docker 官方網站。
- 於 Ubuntu 14.04 安裝 Docker 1.9.1+ | 凍仁的筆記
- 在 OSX 10.11.4 安裝 Docker for Mac (v1.11.0-beta8) | 凍仁的筆記
怎麼用 Docker 管理容器 (Container)?
凍仁已在 Docker Hub 上建好了 Managed Node 的 Docker image - chusiang/ansible-managed-node
以利大家練習 Ansible,該專案目前支援的 Linux 發行版本有:
alpine-3.4
(End-of-life, EOL)alpine-3.6
,latest
archlinux
centos-6
centos-7
debian-7
debian-8
gentoo
(EOL)opensuse-42.1
(EOL)opensuse-42.2
opensuse-42.3
ubuntu-14.04
ubuntu-16.04
底下將列出本次主題所會用到的相關指令,練習時只需執行步驟 1, 2, 3 即可。
取得凍仁事先建立好的 Docker image。
$ docker pull chusiang/ansible-managed-node:ubuntu-14.04 #### 使用者帳戶 ##################### # # | | username | password | # |-----------|----------|----------| # | root user | root | root | # | sudo user | docker | docker |
建立並執行容器。
$ docker run --name server1 -d -P chusiang/ansible-managed-node:ubuntu-14.04 ecdf39055ba2a932fa8c76a75afdec1cd8f516285bee6f4e07c16c67f4009211
觀看容器狀態和 SSH 綁定的埠口 (Port)。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ecdf39055ba2 chusiang/ansible-managed-node:ubuntu-14.04 "/usr/sbin/sshd -D" 20 hours ago Up 17 seconds 0.0.0.0:32805->22/tcp server1
進入容器。
$ docker exec -it server1 bash
關閉容器。
$ docker stop server1
啟用容器。
$ docker start server1
移除容器。
$ docker rm server1 # -f, --force: 強制移除,包含正在執行的容器。
怎麼讓 Ansible 操控用 Docker 開好的容器?
接下來,我們將會用 Ansible 來控制 Docker 在本機上建立的容器,其作業系統版本為 Ubuntu 14.04 64-bit (AMD64),大家可以從 Dockerfile 1 看到裡面已預載了 OpenSSH server 和 Python。
取得容器的 OpenSSH 設定:請特別留意
0.0.0.0:32805->22/tcp
的值。$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ecdf39055ba2 chusiang/ansible-managed-node:ubuntu-14.04 "/usr/sbin/sshd -D" 20 hours ago Up 17 seconds 0.0.0.0:32805->22/tcp server1
設定 ansible.cfg:將
remote_user
設為docker
。$ vi ansible.cfg [defaults] inventory = hosts remote_user = docker host_key_checking = False
設定 hosts。
$ vi hosts server1 ansible_ssh_host=127.0.0.1 ansible_ssh_port=32805 ansible_ssh_pass=docker [local] server1
ansible_ssh_host
:請設為本機的 IP。ansible_ssh_port
:請設為docker ps
時取得的 SSH port。ansible_ssh_pass
:因沒有連線用的 SSH 金鑰,故直接使用密碼的方式進行連線,建議只於練習環境使用該參數。
Hello World on Docker
當已上的設置都完成了,我們就可以在終端機裡用 Docker 建立好的容器來練習 Ansible 了!
$ ansible all -m command -a 'echo Hello World on Docker.'
server1 | SUCCESS | rc=0 >>
Hello World on Docker.
後語
就實務面而言,凍仁一般會先在 Vagrant 的虛擬環境先開發好 Ansible Playbooks,有 Dockerize 需求再來相容 Docker 的環境。
Vagrant 利於開發,而 Docker 利於散佈、部署和節省資源,要怎麼搭配使用就看個人的習慣了。
相關連結
1. chusiang/ansible-managed-node:ubuntu-14.04
image 的 Dockerfile 可以在凍仁的 GitHub 找到,其網址為 https://github.com/chusiang/ansible-managed-node.dockerfile/blob/master/ubuntu-14.04/Dockerfile 。 ↩