codecamp

Ansible 用 Docker 练习 Ansible

在前一章「Ansible 用Vagrant练习Ansible」我们是使用 Virtualbox + Vagrant 的组合来练习 Ansible,这次冻仁将会改用当前最火红的 Docker 虚拟化容器技术来建置虚拟环境。

automate_with_ansible_practice-03.jpg

Docker 的好冻仁在此就不多谈,大家若对 Docker 还不熟悉,可以看看冻仁以前分享过的「前端工程师一定要知道的 Docker 虚拟化容器技巧」简报,这是一份让人快速上手 Docker 的教学。

怎么安装 Docker?

请安装最新版的 Docker 即可。这里冻仁将不会特别介绍怎么安装,请参考以下文章。

怎么用 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 即可。

  1. 取得冻仁事先建立好的 Docker image。

    $ docker pull chusiang/ansible-managed-node:ubuntu-14.04
    
    #### 使用者帐户 #####################
    #
    # |           | username | password |
    # |-----------|----------|----------|
    # | root user | root     | root     |
    # | sudo user | docker   | docker   |
    
  2. 建立并执行容器。

    $ docker run --name server1 -d -P chusiang/ansible-managed-node:ubuntu-14.04
    ecdf39055ba2a932fa8c76a75afdec1cd8f516285bee6f4e07c16c67f4009211
    
  3. 观看容器状态和 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
    
  4. 进入容器。

    $ docker exec -it server1 bash
    
  1. 关闭容器。

    $ docker stop server1
    
  2. 启用容器。

    $ docker start server1
    
  3. 移除容器。

    $ docker rm server1
    
    # -f, --force: 强制移除,包含正在执行的容器。
    

怎么让 Ansible 操控用 Docker 开好的容器?

接下来,我们将会用 Ansible 来控制 Docker 在本机上建立的容器,其作业系统版本为 Ubuntu 14.04 64-bit (AMD64),大家可以从 Dockerfile 1 看到里面已预载了 OpenSSH server 和 Python。

automate_with_ansible_practice-04.jpg

  1. 取得容器的 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
    
  2. 设定 ansible.cfg:將 remote_user 设为 docker

    $ vi ansible.cfg
    [defaults]
    
    hostfile = hosts
    remote_user = docker
    host_key_checking = False
    
  3. 设定 hosts

    $ vi hosts
    server1  ansible_ssh_host=127.0.0.1  ansible_ssh_port=32805 ansible_ssh_pass=docker
    
    [local]
    server1
    
    1. ansible_ssh_host:请设为本机的 IP。
    2. ansible_ssh_port:请设为 docker ps 时取得的 SSH port。
    3. 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 利于散布、部署和节省资源,要怎么搭配使用就看个人的习惯了。

相关连接

1chusiang/ansible-managed-node:ubuntu-14.04 image 的 Dockerfile 可以在冻仁的 GitHub 找到,其网址为 https://github.com/chusiang/ansible-managed-node.dockerfile/blob/master/ubuntu-14.04/Dockerfile 。 ↩


Ansible 用Vagrant练习Ansible
Ansible 如何操作
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }