【ansible】通过role角色部署lnmp架构

时间:2024-02-23 16:22:07

目录

一、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中实现代码的复用。