ansible——roles 角色

一、概述

1.roles角色简介

roles用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令引入即可。

简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷的include它们的一种机制。roles一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。主要使用场景代码复用度较高的情况下。

2.roles 角色的作用

把playbook剧本里的各个play看作为角色,将各个角色的tasks任务、vars变量、templates模板、files

3.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创建lnmp

1.准备工作

1.1创建以roles命名的目录

bash 复制代码
mkdir /etc/ansible/roles/ -p    #yum装完默认就有

1.2在 roles 目录中分别创建以各角色名称命名的目录

bash 复制代码
mkdir /etc/ansible/roles/nginx
mkdir /etc/ansible/roles/mysql
mkdir /etc/ansible/roles/php

1.3在每个角色命名的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建

bash 复制代码
mkdir /etc/ansible/roles/nginx/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta}

1.4在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件,千万不能自定义文件名

bash 复制代码
touch /etc/ansible/roles/nginx/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml

2.利用roles创建nginx

2.1编辑nginx任务

bash 复制代码
cd /etc/ansible/roles/nginx/tasks
vim main.yml
#引用该目录下的init.yml
- include: init.yml

- name: nginx.repo
  copy: src=nginx.repo dest=/etc/yum.repos.d/

- name: install nginx
  yum: name={{pkg}} state=latest

- name: nginx congrustion file
  template: src=default.conf.j2 dest=/etc/nginx/conf.d/default.conf
  notify: "reload nginx"         #以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作

- name: index.php
  copy: src=index.php dest={{root_dir}}

- name: start nginx
  service: name={{svc}} state=started enabled=yes

#编写关闭防火墙任务
vim init.yml
- name: disable firewalld
  service: name=firewalld state=started enabled=no

- name: stop selinux
  shell: "/usr/sbin/setenforce 0"
  ignore_errors: true

2.2定义触发条件时执行的动作

bash 复制代码
#handlers目录用于定义此角色中触发条件时执行的动作。
cd /etc/ansible/roles/nginx/handlers
vim main.yml
- name: reload nginx
  service: name={{svc}} state=reloaded

2.3编辑nginx模板文件

bash 复制代码
准备default.conf文件
cp default.conf /etc/ansible/roles/nginx/templates/default.conf.j2
cd /etc/ansible/roles/nginx/templates
vim default.conf.j2
--2行--
listen       {{nginxip_port}};
--8行--
root   {{root_dir}};
--29行--
 location ~ \.php$ {
          root           {{root_dir}};
          fastcgi_pass   {{passip_port}};
          fastcgi_index  index.php;
          fastcgi_param  SCRIPT_FILENAME  {{root_dir}}$fastcgi_script_name;
          include        fastcgi_params;
      }

2.4定义变量

bash 复制代码
#变量放在vars目录下
cd /etc/ansible/roles/nginx/vars
vim main.yml
pkg: nginx
svc: nginx
nginxip_port: 192.168.88.20:80
nginx_servername: www.web.com
root_dir: /usr/share/nginx/html
passip_port: 192.168.88.30:9000

2.5准备复制文件

bash 复制代码
#files目录存放由 copy 模块或 script 模块调用的文件
cd /etc/ansible/roles/nginx/files
vim index.php
<?php
phpinfo();
?>

vim nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

3.利用roles创建php

3.1编辑php任务

bash 复制代码
cd /etc/ansible/roles/php/tasks
vim main.yml
- name: rpm -Uvh php
  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

- name: install php
  yum: name={{pkg}} state=latest

- name: create user
  user: name=php shell=/sbin/nologin create_home=no

- name: create directory
  file: name=/usr/share/nginx/html state=directory

- name: copy index.php
  copy: src=index.php dest=/usr/share/nginx/html

- name: php.ini
  replace: path=/etc/php.ini regexp=";date.timezone =" replace="date.timezone = Asia/Shanghai"
  notify: "reload php"

- name: user group
  replace: path=/etc/php-fpm.d/www.conf regexp="apache" replace="php"
  notify: "reload php"

- name: listen
  replace: path=/etc/php-fpm.d/www.conf regexp="listen = 127.0.0.1:9000" replace="listen = 192.168.88.30:9000"
  notify: "reload php"

- name:  allow_clients
  replace: path=/etc/php-fpm.d/www.conf regexp="listen.allowed_clients = 127.0.0.1" replace="listen.allowed_clients = 192.168.88.20"
  notify: "reload php"

- name: start php-fpm
  service: name=php-fpm state=started enabled=yes

3.2定义触发条件时执行的动作

bash 复制代码
vim /etc/ansible/roles/php/handlers/main.yml
- name: reload php
  service: name=php-fpm state=reloaded

4.利用roles创建mysql

4.1编辑mysql剧本

bash 复制代码
vim /etc/ansible/roles/mysql/tasks/main.yml
- name: remove mariadb*
  yum: name=mariadb* state=absent

- name: rpm -ivh mysql
  shell: rpm -ivh https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm
  ignore_errors: true

- name: mysql.repo
  shell: sed -i 's/gpgcheck=1/gpgcheck=0/' /etc/yum.repos.d/mysql-community.repo

- name: install mysql
  yum: name=mysql-server

- name: start mysql
  service: name=mysqld.service state=started enabled=yes

- name: password.sh
  script: password.sh

- name: remove mysql57
  yum: name=mysql57-community-release-el7-10.noarch state=absent

4.2编辑脚本

bash 复制代码
vim /etc/ansible/roles/mysql/files/password.sh

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;"

chmod +x roles/mysql/files/password.sh

5.修改hosts文件

bash 复制代码
vim /etc/ansible/hosts
[webservers]
192.168.88.20

[dbservers]
192.168.88.30

[mysql]
192.168.88.40

6.编辑lnmp的playbook并执行

bash 复制代码
cd /etc/ansible
vim lnmp2.yml
- name: nginx
  hosts: webservers
  roles:
  - nginx

- name: php
  hosts: dbservers
  roles:
  - php

- name: mysql
  hosts: mysql
  roles:
  - mysql

ansible-playbook lnmp2.yml
相关推荐
风清再凯2 天前
自动化工具ansible,以及playbook剧本
运维·自动化·ansible
IT乌鸦坐飞机2 天前
ansible部署数据库服务随机启动并创建用户和设置用户有完全权限
数据库·ansible·centos7
遇见火星15 天前
如何使用Ansible一键部署MinIO集群?
ansible
粥周粥15 天前
ANSIBLE
ansible
码农101号15 天前
Linux中ansible模块补充和playbook讲解
linux·运维·ansible
码农101号15 天前
Linux的Ansible软件基础使用讲解和ssh远程连接
ansible
烟雨书信17 天前
ANSIBLE运维自动化管理端部署
运维·自动化·ansible
碎碎-li17 天前
ANSIBLE(运维自动化)
运维·自动化·ansible
@donshu@20 天前
Linux运维-ansible-python开发-获取inventroy信息
linux·运维·ansible
Kendra91923 天前
Ansible
ansible