通过ansible-playbook,部署Docker Swarm集群。
docker安装目录: /var/lib/dockerdocker命令目录: /usr/bin/dockercompose命令目录: /usr/local/bin/docker-composeweavescope: docker可视化管理工具scope命令目录: /usr/local/bin/scope
role | ip | hostname |
---|---|---|
manager/scope | 192.168.1.51 | manager1 |
manager/scope | 192.168.1.52 | manager2 |
worker/scope | 192.168.1.53 | worker1 |
worker/scope | 192.168.1.54 | worker2 |
worker/scope | 192.168.1.55 | worker3 |
worker/scope | 192.168.1.56 | worker4 |
worker/scope | 192.168.1.57 | worker5 |
准备
- 将所有部署swarm集群的主机分组:
# vim /etc/ansible/hosts[manager]
192.168.1.51 hostname=manager1[add_manager]
192.168.1.52 hostname=manager2[add_worker]
192.168.1.53 hostname=worker1
192.168.1.54 hostname=worker2
192.168.1.55 hostname=worker3
192.168.1.56 hostname=worker4
192.168.1.57 hostname=worker5
- 创建管理目录:
# mkdir -p swarm/roles/{docker_install,init_install,manager_install,worker_install,scope_install}/{files,handlers,meta,tasks,templates,vars}# cd swarm/
说明:
files:存放需要同步到异地服务器的源码文件及配置文件;
handlers:当资源发生变化时需要进行的操作,若没有此目录可以不建或为空;
meta:存放说明信息、说明角色依赖等信息,可留空;
tasks:Docker Swarm 安装过程中需要进行执行的任务;
templates:用于执行 Docker Swarm 安装的模板文件,一般为脚本;
vars:本次安装定义的变量
# tree ..
├── roles
│ ├── docker_install
│ │ ├── files
│ │ ├── handlers
│ │ ├── meta
│ │ ├── tasks
│ │ │ ├── install.yml
│ │ │ ├── main.yml
│ │ │ └── prepare.yml
│ │ ├── templates
│ │ └── vars
│ │ └── main.yml
│ ├── init_install
│ │ ├── files
│ │ ├── handlers
│ │ ├── meta
│ │ ├── tasks
│ │ │ ├── install.yml
│ │ │ └── main.yml
│ │ ├── templates
│ │ └── vars
│ ├── manager_install
│ │ ├── files
│ │ ├── handlers
│ │ ├── meta
│ │ ├── tasks
│ │ │ ├── install.yml
│ │ │ └── main.yml
│ │ ├── templates
│ │ └── vars
│ ├── scope_install
│ │ ├── files
│ │ ├── handlers
│ │ ├── meta
│ │ ├── tasks
│ │ │ ├── install.yml
│ │ │ └── main.yml
│ │ ├── templates
│ │ └── vars
│ └── worker_install
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ │ ├── install.yml
│ │ └── main.yml
│ ├── templates
│ └── vars
└── swarm.yml36 directories, 13 files
- 创建安装入口文件,用来调用roles:
# vim swarm.yml---
- hosts: allremote_user: rootgather_facts: Trueroles:- docker_install- hosts: managerremote_user: rootgather_facts: Trueroles:- init_install- hosts: add_managerremote_user: rootgather_facts: Trueroles:- manager_install- hosts: add_workerremote_user: rootgather_facts: Trueroles:- worker_install- hosts: allremote_user: rootgather_facts: Trueroles:- scope_install
docker部分
- 创建docker入口文件,用来调用docker_install:
# vim docker.yml#用于批量安装Docker
- hosts: allremote_user: rootgather_facts: Trueroles:- docker_install
- 创建变量:
# vim roles/docker_install/vars/main.yml#定义docker安装中的变量
COMPOSE_VER: 1.24.1
- 环境准备prepare.yml:
# vim roles/docker_install/tasks/prepare.yml
- name: 关闭firewalld service: name=firewalld state=stopped enabled=no- name: 临时关闭 selinuxshell: "setenforce 0"failed_when: false- name: 永久关闭 selinuxlineinfile:dest: /etc/selinux/configregexp: "^SELINUX="line: "SELINUX=disabled"- name: 添加EPEL仓库yum: name=epel-release state=latest- name: 安装常用软件包yum:name:- vim- lrzsz- net-tools- wget- curl- bash-completion- rsync- gcc- unzip- gitstate: latest- name: 更新系统shell: "yum update -y"ignore_errors: yesargs:warn: False
- docker安装install.yml:
# vim roles/docker_install/tasks/install.yml
- name: 创建software目录file: name=/software state=directory- name: 更改hostnameraw: "echo {{ hostname }} > /etc/hostname"- name: 更改生效shell: "hostname {{ hostname }}"- name: 下载repo文件shell: "if [ ! -f /etc/yum.repos.d/docker.repo ]; then curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo; fi"- name: 生成缓存shell: "yum makecache fast"args:warn: False- name: 安装docker-ceyum: name: docker-cestate: present- name: 启动docker并开机启动service:name: dockerstate: startedenabled: yes- name: 下载docker-composeshell: "if [ ! -f /usr/local/bin/docker-compose ]; then curl -L https://github.com/docker/compose/releases/download/{{ COMPOSE_VER }}/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose; fi"- name: 给予执行权限file: name=/usr/local/bin/docker-compose mode=0755- name: 提高docker pull速度shell: "curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io"args:warn: False- name: 重启dockerservice:name: dockerstate: restarted
- 引用文件main.yml:
# vim roles/docker_install/tasks/main.yml#引用prepare、install模块
- include: prepare.yml
- include: install.yml
init部分
- 创建init入口文件,用来调用init_install:
# vim init.yml#用于初始化swarm集群
- hosts: managerremote_user: rootgather_facts: Trueroles:- init_install
- 集群初始化install.yml:
# vim roles/init_install/tasks/install.yml
- name: manager离开集群shell: "docker swarm leave -f"ignore_errors: yes- name: 初始化swarm集群shell: "docker swarm init --advertise-addr {{ ansible_ssh_host }}"- name: 获取manager的tokenshell: "echo `docker swarm join-token manager |grep docker` > /software/manager.sh"- name: 获取worker的tokenshell: "echo `docker swarm join-token worker |grep docker` > /software/worker.sh"- name: 获取所有ipshell: "echo `ansible all -m setup -a 'filter='ansible_default_ipv4'' |grep 'address' |grep -v 'macaddress' |awk -F '\"' '{print $4}'` > /software/hosts.txt"- name: 拷贝manager.shshell: "ansible all -m copy -a 'src=/software/manager.sh dest=/software mode=0755'"args:warn: False- name: 拷贝worker.shshell: "ansible all -m copy -a 'src=/software/worker.sh dest=/software mode=0755'"args:warn: False- name: 拷贝hosts.txtshell: "ansible all -m copy -a 'src=/software/hosts.txt dest=/software'"args:warn: False
- 引用文件main.yml:
# vim roles/init_install/tasks/main.yml#引用install模块
- include: install.yml
manager部分
- 创建manager入口文件,用来调用manager_install:
# vim manager.yml#用于集群增加manager
- hosts: add_managerremote_user: rootgather_facts: Trueroles:- manager_install
- 添加manager到集群install.yml:
# vim roles/manager_install/tasks/install.yml
- name: manager离开集群shell: "docker swarm leave -f"ignore_errors: yes- name: 集群增加managerscript: /software/manager.sh
- 引用文件main.yml:
# vim roles/manager_install/tasks/main.yml#引用install模块
- include: install.yml
worker部分
- 创建worker入口文件,用来调用worker_install:
# vim worker.yml#用于集群增加worker
- hosts: add_workerremote_user: rootgather_facts: Trueroles:- worker_install
- 添加worker到集群install.yml:
# vim roles/worker_install/tasks/install.yml
- name: worker离开集群shell: "docker swarm leave -f"ignore_errors: yes- name: 集群增加workerscript: /software/worker.sh
- 引用文件main.yml:
# vim roles/worker_install/tasks/main.yml#引用install模块
- include: install.yml
scope部分
- 创建scope入口文件,用来调用scope_install:
# vim scope.yml#用于安装weavescope
- hosts: allremote_user: rootgather_facts: Trueroles:- scope_install
- scope安装install.yml:
# vim roles/scope_install/tasks/install.yml
- name: 下载scopeshell: "if [ ! -f /usr/local/bin/scope ]; then curl -L git.io/scope -o /usr/local/bin/scope; fi"- name: 给予执行权限file: name=/usr/local/bin/scope mode=0755- name: 停止scope容器shell: "docker stop weavescope && docker rm weavescope"ignore_errors: yes- name: 启动scope容器shell: "hosts=`cat /software/hosts.txt`; scope launch $hosts"register: scope_url- debug: msg="{{ scope_url.stdout }}"
- 引用文件main.yml:
# vim roles/scope_install/tasks/main.yml#引用install模块
- include: install.yml
安装测试
- 执行安装:
# ansible-playbook swarm.yml
- 查看结果:
# docker node lsID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
o6zkxtp0qmvq6r1dxydmprmi4 * manager1 Ready Active Leader 19.03.4
nv1t4p8axfr1zn8k99tegsdhy manager2 Ready Active Reachable 19.03.4
thpss999qnn3e0gun3pi20oy4 worker1 Ready Active 19.03.4
y26tkhebj6u8b7psjnwghcbex worker2 Ready Active 19.03.4
7ygwplwy06sukkhag3kdu022p worker3 Ready Active 19.03.4
hzyd0fz8gx1pld5agjs9afri2 worker4 Ready Active 19.03.4
j2r873fcjqxtbf6p3xjplybee worker5 Ready Active 19.03.4
打开浏览器,访问任一节点的ip:4040
测试安装没有问题。已存放至个人gitgub:ansible-playbook