概要
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 件のコメント:
コメントを投稿