目录

一、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/ -ptouch /etc/ansible/group_vars/all #文件名自己定义,引用的时候注意(3)在 roles 目录中分别创建以各角色名称命名的目录,如 httpd、mysqlmkdir /etc/ansible/roles/httpdmkdir /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.ymltouch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml(6)修改 site.yml 文件,针对不同主机去调用不同的角色vim /etc/ansible/site.yml---- hosts: webserversremote_user: rootroles: - httpd- hosts: dbserversremote_user: rootroles: - mysql (7)运行 ansible-playbookcd /etc/ansibleansible-playbook site.yml

四、实操

步骤一:完成目录的准备

[root@localhost ansible]#lsansible.cfghostsplaybookroles[root@localhost ansible]#cd roles/[root@localhost roles]#mkdir nginx mysql php[root@localhost roles]#lsmysqlnginxphp[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/defaultsfileshandlersmetataskstemplatesvars[root@localhost roles]#ls nginx/defaultsfileshandlersmetataskstemplatesvars[root@localhost roles]#ls php/defaultsfileshandlersmetataskstemplatesvars[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 firewalldservice: name=firewalldstate=stoppedenabled=no- name: disable selinuxcommand: '/sbin/setenforce 0'ignore_errors: yes- name: disabled selinux foreverreplace: path=/etc/selinux/configregexp=enforcingreplace=disabledafter=loaded#拷贝nginx.repo文件- name: copy nginx yum repo filecopy: src=nginx.repodest=/etc/yum.repos.d/nginx.repo#安装nginx- name: install nginxyum: name={{pkg}}#创建nginx的工作目录- name: create root dirfile: path={{root_dir}} state=directory#根据template模板文件生成nginx的配置文件- name: nginx config filetemplate: src=nginx.conf.j2 dest=/etc/nginx/nginx.confnotify: "reloaded nginx"#启动nginx服务- name: start nginxsystemd: name={{server}} state=started enabled=yes

5.准备handlers目录的main.yaml文件

- name: reload nginxsystemd: 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.rpmyum -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]#lsinit.yamlmain.yaml[root@localhost tasks]#vim main.yaml - name: shutdown firewalld#调用关闭防火墙和selinux的yaml文件- include: "init.yaml"#复制mysql的repo文件- name: copy mysql57-community-releasecopy: src=mysql-community.repo dest=/etc/yum.repos.d/mysql-community.repo- name: modify mysql reporeplace: path=/etc/yum.repos.d/mysql-community.repo regexp="gpgcheck=1" replace="gpgcheck=0"#安装mysql- name: yum mysql-community-serveryum: name={{pkg}} state=present- name: start mysqlservice: name={{server}} enabled=true state=started#完成mysql初始化- name: init mysqlshell: 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 dirfile: name={{root_dir}} state=directory- name: start rpcbindservice: name=rpcbind state=started- name: start nfsservice: name=nfs state=started- name: mount nfsmount: src={{nginx_addr}}:{{root_dir}} path={{root_dir}} state=mounted fstype=nfs opts="defaults,_netdev"#安装php- name: install php reposhell: rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm && rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpmignore_errors: true- name: yum phpyum: 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 useruser: name={{user_name}} create_home=no shell=/sbin/nologin- name: php config filereplace: path=/etc/php.ini regexp=";date.timezone =" replace="date.timezone = Asia/Shanghai"notify: "reload php-fpm"- name: modify user and group in www.confreplace: path=/etc/php-fpm.d/www.conf regexp="apache" replace="{{user_name}}"notify: "reload php-fpm"- name: modify listen addr in www.confreplace: 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.confreplace: path=/etc/php-fpm.d/www.conf regexp="127.0.0.1" replace="{{nginx_addr}}"notify: "reload php-fpm"- name: start php-fpmservice: name={{server}} state=started enabled=yes

3.完成handlers目录yaml文件编写

[root@localhost handlers]#vim main.yaml - name: reload php-fpmsystemd: name={{server}} state=reloaded

步骤五:完成playbook剧本调用roles模块编写

准备网页文件,进行测试

五、总结,roles角色的作用?

playbook剧本中的每一个paly看做一个角色,将各个角色的tasks任务、vars变量、handler触发动作、template模板文件以及copy或script的相关文件放到指定角色的目录中统一管理,在需要的时候,编写palybook通过roles角色进行调用即可。

也就是说:roles角色可以在playbook中实现代码的复用。