Ansible 用 Docker 练习 Ansible
在前一章「Ansible 用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, latest
- archlinux
- centos-6
- centos-7
- debian-7
- debian-8
- gentoo
- opensuse-42.1
- ubuntu-14.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] hostfile = 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 。 ↩