ansible-playbook部署Docker Swarm集群

article/2025/9/10 13:05:50

通过ansible-playbook,部署Docker Swarm集群。

docker安装目录:  /var/lib/dockerdocker命令目录: /usr/bin/dockercompose命令目录: /usr/local/bin/docker-composeweavescope: docker可视化管理工具scope命令目录: /usr/local/bin/scope
roleiphostname
manager/scope192.168.1.51manager1
manager/scope192.168.1.52manager2
worker/scope192.168.1.53worker1
worker/scope192.168.1.54worker2
worker/scope192.168.1.55worker3
worker/scope192.168.1.56worker4
worker/scope192.168.1.57worker5

准备

  • 将所有部署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



http://chatgpt.dhexx.cn/article/lbpd9JjX.shtml

相关文章

WebGIS中利用AGS JS+eCharts实现一些数据展示的探索

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。 1.背景 eCharts提供了迁徙图、热点图、夜视图等跟地图能够很好的结合起来的数据展示方式。但是如何将eCharts和我们的AGS JS框架以及自身的地图相结合&…

AngularJS所有版本下载地址

AngularJS官网本身采用AngularJS库构建,页面中的AngularJS库通过Google的CDN(内容分发网络)引入,所以国内访问会有问题。 大家可以从下面地址获取AngularJS所以版本: https://code.angularjs.org/ 各种版本应有尽有&a…

视频教程-Web前端进阶-AngularJs4从基础到实战-AngularJS

Web前端进阶-AngularJs4从基础到实战 优就业互联网营销首席讲师 精通各大搜索引擎原理,对SEO有深入的研究和独到见解,擅长站内与站外优化与策略部署。熟悉常用的Web项目开发技术,擅长营销型、成交型网站策划,精通织梦、帝国、word…

arcgis js(二)显示三维地图

1、上一节讲了arcgis js入门与提高(一)加载二维地图arcgis js(一)显示二维地图_郝大大的博客-CSDN博客,本节继续讲如何加载三维地图,与3.x版本不同,ArcGIS API for JavaScript 3.x版本地图都是显…

【九】坐标格网添加以及调整

一、前言 有些小伙伴应该见过上述这种专业的制图,本节主要是针对上述图片中的坐标格网进行讲解。如果添加并且对其进行设置。 二、具体步骤 1、接上前文的内容继续,首先一样添加相关数据并且切换到布局视图。 2、 单击一下数据格网,然后被选…

AngularJS简单入门教学和使用

前端框架千千万&#xff0c;今天我们来学习简单的AngularJS的入门案例和学习&#xff0c;让我们快速掌握和使用 使用步骤 引入js文件&#xff0c;前端框架首先就是引入js脚本&#xff0c;这里可以去官网上进行下载 <script src"../plugins/angularjs/angular.min.j…

js搭建网站 web服务器,AngularJS如何搭建web服务器?angularjs搭建web服务器的详细过程...

本篇文章主要的介绍了关于angularjs启动web服务器的操作&#xff0c;希望能帮到大家&#xff0c;现在开始看文章吧 安装node.js 下载链接 官网地址&#xff1a; https://nodejs.org/en/ 我下的解压版的&#xff0c;直接解压到你想安装的目录中 在我的电脑(右键)→属性→高级系统…

python画气球_戳气球(python)

问题描述* 有 n 个气球&#xff0c;编号为0 到 n-1&#xff0c;每个气球上都标有一个数字&#xff0c;这些数字存在数组 nums 中。 现在要求你戳破所有的气球。如果你戳破气球 i &#xff0c;就可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代…

312. 戳气球(区间dp)

链接&#xff1a;https://leetcode-cn.com/problems/burst-balloons/ 首先这个长度为500的范围可以猜测出是O(n^3)区间dp这里主要讲述为什么状态定义要定义成开区间而不是闭区间 最大的原因&#xff1a;闭区间计算出来的状态是无法保证正确性的 假如使用一开始的闭区间定义去…

Python 算法戳气球

