iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 9
0

現代 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邦新手 4 級 ‧ 2016-12-12 20:27:01

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

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

我要留言

立即登入留言