codecamp

Ansible 混用 Ansible 建置 Docker image

在「Ansible 用 Docker 练习 Ansible」一章时,曾提到可以用 Ansible 建置 Docker image。接下来冻仁将借由 chusiang.vim-and-vi-mode role 讲解 Dockerize (Docker 化) Ansible role 的小技巧。

automate_with_ansible_practice-31.jpg

chusiang.vim-and-vi-mode 是什么?

chusiang.vim-and-vi-mode 是用来安装 Vim 和设置 vi-mode 的 Ansible Role,目前支持的平台有 Ubuntu, Debian, CentOS 和 macOS。

对于冻仁这位 Vim 重度使用者而言,会想在各个环境都使用 vi-mode,索性就写了一个 Role 来处理这些索碎的操作。

档案结构

与之前 Roles 的范例相比,这次多了 builds/ 目录和各个发行版本的 Dockerfile

$ tree .
.
├── LICENSE
├── README.md
├── Vagrantfile
├── builds
│   ├── centos6
│   │   └── Dockerfile
│   ├── centos7
│   │   └── Dockerfile
│   ├── debian7
│   │   └── Dockerfile
│   ├── debian8
│   │   └── Dockerfile
│   ├── ubuntu14.04
│   │   └── Dockerfile
│   └── ubuntu16.04
│       └── Dockerfile
├── defaults
│   └── main.yml
├── meta
│   └── main.yml
├── setup.yml
├── tasks
│   ├── main.yml
│   ├── use-apt.yml
│   ├── use-brew.yml
│   └── use-yum.yml
├── templates
│   └── gitconfig.j2
└── ...

怎么建置 Docker image?

建立 Dockerfile

Dockerfile 是我们使用 docker build 指令建置 image 会用到的档案。这边只以 Ubuntu 14.04 的 Dockerfile 进行解说,如想深入了解还请参考 Dockerfile reference | Docker 一文。

$ vi builds/ubuntu14.04/Dockerfile
01 # pull base image
02 FROM williamyeh/ansible:ubuntu14.04-onbuild
03 MAINTAINER Chu-Siang Lai <chusiang.lai@gmail.com>
04 
05 #
06 # build phase
07 #
08 RUN sed -i -e 's/exit\s\s*101/exit 0/' /usr/sbin/policy-rc.d
09 
10 # init.
11 RUN sudo apt-get install -y curl git make ;\
12       git clone https://github.com/chusiang/vim-and-vi-mode.ansible.role.git ;\
13       cd vim-and-vi-mode.ansible.role
14 
15 ENV PLAYBOOK vim-and-vi-mode.ansible.role/setup.yml
16 RUN ansible-playbook-wrapper -vvv
  1. 第 2 行:宣告上层 docker image 的来源为 williamyeh/ansible:ubuntu14.04-onbuild
  2. 第 11-13 行:执行安装 curlgitmake 套件和取得 Playbooks 等事先作业。
  3. 第 15 行:设置 playbook 路径。
  4. 第 16 行:用 Ansible 处理后续的组态任务。

建置 Docker image

有了 Dockerfile,我们就可借由 docker build 指令建置 docker imgae。

  1. 进入 builds/ubuntu14.04/ 的目录。

    $ cd builds/ubuntu14.04
    
  2. 建置 docker image。

    $ docker build -t vim:ubuntu14.04 .
    ...
    PLAY RECAP *********************************************************************
    localhost                  : ok=10   changed=7    unreachable=0    failed=0
    
    ---> 22b40b4e3b03
    Removing intermediate container 9e4dff0b5ddf
    Successfully built 22b40b4e3b03
    

    2016-12-28-ansible-docker.gif

  3. 列出 docker image,成功后应与以下结果雷同。

    $ docker images | grep vim
    REPOSITORY  TAG          IMAGE ID      CREATED         SIZE
    vim         ubuntu14.04  22b40b4e3b03  14 minutes ago  396.9 MB
    

以上即是使用 Ansible 建置 Docker image 的示范,下章冻仁将介绍怎么把这一套流程搬到 Docker Hub 上。

后话

Dockerfile + Shell Script 的组合虽好,可步骤一多就会显得杂乱且难以维护,这时就是 Ansible 出场的时候了!

透过 Ansible 我们可以很快速的把环境移植到 Docker 上,若需针对 Docker 进行微调,相信底下的范例可以帮上不少忙。

# 在 Docker 虚拟环境时,不执行更改主机名称 (hostname) 的 task。
- name: rename hostname
  hostname: name=vim.local
  when: ansible_virtualization_type != 'docker'

相关连结


Ansible 用 Travis CI 测试 Roles
Ansible 在 Docker Hub 混用 Ansible 自动建置 Docker image
温馨提示
下载编程狮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; }