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
相关推荐
有毒的教程3 天前
Ansible批量操作自动化完整教程:批量部署服务、配置同步、软件更新实战
运维·自动化·ansible
Hy行者勇哥8 天前
用Cursor智能编写Ansible/Terraform脚本,打通CI/CD链路
ci/cd·ansible·terraform
芷栀夏10 天前
飞牛NAS怎么部署Immich?家庭照片自动备份与远程访问教程
服务器·nginx·ansible
悠然南风20 天前
Ansible常见模块总结及LDAP Role 编写与调试
ansible
祺风挽楠1 个月前
ansible编辑
网络·ansible
芳心粽伙饭1 个月前
Ansible课后作业
ansible
烁3471 个月前
Ansible初识
ansible
烁3471 个月前
Ansible安装部署调试
ansible
烁3471 个月前
Ansible命令
ansible
小义_1 个月前
【Ansible】(三)基础配置与连接设置
云原生·ansible