在之前我们知道了playbook,类似于shell的脚本,playbook适用于一些不太麻烦的部署任务,比如说使用playbook安装mysql,那么我们直接写一个playbook文件即可。可是如果我们还要搭建mysql的主从架构呢?一个playbook就会显得会力不从心,这个时候我们可以使用roles。roles就是有相互关联功能的集合。相对于playbook,roles更适合于大项目的编排和架构。

在使用roles之前,简单说明一下include的用法,在playbook中可以引入另外的playbook脚本,这时候可以使用include命令。

  -  include test.yml

整体架构

roles主要依赖于目录命名和摆放,默认tasks/main.yml是所有任务的入口,所以使用roles的过程可以理解为目录规范化命名的过程。roles的目录架构是确定的,如下:

roles/                     #roles目录下面存放对应的role
└── master_slave_mysql     #目录名以role名命名,目录下面是每个role都包含的文件,若是对应的文件没有使用可以不创建
    ├── files              #files用于文件传输,一些压缩包可以放在这里,在playbook中直接调用即可  
    ├── handlers           #role项目所有使用的handlers写在这里
    ├── tasks              #主要的逻辑文件,也就是playbook文件执行的任务 
    ├── templates          #templates也用于文件的传输,但是这里的文件可以使用jija2模板语法,而files传输的文件不能使用jija2模板语法
    └── vars               #定义变量

#角色下面的每个文件中【files和templates目录下面不需要】,都必须需要一个main.yml文件,作为该模块的调度入口。而对应的逻辑文件可以写在对应的模块下面,
#然后在main.yml文件中使用include语句引入。

先来看一下一个完整role的所有目录结构:

[root@docker5 ~]# tree roles/
roles/
└── master_slave_mysql
    ├── files
    │   ├── initmysql7.sh                                  #MySQL安装的初始化脚本
    │   └── mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz     #MySQL安装包  
    ├── handlers
    │   ├── all_handlers.yml                               #roles所有的handlers,若是所需handlers可以分多个文件写入,
    │   └── main.yml                                       #在main.yml文件使用include语句,引入所有的handlers文件
    ├── tasks                                              #
    │   ├── add_repl_user.yml                              #添加复制用户的playbook文件
    │   ├── change_passwd.yml                              #MySQL5.7初始化后,需要修改密码,这里是修改密码的playbook文件
    │   ├── install_mysql.yml                              #安装mysql的playbook  
    │   ├── main.yml                                       #在main中引入对应的playbook,注意引入的顺序    
    │   └── set_replication.yml                            #配置主从复制的playbook 
    ├── templates
    │   ├── my.cnf.j2                                      #MySQL的配置文件模板
    │   ├── test.retry                                     #后面这两个是我测试的时候的文件,不用管
    │   └── test.yml
    └── vars                                               #定义变量
        └── main.yml                                       #定义变量文件,也可以单独写成playbook的形式,然后再引入,因为这里变量比较少,就直接写入了main.yml  

6 directories, 13 files

在和roles同级目录的结构中,我们还需要定义个yml文件,作为项目的调度入口。

[root@docker5 ~]# cat site.yml 
---
 # 该项目的调度入口
 - hosts: all
   remote_user: root

   roles:
     - master_slave_mysql
[root@docker5 ~]# lsroles    site.yml 

#执行的时候直接执行入口文件即可, 注意需要定义inventory文件。 [root@docker5
~]# ansible-playbook site.yml

下面我们来一个个解析这个简单的项目。

inventory文件

默认是读取/etc/ansible/hosts中的内容,其内容如下:【需要说明的是,这里虽然定义了多个分组,但是在后面代码中没怎么使用】

[root@docker5 ~]# cat /etc/ansible/hosts 
[all]
10.0.102.212 
10.0.102.200 
10.0.102.162

[master]
10.0.102.162

[slave]
10.0.102.200
10.0.102.212

files模块

这各模块主要用于文件的传输,这个项目中我们在里面放了一个初始化脚本和mysql5.7的安装包。初始化脚本就是一条很简单的命令,写在这里是为了说明files的用法。

初始化脚本如下:

[root@docker5 files]# cat !$
cat initmysql7.sh
#!/bin/bash
./bin/mysqld --user=mysql --datadir=/data/mysql --initialize
[root@docker5 files]# 


#在playbook中引用时,可以直接引用,而不是使用绝对路径
 - name: copy the mysql install pkg
   copy: src={{ install_pkg_name }}.tar.gz dest=/usr/local/src #src直接引用即可
- name: init mysql script: chdir={{ basedir_name }} initmysql7.sh #执行这个脚本,而不是使用绝对路径

handlers模块

handlers的作用不再说明,这里只说明handlers在roles中的编排。

[root@docker5 files]# cd ../handlers/
[root@docker5 handlers]# ls
all_handlers.yml  main.yml
[root@docker5 handlers]# cat all_handlers.yml         #直接写入对应的handlers即可,
---
 - name: start mysql
   service: name=mysqld state=started

 - name: restart mysql
   service: name=mysqld state=restarted

 - name: flush privileges
   shell:  chdir=/usr/local/mysql/bin ./mysql  -u{{ login_user }} -p{{ login_passwd }} -e "flush privileges"
[root@docker5 handlers]# cat main.yml 
---
 - include: all_handlers.yml
---
 - name: start mysql
   service: name=mysqld state=started

 - name: restart mysql
   service: name=mysqld state=restarted

 - name: flush privileges
   shell:  chdir=/usr/local/mysql/bin ./mysql  -u{{ login_user }} -p{{ login_passwd }} -e "flush privileges"
all_handlers.yml

相关文章:

  • 2022-12-23
  • 2021-09-29
  • 2021-06-23
  • 2022-01-01
  • 2021-10-12
  • 2021-04-01
  • 2021-06-30
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-08-21
  • 2022-12-23
  • 2022-01-26
  • 2022-01-06
  • 2021-05-29
  • 2022-12-23
相关资源
相似解决方案