系列文章目录
ansible相关知识入门文章
rpmbuild构建minio
文章目录
前言
首先,查看本文章前先阅读一下顶部的两篇文章,因为本篇文章主要依赖于ansible-playbook和通过rpmbuild构建好的minio安装包进行编写的,如果需要用我构建好的minioRPM包,可以在该地址自行下载(https://download.youkuaiyun.com/download/weixin_50902636/89642252
)。同时,写该篇文章不仅是为了加深playbook的使用,更是为了交付团队更好的交付。使得客户安装部署更加简洁明了,维护中间件更加方便。
一、部署目标
1、部署过程中可以指定部署服务器IP,并对这些ip进行存活性验证
2、部署过程中可以指定minio的数据目录和安装目录
3、结合构建好的minio-RPM包快速的部署出一个四节点的minio集群
二、部署流程
主要思想: 通过指定hosts文件中安装minio服务器IP的数量来判断,如果只有一个ip,则执行单节点minio安装,如果是多个ip,则执行集群minio安装。其中安装和启动单点或者集群都通过ip数量来控制
1.部署清单目录结构
├── hosts
├── minio
│ ├── files
│ │ └── minio-RELEASE_2023_05_18-1.x86_64.rpm
│ ├── handlers
│ ├── meta
│ ├── tasks
│ │ ├── check.yml
│ │ ├── config.yml
│ │ ├── install.yml
│ │ ├── main.yml
│ │ ├── setup.yml
│ │ └── start.yml
│ ├── templates
│ │ ├── cluster_run.sh.j2
│ │ ├── minio_restart.sh.j2
│ │ ├── single_run.sh.j2
│ │ └── stop.sh.j2
│ └── vars
│ └── main.yml
└── minio.yml
2.files目录解析
files目录一般用于存放安装包源文件
3.tasks目录解析
3.1、main.yml
指定在执行ansible-playbook过程中yml文件的执行顺序和名称。即执行哪些yml文件,就以下方的形式添加在此处即可
- include: setup.yml
- include: install.yml
- include: config.yml
- include: start.yml
- include: check.yml
3.2、setup.yml
在此处的作用是根据vars目录main.yml文件中定义的变量创建目录
- name: create data dir
file:
path: "{{DATA_DIR}}"
state: directory
3.3、install.yml
执行RPM包安装的步骤,将rpm包拷贝到对应主机目录下,执行安装并删除对应主机上的rpm包,并判断安装命令是否执行成功
- name: copy minio rpm
copy:
src: "{{Package_Name}}"
dest: /tmp/"{{Package_Name}}"
- name: install minio rpm package
yum:
name: /tmp/"{{Package_Name}}"
state: present
register: installResult #将安装结果注册到installResult,然后通过下方的debug进行判断
- name: remove minio rpm package
file:
path: /tmp/"{{Package_Name}}"
state: absent
- name: result
debug:
var: installResult.results
#verbosity:debug的级别(默认是0级,全部显示)
verbosity: 0
3.4、config.yml
在此处的作用是将template目录中jinja2模板文件安装到对应的宿主机位置
- name: config run shell
template:
src: single_run.sh.j2
dest: "{{ HOME }}/single_run.sh"
mode: 0755
- name: config stop shell
template:
src: stop.sh.j2
dest: "{{ HOME }}/stop.sh"
mode: 0755
- name: config restart shell
template:
src: minio_restart.sh.j2
dest: "{{ HOME }}/minio_restart.sh"
mode: 0755
- name: config run cluster shell
template:
src: cluster_run.sh.j2
dest: "{{ HOME }}/cluster_run.sh"
mode: 0755
3.5、start.yml
安装完成并且配置文件拷贝调试完成后,进行启动操作
#使用 set_fact 模块来设置一个新的变量 script_to_run。这个变量通过 ansible_play_hosts 的长度来判断要运行的脚本。
#如果 ansible_play_hosts 的长度为 1,则 script_to_run 设为 single_run.sh;否则,设为 cluster_run.sh。
#在执行 shell 模块时,使用 {{ HOME }}/{{ script_to_run }} 来动态选择脚本。
#debug 模块显示 startResult 的结果,并设置 verbosity 级别为 0
- name: Determine the script to run based on the number of hosts
set_fact:
script_to_run: "{{ (ansible_play_hosts | length == 1) | ternary('single_run.sh', 'cluster_run.sh') }}"
- name: start minio node
shell:
cmd: "{{ HOME }}/{{ script_to_run }}"
register: startResult
- name: result
debug:
var: startResult
verbosity: 0
3.6、check.yml
主要用于检查minio是否成功启动
- name: Determine if Minio is running on single node
shell: "ps aux | grep minio | grep -v grep"
register: minio_status_single
when: ansible_play_hosts | length == 1
- name: Determine if Minio is running on cluster nodes
shell: "ps aux | grep minio | grep -v grep"
register: minio_status_cluster
when: ansible_play_hosts | length > 1
run_once: false #此处如果为true,它只会在hosts列表中选一个ip仅测试一次,这明显是不符合我们要求的。我们要每个节点都验证一次
- name: Debug Minio status on single node
debug:
msg: "Minio is {{ 'running' if minio_status_single.stdout else 'not running' }} on single node"
when: ansible_play_hosts | length == 1
- name: Debug Minio status on cluster nodes
debug:
msg: "Minio is {{ 'running' if minio_status_cluster.stdout else 'not running' }} on cluster nodes"
when: ansible_play_hosts | length > 1
4.templates目录解析
该目录下存放的是jinja2模板文件.通俗易懂的就是将一个文件通过jinja2语法进行修改,结合vars目录下的变量,将文件修改成jinja2模板格式,然后通过vars目录传参或者是yml文件中传参来进行模板文件的替换。
下方的cluster_run.sh.j2模板文件中的变量来自于vars目录和hosts文件中指定的vars变量,结合jinja2语法,才会产生下方文件,提高灵活性,减少人为手动操作。
#!/bin/sh
export MINIO_ROOT_USER={{accessKey}}
export MINIO_ROOT_PASSWORD={{ secretKey }}
TIME=`date +%Y-%m-%d_%T`
MINIO_OPTS="--console-address :9001 --address :8021" #指定minio-ui的访问端口和minio服务端口
nohup {{HOME}}/minio server $MINIO_OPTS {% for host in groups.minioHost %}http://{{host}}{{DATA_DIR}} {% endfor %} > {{HOME}}/minio_server_"$TIME".log 2>&1 &
echo $! > {{HOME}}/minio.pid
5.vars目录解析
该目录下存放的是全局变量文件,通过“{{参数名}}”方式来进行传参,它的格式是key:value
HOME: "/export/server/minio"
DATA_DIR: "/export/data/minio_data"
Package_Name: "minio-RELEASE_2023_05_18-1.x86_64.rpm"
6.minio.yml入口文件解析
- hosts: minioHost
pre_tasks: ##在开始前对ip列表进行断言,即对ip是否存活进行验证,如果有一台验证不过,则会停止执行
- name: Check ALL hosts are reacheable before doing the release
assert:
that:
- ansible_play_hosts == groups.minioHost
fail_msg: 1 or more host is UNREACHABLE
success_msg: ALL hosts are REACHABLE, go on
run_once: yes
roles:
- minio
三、验证测试
首先进行单节点minio部署测试
1、指定hosts文件,测试yml语法是否存在问题
[root@python2 ansiblePlaybook]# vim hosts
[minioHost]
192.168.56.130
#192.168.56.132
[minioHost:vars]
accessKey=OpsMinIO
secretKey=OpsAdmin0815
#检测yml文件语法是否存在问题
[root@python2 ansiblePlaybook]# ansible-playbook minio.yml -C
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
[WARNING]: Could not match supplied host pattern, ignoring: minioHost
PLAY [minioHost] ****************************************************************************************************************************************
skipping: no hosts matched
PLAY RECAP **********************************************************************************************************************************************
2、执行minio单节点安装
[root@python2 ansiblePlaybook]# ansible-playbook -i hosts minio.yml
至此,单节点minio通过playbook的方式部署成功
3、执行集群minio安装
[root@python2 ansiblePlaybook]# ansible-playbook -i hosts minio.yml
至此,minio集群安装验证也没有问题