目录
一、roles模块的介绍
二、roles的目录层次
2.1 roles 内各目录含义解释
三、在一个playbook中使用roles模块的步骤
四、实操
步骤一:完成目录的准备
步骤二:完成nginx的roles创建和测试
1.准备nginx.repo文件到files子目录中
2.完成vars目录中的main.yaml文件的编写 准备相应的变量
3.准备templates子目录中的.j2模板文件
4.准备tasks目录的main.yaml文件
5.准备handlers目录的main.yaml文件
先完成nginx的测试
步骤三:完成MySQL的roles创建和测试
1.先准备mysql的repo文件
2.完成变量的编写
3.完成tasks目录的main.yaml文件编写
步骤四:完成php的roles创建和测试
1.先完成php的vars变量目录的main.yaml文件编写
2.完成php的tasks目录main.yaml文件编写
3.完成handlers目录yaml文件编写
步骤五:完成playbook剧本调用roles模块编写
准备网页文件,进行测试
五、总结,roles角色的作用?
一、roles模块的介绍
roles用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令引入即可。
简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷的include它们的一种机制。roles一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。主要使用场景代码复用度较高的情况下。
二、roles的目录层次
cd /etc/ansible/
tree roles/
roles/
├── web/ #相当于 playbook 中的 每一个 play 主题
│ ├── files/ #用来存放由 copy 模块或 script 模块调用的文件。
│ ├── templates/ #用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件。
│ ├── tasks/ #此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件。
│ ├── handlers/ #此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作。
│ ├── vars/ #此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。
│ ├── defaults/ #此目录应当包含一个 main.yml 文件,用于为当前角色设定默认变量。 这些变量具有所有可用变量中最低的优先级,并且可以很容易地被任何其他变量覆盖。所以生产中我们一般不在这里定义变量
│ └── meta/ #此目录应当包含一个 main.yml 文件,用于定义此角色的元数据信息及其依赖关系。
└── db/
├── files/
├── templates/
├── tasks/
├── handlers/
├── vars/
├── defaults/
└── meta/
2.1 roles 内各目录含义解释
●files
用来存放由 copy 模块或 script 模块调用的文件。
●templates
用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件。
●tasks
此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件。
●handlers
此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作。
●vars
此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。
●defaults
此目录应当包含一个 main.yml 文件,用于为当前角色设定默认变量。 这些变量具有所有可用变量中最低的优先级,并且可以很容易地被任何其他变量覆盖。所以生产中我们一般不在这里定义变量
●meta
此目录应当包含一个 main.yml 文件,用于定义此角色的元数据信息及其依赖关系。
三、在一个playbook中使用roles模块的步骤
(1)创建以 roles 命名的目录
mkdir /etc/ansible/roles/ -p #yum装完默认就有
(2)创建全局变量目录(可选)
mkdir /etc/ansible/group_vars/ -p
touch /etc/ansible/group_vars/all #文件名自己定义,引用的时候注意
(3)在 roles 目录中分别创建以各角色名称命名的目录,如 httpd、mysql
mkdir /etc/ansible/roles/httpd
mkdir /etc/ansible/roles/mysql
(4)在每个角色命名的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建
mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}
(5)在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件,千万不能自定义文件名
touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
(6)修改 site.yml 文件,针对不同主机去调用不同的角色
vim /etc/ansible/site.yml
---
- hosts: webservers
remote_user: root
roles:
- httpd
- hosts: dbservers
remote_user: root
roles:
- mysql
(7)运行 ansible-playbook
cd /etc/ansible
ansible-playbook site.yml
四、实操
步骤一:完成目录的准备
[root@localhost ansible]#ls
ansible.cfg hosts playbook roles
[root@localhost ansible]#cd roles/
[root@localhost roles]#mkdir nginx mysql php
[root@localhost roles]#ls
mysql nginx php
[root@localhost roles]#mkdir mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
[root@localhost roles]#mkdir nginx/{files,templates,tasks,handlers,vars,defaults,meta} -p
[root@localhost roles]#mkdir php/{files,templates,tasks,handlers,vars,defaults,meta} -p
[root@localhost roles]#ls mysql/
defaults files handlers meta tasks templates vars
[root@localhost roles]#ls nginx/
defaults files handlers meta tasks templates vars
[root@localhost roles]#ls php/
defaults files handlers meta tasks templates vars
[root@localhost roles]#touch mysql/{defaults,vars,tasks,meta,handlers}/main.yaml
[root@localhost roles]#touch nginx/{defaults,vars,tasks,meta,handlers}/main.yaml
[root@localhost roles]#touch php/{defaults,vars,tasks,meta,handlers}/main.yaml
修改hosts文件 定义主机清单
步骤二:完成nginx的roles创建和测试
1.准备nginx.repo文件到files子目录中
2.完成vars目录中的main.yaml文件的编写 准备相应的变量
3.准备templates子目录中的.j2模板文件
4.准备tasks目录的main.yaml文件
#关闭防火墙和selinux
- name: disabled firewalld
service: name=firewalld state=stopped enabled=no
- name: disable selinux
command: '/sbin/setenforce 0'
ignore_errors: yes
- name: disabled selinux forever
replace: path=/etc/selinux/config regexp=enforcing replace=disabled after=loaded
#拷贝nginx.repo文件
- name: copy nginx yum repo file
copy: src=nginx.repo dest=/etc/yum.repos.d/nginx.repo
#安装nginx
- name: install nginx
yum: name={{pkg}}
#创建nginx的工作目录
- name: create root dir
file: path={{root_dir}} state=directory
#根据template模板文件生成nginx的配置文件
- name: nginx config file
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: "reloaded nginx"
#启动nginx服务
- name: start nginx
systemd: name={{server}} state=started enabled=yes
5.准备handlers目录的main.yaml文件
- name: reload nginx
systemd: name={{server}} state=reloaded
先完成nginx的测试
因为这是分布式部署 那么还需要将nginx的根目录共享给php
步骤三:完成MySQL的roles创建和测试
1.先准备mysql的repo文件
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql57-community-release-el7-10.noarch.rpm
2.完成变量的编写
3.完成tasks目录的main.yaml文件编写
单独准备一个init.yaml文件 用于被调用
[root@localhost tasks]#vim init.yaml
[root@localhost tasks]#ls
init.yaml main.yaml
[root@localhost tasks]#vim main.yaml
- name: shutdown firewalld
#调用关闭防火墙和selinux的yaml文件
- include: "init.yaml"
#复制mysql的repo文件
- name: copy mysql57-community-release
copy: src=mysql-community.repo dest=/etc/yum.repos.d/mysql-community.repo
- name: modify mysql repo
replace: path=/etc/yum.repos.d/mysql-community.repo regexp="gpgcheck=1" replace="gpgcheck=0"
#安装mysql
- name: yum mysql-community-server
yum: name={{pkg}} state=present
- name: start mysql
service: name={{server}} enabled=true state=started
#完成mysql初始化
- name: init mysql
shell: passd=$(grep "password" /var/log/mysqld.log | awk '{print $NF}') && mysql -uroot -p"$passd" --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'Admin@123';" && mysql -uroot -pAdmin@123 -e "grant all privileges on *.* to root@'%' identified by 'Admin@123' with grant option;"
ignore_errors: true
步骤四:完成php的roles创建和测试
1.先完成php的vars变量目录的main.yaml文件编写
2.完成php的tasks目录main.yaml文件编写
#调用init.yaml文件 关闭防火墙和selinux
- include: "init.yaml"
#创建网页根目录,完成nfs挂载
- name: crate web root dir
file: name={{root_dir}} state=directory
- name: start rpcbind
service: name=rpcbind state=started
- name: start nfs
service: name=nfs state=started
- name: mount nfs
mount: src={{nginx_addr}}:{{root_dir}} path={{root_dir}} state=mounted fstype=nfs opts="defaults,_netdev"
#安装php
- name: install php repo
shell: rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm && rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
ignore_errors: true
- name: yum php
yum: name=php72w,php72w-cli,php72w-common,php72w-devel,php72w-embedded,php72w-gd,php72w-mbstring,php72w-pdo,php72w-xml,php72w-fpm,php72w-mysqlnd,php72w-opcache state=latest
- name: create php user
user: name={{user_name}} create_home=no shell=/sbin/nologin
- name: php config file
replace: path=/etc/php.ini regexp=";date.timezone =" replace="date.timezone = Asia/Shanghai"
notify: "reload php-fpm"
- name: modify user and group in www.conf
replace: path=/etc/php-fpm.d/www.conf regexp="apache" replace="{{user_name}}"
notify: "reload php-fpm"
- name: modify listen addr in www.conf
replace: path=/etc/php-fpm.d/www.conf regexp="127.0.0.1:9000" replace="{{php_addr}}:{{php_port}}"
notify: "reload php-fpm"
- name: modify allowed_clients in www.conf
replace: path=/etc/php-fpm.d/www.conf regexp="127.0.0.1" replace="{{nginx_addr}}"
notify: "reload php-fpm"
- name: start php-fpm
service: name={{server}} state=started enabled=yes
3.完成handlers目录yaml文件编写
[root@localhost handlers]#vim main.yaml
- name: reload php-fpm
systemd: name={{server}} state=reloaded
步骤五:完成playbook剧本调用roles模块编写
准备网页文件,进行测试
五、总结,roles角色的作用?
把playbook剧本中的每一个paly看做一个角色,将各个角色的tasks任务、vars变量、handler触发动作、template模板文件以及copy或script的相关文件放到指定角色的目录中统一管理,在需要的时候,编写palybook通过roles角色进行调用即可。
也就是说:roles角色可以在playbook中实现代码的复用。