【自动化剧本】Role角色

目录

一、Roles模块

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

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

  • 假如我们现在有3个被管理主机,第一个要配置成httpd,第二个要配置成haproxy服务器,第三个要配置成MySQL(mariadb)服务器。我们如何来定义playbook?

    第一个play用到第一个主机上,用来构建httpd,第二个play用到第二个主机上,用来构建haproxy。这些个play定义在playbook中比较麻烦,将来也不利于模块化调用,不利于多次调用。比如说后来又加进来一个主机,这第3个主机既是httpd服务器,又是haproxy服务器,我们只能写第3个play,上面写上安装httpd和haproxy。这样playbook中的代码就重复了。

    为了避免代码重复,可以定义一个角色叫httpd,第二个角色叫haproxy,并使用roles实现代码重复被调用。

1.1roles的目录结构

bash 复制代码
cd /etc/ansible/
tree roles/

roles/

├── web/ #相当于 playbook 中的 每一个 play 主题

│ ├── files/

│ ├── templates/

│ ├── tasks/

│ ├── handlers/

│ ├── vars/

│ ├── defaults/

│ └── meta/

└── db/

├── files/

├── templates/

├── tasks/

├── handlers/

├── vars/

├── defaults/

└── meta/

1.2roles 内各目录含义解释

bash 复制代码
●files
用来存放由 copy 模块或 script 模块调用的文件。

●templates
用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件。

●tasks
此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件。

●handlers
此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作。

●vars
此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。

●defaults
此目录应当包含一个 main.yml 文件,用于为当前角色设定默认变量。 这些变量具有所有可用变量中最低的优先级,并且可以很容易地被任何其他变量覆盖。所以生产中我们一般不在这里定义变量

●meta
此目录应当包含一个 main.yml 文件,用于定义此角色的元数据信息及其依赖关系。

1.3在一个 playbook 中使用 roles 的步骤

bash 复制代码
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

二、使用Role编写LNMP剧本

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

touch /etc/ansible/roles/httpd/{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.1 搭建Nginx角色

在files目录李准备文件


准备关闭防护墙脚本

bash 复制代码
vim /etc/ansible/roles/nginx/tasks/init.yml
- name: disable firewalld
  service: name=firewalld  state=stopped  enabled=no

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

准备剧本文件

bash 复制代码
/etc/ansible/roles/nginx/tasks/main.yml 
- include: "init.yml" #引入另外一个剧本

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

- name: install nginx
  yum: name=nginx

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

- name: copy index.conf
  copy: src=default.conf dest=/etc/nginx/conf.d/default.conf
  notify: restart nginx

- name: start nginx
  service: name=nginx state=started enabled=yes

2.2搭建Mysql角色

在files目录下准备配置文件

在tasks目录下准备剧本

bash 复制代码
vim /etc/ansible/roles/nginx/tasks/main.yml
 - include: "init.yml"

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

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

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

- name: start msql
  service: name=mysqld state=started enabled=yes

- name: grep passwd
  script: passwd.sh

2.3搭建php角色

在files目录下准备配置文件

在tasks目录下准备配置配置文件

bash 复制代码
vim /etc/ansible/roles/nginx/tasks/main.yml
- include: "init.yml"

- name: install yum 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"

- name: install php
  shell: yum -y install php72w php72w-cli php72w-common php72w-devel php72w-embedded php72w-gd php72w-mbstring php72w-pdo php72w-xml php72w-fpm php72w-mysqlnd php72w-opcache
  ignore_errors: true

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

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

- name: php.ini
  copy: src=php.ini dest=/etc/php.ini

- name: www.conf
  copy: src=www.conf dest=/etc/php-fpm.d/www.conf

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

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

2.4lnmp剧本

bash 复制代码
vim /etc/ansible/lnmp.yml
- name: nginx play
  hosts: webservers
  remote_user: root
  roles:
  - nginx

- name: mysql play
  hosts: mysql
  remote_user: root
  roles:
  - mysql
  tags:
  - ddd

- name: php play
  hosts: dbservers
  remote_user: root
  roles:
  - php
  tags:
  - aaa
相关推荐
Pythonliu71 小时前
茴香豆 + Qwen-7B-Chat-Int8
linux·运维·服务器
你疯了抱抱我1 小时前
【RockyLinux 9.4】安装 NVIDIA 驱动,改变分辨率,避坑版本。(CentOS 系列也能用)
linux·运维·centos
小O_好好学3 小时前
CentOS 7文件系统
linux·运维·centos
哲伦贼稳妥3 小时前
一天认识一个硬件之机房地板
运维·网络·经验分享·其他
john_hjy3 小时前
11. 异步编程
运维·服务器·javascript
x晕x4 小时前
Linux dlsym符号查找疑惑分析
linux·运维·服务器
活跃的煤矿打工人4 小时前
【星海saul随笔】Ubuntu基础知识
linux·运维·ubuntu
tangdou3690986555 小时前
两种方案手把手教你多种服务器使用tinyproxy搭建http代理
运维·后端·自动化运维
北京智和信通5 小时前
云平台和虚拟化智慧运维监控,全面提升故障感知与处置能力
运维·虚拟化·云平台·虚拟机监控
fasewer5 小时前
第五章 linux实战-挖矿 二
linux·运维·服务器