2020年11月6日金曜日

Ansible で Docker Swarm 環境を構築してみた

概要

community.general.docker_swarm なるロールがあったのでこれを使って docker swarm 環境を構築してみました
なお作業するマシンは Swarm の Master 側の Ubuntu 上で行います

環境

  • Ubuntu18.04 x 2
  • docker 19.03.13
  • ansible 2.9.15

docker の 2376 ポートの開放

こちらを参考に開放してください

お互いのマシンから 192.168.100.10:2376/info にアクセスして JSON が返ってくれば OK です

お互い SSH できるようにする

  • ssh-keygen -t rsa

をお互いのマシンで実行し id_rsa.pub を作成します
そしてそれぞれのマシンの authorized_keys に記載しましょう

ロールのインストール

  • ansible-galaxy collection install community.general

playbook の作成

では playbook を作成していきます
完成形は以下のような構成にします

.
├── group_vars
│   └── test
│       └── vars.yml
├── inventory
│   └── test
│       └── hosts.yml
├── roles
│   └── swarm
│       └── tasks
│           └── main.yml
└── site.yml

inventory ファイルの作成

  • mkdir -p inventory/test
  • vim inventory/test/hosts.yml
---

test:
  hosts:
    ubuntu:
      ansible_host: "{{ worker_ip }}"
    ubuntu2:
      ansible_host: "{{ manager_ip }}"

変数ファイルの作成

  • mkdir -p group_vars/test
  • vim group_vars/test/vars.yml
---

ansible_python_interpreter: /usr/bin/python3

cluster_interface: enp0s8

manager_ip: 192.168.100.11
worker_ip: 192.168.100.10
manager_host_name: ubuntu2

タスクファイルの作成

  • mkdir -p roles/swarm/tasks
  • vim roles/swarm/tasks/main.yml
---

- name: Install docker-py
  pip:
    name: docker-py

- name: Init a new swarm with default parameters
  community.general.docker_swarm:
    state: present
    advertise_addr: "{{ manager_ip }}"
  register: rezult
  when: lookup('vars', 'ansible_' + cluster_interface).ipv4.address == manager_ip                                                

- name: Add nodes
  community.general.docker_swarm:
    state: join
    advertise_addr: "{{ worker_ip }}"
    join_token: "{{ hostvars[manager_host_name]['rezult'].swarm_facts.JoinTokens.Worker }}"                                      
    remote_addrs: [ "{{ manager_ip }}:2377" ]
  when: lookup('vars', 'ansible_' + cluster_interface).ipv4.address == worker_ip

ちょっと長いので説明します

まず docker-py をインストールしています
今回使用する community.general.docker_swarm は内部的に docker-py を使って docker の操作をしているためです

次に swarm init しています
初期化するノードは manager ノードのみなので IP で実行するノードを制限しています
ここは IP ではなく inventory や group で制御しても問題ないです

最後に swarm join しています
これは worker ノードで実行する必要があるのでこれも IP で制御しています
更に join するためのトークンは manager ノード側の hostvars に格納されているのでそれを参照するようにしています
remote_addrs は docker swarm 用の管理ポートになるので開放した 2367 ではなく swarm manager が起動した際の 2377 を指定します

実行メインファイルの作成

ロールを指定して実行するだけです

  • vim site.yml
---

- name: Build swarm cluster
  hosts: test
  become: true
  roles:
    - role: "swarm"
      tags: ["swarm"]

動作確認

実行してみましょう

  • ansible-playbook -i inventory/test site.yml

成功すると docker swarm クラスタが構築されています

  • docker node ls

あたりで確認すると良いと思います

最後に

Ansible で community.general.docker_swarm を使って docker swarm を構築してみました
今回は 2 台だったのでイマイチありがたみが出てきませんでしたがこれが 10 台くらいの規模になると楽な運用ができるようになると思います

今回は単純な join だけを紹介しましたが leave や update も実行できるのでコマンドのオペレーションは一通り Ansible にすることはできそうです

参考サイト

0 件のコメント:

コメントを投稿