在之前我们知道了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"