Ansible教程(8)roles角色配置教程
一、Ansible Roles介绍
Ansible的roles功能也叫做角色,它是一种让多个playbook协同工作的实现方法。roles将playbook中的vars变量、handlers、tasks任务、模块及处理器都进行了拆分,分别放置于各自目录然后进行引用的一种机制。通常一些复杂场景才会使用roles,让代码复用度更高。比如上架50台服务器,其中20台是数据库服务器,另外30台是Web服务器,那么就可以建立2个roles来各自负责对应的机器。
二、Ansible Roles目录结构
Ansible Roles的目录结构必须严格按照以下格式,并且每个目录中必须存在一个main.yml文件
cd /etc/ansible/roles
mkdir mysql/{files,handlers,tasks,templates,vars,meta} -p
tree
-- mysql #roles名称
|-- files #存放的模板文件
|-- handlers #触发任务定义文件
|-- tasks #具体任务定义文件
|-- templates #模板文件
|-- vars #变量定义文件
|-- meta #依赖关系Roles目录作用说明
· roles/$project:project替换为真实的项目名称,如nginx或mysql
· files:存放需要被copy等模块调用的文件,如网页文件、安装包,使用copy模块时会自动从该目录找文件,所以写相对路径可以
· template:template模块会自动在此目录中寻找jinja2模板文件
· tasks:该目录必须存在,定义具体的任务
· handlers:用于定义handlers,没有handlers的话不用创建
· vars:用于定义此角色用到的变量,没有变量的话不用创建
· meta:用于配置依赖关系,比如运行LVS roles时需要先运行Keepalived的roles
三、Ansible Roles部署MySQL应用实例
1、创建一个playbook的入口文件,声明需要引用一个role为mysql_install
cat mysql.yml
- hosts: "{{ mysql_host }}"
gather_facts: true
roles:
- role: mysql_install2、mysql_install role结构

3、task配置
- name: "下载 MySQL-5.7.33 安装包"
copy:
src: "{{ mysql_version }}-linux-glibc2.12-x86_64.tar.gz"
dest: /usr/local/src/
- name: "安装包检查"
stat:
path: "/usr/local/{{ mysql_version }}-linux-glibc2.12-x86_64"
register: mysql_check
- name: "解压安装包"
unarchive:
src: "/usr/local/src/{{ mysql_version }}-linux-glibc2.12-x86_64.tar.gz"
dest: "/usr/local/"
remote_src: yes
when: not mysql_check.stat.exists
- name: "创建软连接"
file:
src: "/usr/local/{{ mysql_version }}-linux-glibc2.12-x86_64"
dest: "{{ mysql_dir }}"
state: link
- name: "配置系统环境变量"
lineinfile:
path: /etc/profile
line: "export PATH={{ mysql_dir }}/bin:$PATH"
insertafter: EOF
regexp: "^export PATH={{ mysql_dir }}/bin:$PATH"
state: present
notify: Load profile
- name: "创建MySQL用户"
user:
name: mysql
system: yes
createhome: no
state: present
- name: "检查数据目录"
stat:
path: "/data/mysql{{ mysql_port }}"
register: dir_check
- name: "目录冲突检查"
fail:
msg: "/data/mysql{{ mysql_port }} 已存在,任务停止"
when: dir_check.stat.exists
- name: "创建实例目录"
file:
path: "/data/mysql{{ mysql_port }}"
state: directory
when: not dir_check.stat.exists
- name: "创建数据目录"
file:
path: "/data/mysql{{ mysql_port }}/{{ item }}"
state: directory
loop:
- log
- data
- tmp
- name: "创建日志目录"
file:
path: "/data/mysql{{ mysql_port }}/log/{{ item }}"
state: directory
loop:
- slowlog
- binlog
- relaylog
- name: "修改目录权限"
file:
path: "/data/mysql{{ mysql_port }}"
state: directory
recurse: yes
owner: mysql
group: mysql
- name: "生成Server_ID"
set_fact:
server_id: "{{ ansible_facts['default_ipv4']['address'].split('.')[-3:] | join('') | int | abs }}"
- name: "生成配置文件"
template:
src: "my.cnf.j2"
dest: "/etc/my{{ mysql_port }}.cnf"
- name: "初始化服务"
shell: " {{ mysql_dir }}/bin/mysqld --defaults-file=/etc/my{{ mysql_port }}.cnf --initialize --user=mysql"
- name: "启动服务"
shell: " {{ mysql_dir }}/bin/mysqld_safe --defaults-file=/etc/my{{ mysql_port }}.cnf &"
- name: "获取初始密码"
shell: "grep password /data/mysql{{ mysql_port }}/log/error.log |awk '{print $NF}'"
register: mysql_default_password
- name: "生成Root密码重置脚本"
template:
src: "change_root_password.sh.j2"
dest: "/tmp/change_root_password.sh"
- name: "重置Root密码"
shell: "bash /tmp/change_root_password.sh"
- name: "生成DBA密码重置脚本"
template:
src: "change_dba_password.sh.j2"
dest: "/tmp/change_dba_password.sh"
- name: "重置DBA密码"
shell: "bash /tmp/change_dba_password.sh"4、vars配置
mysql_version: mysql-5.7.33
mysql_dir: /usr/local/mysql
mysql_root_password: '123456'
dba_password: '123456'
memory_size: "{{ (ansible_facts['memtotal_mb']['real'] * 0.6 / 1024) | round(0) | int }}"5、handlers配置
- name: Load profile shell: source /etc/profile
6、template和files主要存放了需要引用变量信息的my.cnf配置文件以及安装包等,略
7、使用说明
· mysql_host:需要安装mysql服务的机器IP
· mysql_port:mysql实例的端口
· memory_size:为buffer_pool分配的内存大小,单位为G
ansible-playbook -e "mysql_host=172.19.0.220 mysql_port=3306" mysql.yaml ansible-playbook -e "mysql_host=172.19.0.220 mysql_port=3306" memory_size=20" mysql.yaml
四、ansible-galaxy
提供了一个类似Github这样的源码库功能,里面有很多已经开发好的roles可以直接使用或者参考
ansible-galaxy list #列出已经安装的galaxy ansible-galaxy install geerlingguy.redis #安装一个galaxy角色 ansible-galaxy remove geerlingguy.redis #删除一个galaxy角色
安装好一个roles后可以看到在相应的目录中会生成一个以角色名命名的目录,并且还有许多子目录和yml文件,这些都是构成roles的成员。复制一份角色目录就会被Ansible自动识别成一个新的角色








评论
X先生
回复站长,页面的貌似有点问题
TangLu
回复@X先生 @X先生:额 具体是什么问题呢
刀刀
回复这网站是你一个人维护的吗,内容全部自己写啊
TangLu
回复@刀刀 @刀刀:是的 全部自己写的
笛声
回复网站干货满满,不过网站速度稍慢,不管是主页还是文章页
TangLu
回复@笛声 @笛声:谢谢支持 用的万网的虚拟主机 主要是便宜
笛声
回复@TangLu @TangLu:是我网络问题 用手机网络访问很快
TangLu
回复@笛声 @笛声:那就好 阿里的主机这方面应该还是能保障的