Ansible教程(8)roles角色配置教程

TangLu 系统运维 2023-11-14 23210 8

一、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/$projectproject替换为真实的项目名称,如nginx或mysql

· files存放需要被copy等模块调用的文件,如网页文件、安装包,使用copy模块时会自动从该目录找文件,所以写相对路径可以

· template:template模块会自动在此目录中寻找jinja2模板文件

· tasks:该目录必须存在,定义具体的任务

· handlers用于定义handlers,没有handlers的话不用创建

· vars用于定义此角色用到的变量,没有变量的话不用创建

· meta:用于配置依赖关系,比如运行LVS roles时需要先运行Keepalived的roles

roles.png


三、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结构

role1.jpg


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自动识别成一个新的角色

roles1.jpg


评论

精彩评论
2021-06-23 17:26:02

站长,页面的貌似有点问题

2021-06-25 11:54:56

@X先生 @X先生:额 具体是什么问题呢

2021-04-13 14:39:01

这网站是你一个人维护的吗,内容全部自己写啊

2021-04-13 17:49:23

@刀刀 @刀刀:是的 全部自己写的

2018-05-06 18:18:18

网站干货满满,不过网站速度稍慢,不管是主页还是文章页

2018-05-06 18:20:56

@笛声 @笛声:谢谢支持 用的万网的虚拟主机 主要是便宜

2018-05-07 06:42:29

@TangLu @TangLu:是我网络问题 用手机网络访问很快

2018-05-10 09:05:20

@笛声 @笛声:那就好 阿里的主机这方面应该还是能保障的