戳气球 题目描述&#xff1a; 有 n 个气球&#xff0c;编号为0 到 n - 1&#xff0c;每个气球上都标有一个数字&#xff0c;这些数字存在数组 nums 中。 现在要求你戳破所有的气球。戳破第 i 个气球&#xff0c;你可以获得 nums[i - 1] * nums[i] * nums[i 1] 枚硬币。 这里…

1012-戳气球

题目如下 有 n 个气球&#xff0c;编号为0 到 n - 1&#xff0c;每个气球上都标有一个数字&#xff0c;这些数字存在数组 nums 中。 现在要求你戳破所有的气球。戳破第 i 个气球&#xff0c;你可以获得 nums[i - 1] * nums[i] * nums[i 1] 枚硬币。 这里的 i - 1 和 i 1 代…

戳气球和布尔运算问题(巨难)

一.大气球的最大得分 1.对应letecode链接 打气球的最大分数_牛客题霸_牛客网 (nowcoder.com) 2.题目描述&#xff1a; 3.解题思路 本题个人觉得本题巨难&#xff1a;主要步骤如下&#xff1a; 1.预处理&#xff1a;为便于处理&#xff0c;可在 nums 数组两端各添加一个哨兵 1&…

经典动态规划:戳气球问题

点击上方蓝字设为星标 东哥带你手把手撕力扣~ 作者&#xff1a;labuladong 公众号&#xff1a;labuladong若已授权白名单也必须保留以上来源信息 今天我们要聊的这道题「Burst Balloon」和之前我们写过的那篇 经典动态规划&#xff1a;高楼扔鸡蛋问题 分析过的高楼扔鸡蛋问题类…

*312戳气球

​​​​​​戳气球 有 n 个气球&#xff0c;编号为0 到 n - 1&#xff0c;每个气球上都标有一个数字&#xff0c;这些数字存在数组 nums 中。 现在要求你戳破所有的气球。戳破第 i 个气球&#xff0c;你可以获得 nums[i - 1] * nums[i] * nums[i 1] 枚硬币。 这里的 i - 1 …

力扣---戳气球

力扣—戳气球 文章目录 力扣---戳气球一、题目描述二、回溯思路三、动态规划思路四、代码 一、题目描述 有 n 个气球&#xff0c;编号为0 到 n-1&#xff0c;每个气球上都标有一个数字&#xff0c;这些数字存在数组 nums 中。 现在要求你戳破所有的气球。每当你戳破一个气球 …

【LeetCode】312. 戳气球

312. 戳气球&#xff08;困难&#xff09; 解法一&#xff1a;动态规划 首先看一个区间&#xff1a; 区间(i,j) 是一个开区间&#xff0c;因为我们只能戳爆 i 和 j 之间的气球&#xff0c;不能戳爆索引为 i 和 j 的气球。 我们不妨考虑该区间内被戳爆的最后一个气球&#xff…

LeetCode312:戳气球

要求 有 n 个气球&#xff0c;编号为0 到 n - 1&#xff0c;每个气球上都标有一个数字&#xff0c;这些数字存在数组 nums 中。 现在要求你戳破所有的气球。戳破第 i 个气球&#xff0c;你可以获得 nums[i - 1] * nums[i] * nums[i 1] 枚硬币。 这里的 i - 1 和 i 1 代表和…

【动态规划】LeetCode 312. 戳气球 --区间DP问题

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

Golang每日一练(leetDay0105) 最小高度树、戳气球

目录 310. 最小高度树 Minimum Height Trees &#x1f31f;&#x1f31f; 312. 戳气球 Burst Balloons &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一…

Leetcode.312 戳气球

题目链接 Leetcode.312 戳气球 题目描述 有 n个气球&#xff0c;编号为0到 n - 1&#xff0c;每个气球上都标有一个数字&#xff0c;这些数字存在数组 nums中。 现在要求你戳破所有的气球。戳破第 i 个气球&#xff0c;你可以获得 n u m s [ i − 1 ] ∗ n u m s [ i ] ∗ …