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_install
2、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
回复@笛声 @笛声:那就好 阿里的主机这方面应该还是能保障的