iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 9
0
DevOps

現代 IT 人一定要知道的 Ansible 自動化組態技巧系列 第 9

09. 怎麼用 Docker Compose 練習 Ansible?

現代 IT 人一定要知道的 Ansible 自動化組態技巧

09. 怎麼用 Docker Compose 練習 Ansible?

在前一章「08. 怎麼用 Jupyter 操控 Ansible?(Managed node)」我們藉由 Docker 實作用 Control MachineManaged node 的環境。雖看似完美,可當容器一多就會讓建置環境的流程變得複雜且繁瑣,這次凍仁將改用 Docker Compose 來簡化練習 Ansible 的步驟。

automate_with_ansible_practice-11.jpg

Docker Compose 是什麼?

Docker Compose 是個用來定義和執行複雜 Docker 應用程式的工具,它就好比 Shell Script 和 Ansible Playbooks,透過事先撰寫好的 docker-compose.yml 來批次管理 Docker 容器。

automate_with_ansible_practice-12.jpg

官網簡介如下:

Docker Compose allows you to define your multi-container application with all of its dependencies in a single file, then spin your application up in a single command.

若想深入了解 Docker Compose,可參考以下文章:

怎麼用 Docker Compose 管理容器?

底下只列出本次主題所會用到的相關指令,練習時只需執行步驟 1, 2 即可。

  1. 建立並執行容器。

    $ docker-compose up
    
  2. 觀看容器狀態和綁定的埠口 (Port)。

    $ docker-compose ps
    
  3. 停止容器。

    $ docker-compose stop
    
  4. 啟用容器。

    $ docker-compose start
    
  5. 移除容器:再移除之前得先停用容器後才可移除。

    $ docker-compose rm -f
    
    # -f, --force: Don't ask to confirm removal
    

怎麼用 Docker Compose 建立 Ansible 環境?

上一章我們開了 3 個 Docker 容器來實作 Control Machine (Jupyter, Ansible) + Managed node (CentOS 7, Ubuntu 14.04) 的環境,這次就再加一個 Debian 8 的 Managed node,並命名為 server3。

automate_with_ansible_practice-13.jpg
圖片來源: https://www.docker.com/products/docker-compose

建立 docker-compose.yml

這次凍仁挑了 chusiang/ansible-jupyter:alpine-3.4 的 Docker image 作為 Control Machine,而新加入的 Managed node 則是 chusiang/ansible-managed-node:debian-8

$ vi docker-compose.yml
version: '2'
services:

  control_machine:
    ports:
      - 8888:8888/tcp
    image: chusiang/ansible-jupyter:alpine-3.4

  server1:
    ports:
      - 2221:22/tcp
    image: chusiang/ansible-managed-node:ubuntu-14.04

  server2:
    ports:
      - 2223:22/tcp
    image: chusiang/ansible-managed-node:centos-7

  server3:
    ports:
      - 2222:22/tcp
    image: chusiang/ansible-managed-node:debian-8

啟動容器

使用 docker-compose up 來批次秒開所有容器!

$ docker-compose up
Starting ch09_server2_1
Starting ch09_server1_1
Starting ch09_server3_1
Creating ch09_control_machine_1
Attaching to ch09_server3_1, ch09_server1_1, ch09_server2_1, ch09_control_machine_1
control_machine_1  | [I 22:29:59.156 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
control_machine_1  | [I 22:29:59.208 NotebookApp] Serving notebooks from local directory: /home
control_machine_1  | [I 22:29:59.209 NotebookApp] 0 active kernels
control_machine_1  | [I 22:29:59.209 NotebookApp] The Jupyter Notebook is running at: http://0.0.0.0:8888/
control_machine_1  | [I 22:29:59.210 NotebookApp] Use Control-C to stop this server and shut down allkernels (twice to skip confirmation).
...

設定 Ansible 環境

這部份大多與前一章的 08. 怎麼用 Jupyter 操控 Ansible?(Managed node) 重複,請特別留意 inventory 檔案的設置。

  1. 取得本機的 IP:凍仁取得的 IP 為 192.168.1.104,請自行修改。

    # GNU/Linux
    $ ifconfig eth0
    
    # macOS
    $ ifconfig en7
    
  2. 取得 Managed node 容器所綁定的 OpenSSH port,請特別留意 0.0.0.0:222?->22/tcp 的部份。

    $ docker-compose ps
             Name                     Command             State         Ports
    ------------------------------------------------------------------------------------
    ch09_control_machine_1 docker-entrypoint.sh jupyt ... Up    0.0.0.0:8888->8888/tcp
    ch09_server1_1         /usr/sbin/sshd -D              Up    0.0.0.0:2221->22/tcp
    ch09_server2_1         /usr/sbin/sshd -D              Up    0.0.0.0:2223->22/tcp
    ch09_server3_1         /usr/sbin/sshd -D              Up    0.0.0.0:2222->22/tcp
    
  3. 進入 Jupyter notebook 網站 (http://localhost:8888/)。

  4. 若不想透過 Jupyter 操作 Ansible,可直接進入容器裡操作,但要記得切換到 /home 目錄底下。

    # 從 Host OS 進入容器。
    $ docker exec -it ch09_control_machine_1 sh
    / #
    
    # 切換目錄。
    / # cd /home
    
    # 列出 /home 底下的檔案。
    /home # ls -1
    ansible.cfg
    ansible_on_jupyter.ipynb
    inventory
    setup_jupyter.yml
    
  5. 修改 inventory 檔案,並填入步驟 1 取得的 IP 和步驟 2 取得的 OpenSSH port。這次容器的 Port mapping 將會依照 docker-compose.yml 所定義的內容建立,不像原先得一個個的手動設定。

    server1  ansible_ssh_host=192.168.1.104  ansible_ssh_port=2221
    server2  ansible_ssh_host=192.168.1.104  ansible_ssh_port=2222
    server3  ansible_ssh_host=192.168.1.104  ansible_ssh_port=2223
    

    請勿在這個 Lab 使用 localhost 和 127.0.0.1 的位址,這會讓 Control Machine 一直對自己找 Managed node。在這裡我們是把 Managed node 的 OpenSSH port 綁在 Host OS [^1] 上,而不是 Control Machine 的容器裡。

  1. 環境建置完成!現在可以到 Control Managed (Jupyter + Ansible) 上對各個 Managed node (Ubuntu 14.04, CentOS 7, Debian 8) 進行操作了。

Play Ansible

現在我們可以透過 Ansible 操控 3 個 Managed node 了,記得把 inventory 的部份從 localhost 改成 all 喔!

2016-12-09-ansible-jupyter-ping.gif

後語

改用 Docker Compose 管理容器後,我們可以一次對所有容器進行操作,並大幅簡化建置複雜 Ansible 練習環境的操作流程!

以上,希望大家會喜歡簡化過的 Docker Compose 流程。:D

相關連結


上一篇
08. 怎麼用 Jupyter 操控 Ansible?(Managed node)
下一篇
10. Ansible 的開發工具有哪些?
系列文
現代 IT 人一定要知道的 Ansible 自動化組態技巧31

1 則留言

0
凍仁翔
iT邦新手 3 級 ‧ 2016-12-12 20:27:01

已修正 docker-compose.yml 的 typo,感謝 @meanwhy

  - server1:
  + server2:
     ports:
       - 2223:22/tcp
     image: chusiang/ansible-managed-node:centos-7

我要留言

立即登入留言