当前位置: 首页 > article >正文

Ansible 实战:Roles,运维的 “魔法函数”

一、介绍

你现在已经学过tasks和handlers,那么,最好的playbook组织方式是什么呢?答案很简单:使用roles!roles基于一种已知的文件结构,能够自动加载特定的vars_files、tasks以及handlers。通过roles对内容进行分组,我们可以轻松地与其他用户共享roles。

二、作用解释

我可以预先构建出nginx、apache、mysql、redis等一系列的角色,当我要构建一个LNMP时,我可以去调用nginx和mysql角色,当我要构建一个LAMP时,我可以去调用apache和mysql角色,又或者说我要构建一个redis的哨兵集群或者分配集群,我可以去调用redis角色。角色就好比计算机语言里面的函数,当我需要的时候不需要再去重复的去构建,而是直接拿过来使用,这样简洁方便还不浪费时间。

三、使用方法

1.存放角色的位置

/etc/ansible/roles

2.角色目录子目录构成与功能

  • files: 存放模块调用的文件(如:copy 和 script的文件,nginx/apache的html网页)。
  • templates:存放模板文件(比如nginx/apache的配置文件)。
  • tasks:任务存放的目录,至少包含一个main.yml的文件,该目录下也可以有其他.yml文件,但是需要在main.yml文件中用include指令将其他.yml文件包含进来(类似 puppet)。
  • handlers:存放相关触发执行器的目录,至少应该包含一个main.yml的文件,文件中定义了触发器的任务清单,该目录下也可以有其他.yml文件,但是需要在main.yml文件中用include指令将其他.yml文件包含进来 。
  • vars:  变量存放的目录,至少应该包含一个main.yml的文件,文件中定义了相关的变量及其值,该目录下也可以有其他.yml文件,但是需要在main.yml文件中用include指令将其他.yml文件包含进来 。
  • defaults: 默认变量存放的目录,至少应该包含一个main.yml的文件,文件中定义了此角色使用的默认变量,该目录下也可以有其他.yml文件,但是需要在main.yml文件中用include指令将其他.yml文件包含进来 。
  • meta: 用于存放此角色元数据,至少应该包含一个main.yml的文件,文件中定义当前角色的特殊设定及其依赖关系, 该目录下也可以有其他.yml文件,但是需要在main.yml文件中用include指令将其他.yml文件包含进来 。

(default和meta我们用到的很少,用的最多的就是files、templates、tasks、handlers、vars) 

 3.如何调用定义的角色?

(比如定义了一个apache的角色,下面是调用的方法) 

- hosts: webserver          

remote_user: root          

roles:             

- apache

四、创建一个roles 

我们这里做一个nginx的角色,内容是nginx的源码包安装,只不过这一次不是打包到本机,编译好后再拷贝到被管控端,这一次是在被管控端直接下载nginx源码包然后编译安装。 

 1.创建角色的目录结构

[root@ansible ~]# mkdir -pv /etc/ansible/roles/nginx/{file,templates,tasks,handlers,vars,default,

meta}        #创建一个nginx角色

(先写tasks,如果我们在写任务的时候需要用到文件了,就去file目录下准备文件,需要用到变量了,就去vars下准备变量)

2.定义任务 

[root@ansible tasks]# cd /etc/ansible/roles/nginx/
[root@ansible nginx]# vim tasks/main.yaml

- name: remove yum sourceshell: rm -rf /etc/yum.repos.d/*
- name: update yum removeshell: curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
- name: get wget infoshell: rpm -qa | grep wget | awk -F'-' '{print $1}'register: wgetinfo
- name: install wgetyum: name=wget state=presentwhen: wgetinfo != "wget"
- name: get nginx packageshell: wget https://nginx.org/download/nginx-1.27.4.tar.gz -P /tmp
- name: install dep nginxyum:name:- "gcc"- "gcc-c++"- "pcre-devel"- "zlib-devel"state: present
- name: unzip nginxshell: tar -xvf /tmp/nginx-1.27.4.tar.gz -C /usr/local/src
- name: get nginx infoshell: ls -d /usr/local/nginxregister: nginx_infoignore_errors: yes
- name: install nginxshell: cd /usr/local/src/nginx-1.27.4&&./configure --user=nginx --prefix=/usr/local/nginx&&make&&make installwhen: nginx_info.rc == 2

- name: remove yum source        #移除被管控端的源
  shell: rm -rf /etc/yum.repos.d/*
- name: update yum source        #更新被管控端的源        
  shell: curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo        #因为不确定有没有wget工具,所以统一使用curl
- name: get wget info        #获取wget的信息判断是否安装了wget
  shell: rpm -qa | grep wget | awk -F'-' '{print $1}'
  register: wgetinfo
- name: install wget        #wget安装:根据获取的wget信息判断是否安装
  yum: name=wget state=present
  when: wgetinfo != "wget"
- name: get nginx package        #在nginx官网获取nginx源码包
  shell: wget https://nginx.org/download/nginx-1.27.4.tar.gz -P /tmp
- name: install dep nginx        #安装nginx的依赖
  yum:
    name:
    - "gcc"
    - "gcc-c++"
    - "pcre-devel"
    - "zlib-devel"
    state: present
- name: unzip nginx        #解压nginx源码包到/usr/local/src目录下
  shell: tar -xvf /tmp/nginx-1.27.4.tar.gz -C /usr/local/src
- name: get nginx info        #获取nginx信息判断被管控端是否安装了nginx
  shell: ls -d /usr/local/nginx
  register: nginx_info
  ignore_errors: yes        #跳过错误,继续执行任务
- name: install nginx        #编译安装nginx:根据获取的nginx信息判断是否安装
  shell: cd /usr/local/src/nginx-1.27.4&&./configure --user=nginx --prefix=/usr/local/nginx&&make&&make install
  when: nginx_info.rc == 2 

3.测试

[root@ansible nginx]# vim /playbook/roles_test.yaml        #调用nginx角色

- hosts: webserversremote_user: rootroles:- nginx

[root@ansible tasks]# ansible-playbook /playbook/roles_test.yaml 

 

 (测试成功!)

五、files目录的使用 

1.修改角色使用files 

[root@ansible nginx]# vim files/test.html        #在file文件创建网页测试文件

<h1>Ansibel Nginx test</h1>

 (files目录下的文件可以直接src = test.html使用,集中管理这些文件)

[root@ansible nginx]# vim tasks/main.yaml 

- name: copy test pagecopy: src = test.html dest=/usr/local/nginx/html

 (在之前写的角色最后加上这几行)

2.测试

[root@ansible nginx]# ansible-playbook /playbook/roles_test.yaml 

(访问成功!)

六、handlers目录的使用

1.修改角色使用handler

当nginx的配置文件发生改动时重启nginx服务 

[root@ansible nginx]# cp /usr/local/nginx/conf/nginx.conf /etc/ansible/roles/nginx/files/

(其实是应该放到templates目录下的,这里放到files目录下是为了做展示,后面会介绍templates目录的相关使用)

#准备一份配置文件 

[root@ansible nginx]# vim tasks/main.yaml        #修改角色

- name: copy configcopy: src=nginx.conf dest=/usr/local/nginx/confnotify:- restart nginx

(在之前写的角色最后加上这几行)

[root@ansible nginx]# vim handlers/main.yaml        #编写handlers

- name: restart nginxshell: /usr/local/nginx/sbin/nginx -s reload

2.测试

[root@client-1 ~]# /usr/local/nginx/sbin/nginx        #启动被管控端的nginx服务

[root@client-2 ~]# /usr/local/nginx/sbin/nginx

[root@client-3 ~]# /usr/local/nginx/sbin/nginx 

配置文件没有发生改变

[root@ansible nginx]# ansible-playbook /playbook/roles_test.yaml 

(服务没有被重启) 

当配置文件发生了改变

[root@ansible nginx]# vim file/nginx.conf         #修改端口为8080

listen       8080;

[root@ansible nginx]# ansible-playbook /playbook/roles_test.yaml 

(服务被重启)

七、templates目录的使用

 1.解释

nginx的配置文件里面有这样的一条参数用于设置nginx服务器工作进程的数量,这是需要根据服务器的硬件配置(如 CPU 核心数、内存大小)来配置的,假如我有的nginx服务器有2个CPU核心,有的服务器有4个CPU核心,而我files目录下的nginx配置文件设置worker_processes为4,那对于只有两个CPU核心的服务器来说就不支持了,这时候templates目录的作用就体现出来了,将nginx的配置文件放到templates目录下面,templates可以根据ansible webserver -m setup查到的变量来设置参数,拿上面的例子来说吧,查到被控端主机有2个cup核心,templates就可以把worker_processes设置成2,查到4个就可以设置成4,所以templates目录的功能还是很重要的。

2.修改角色使用templates


[root@ansible nginx]# mv files/nginx.conf templates/nginx.conf.j2

[root@ansible nginx]# vim templates/nginx.conf.j2

worker_processes  {{ ansible_processor_vcpus }};

 [root@ansible nginx]# vim tasks/main.yaml

- name: copy configtemplate: src=nginx.conf.j2 dest=/usr/local/nginx/conf/nginx.confnotify:- restart nginx

3.测试

[root@client-1 ~]# lscpu | grep CPU\(s\): 

(每台主机的CPU核心数量为4) 

[root@client-1 ~]# cat /usr/local/nginx/conf/nginx.conf | grep worker_processes

(没有修改之前 ) 

 [root@ansible nginx]# ansible-playbook /playbook/roles_test.yaml

(执行剧本)

[root@client-1 ~]# cat /usr/local/nginx/conf/nginx.conf | grep worker_processes 

 

  

(修改后,核心的数量发生改变且等于当前的CPU核心数量)


ansible自动化运维工具的介绍-CSDN博客 

深度剖析 ansible:从部署基础到模块运用及剧本编写-CSDN博客 

Ansible Playbook 进阶探秘:Handlers、变量、循环及条件判断全解析-CSDN博客 

相关文章:

Ansible 实战:Roles,运维的 “魔法函数”

一、介绍 你现在已经学过tasks和handlers&#xff0c;那么&#xff0c;最好的playbook组织方式是什么呢&#xff1f;答案很简单&#xff1a;使用roles&#xff01;roles基于一种已知的文件结构&#xff0c;能够自动加载特定的vars_files、tasks以及handlers。通过roles对内容进…...

CVAT安装和使用(Windows)

必要组件安装 WSL2 Docker Git Chrome Install WSL2 (Windows subsystem for Linux) refer to this official guide. WSL2 requires Windows 10, version 2004 or higher. After installing WSL2, install a Linux Distribution of your choice. 安装 WSL2&#xff08;适用…...

Spring 中的 bean 生命周期

&#x1f331; 一、什么是 Bean 生命周期&#xff1f; 在 Spring 容器中&#xff0c;一个 Bean 从“创建 → 初始化 → 使用 → 销毁”&#xff0c;经历了完整的生命周期。 Spring 提供了 多个扩展点 让你可以在这些阶段做事情&#xff0c;比如注入资源、日志记录、连接资源、清…...

关于JVM和OS中的指令重排以及JIT优化

关于JVM和OS中的指令重排以及JIT优化 前言&#xff1a; 这东西应该很重要才对&#xff0c;可是大多数博客都是以讹传讹&#xff0c;全是错误&#xff0c;尤其是JVM会对字节码进行重排都出来了&#xff0c;明明自己测一测就出来的东西&#xff0c;写出来误人子弟… 研究了两天&…...

微软推出首款量子计算芯片Majorana 1

全球首款拓扑架构量子芯片问世&#xff0c;2025年2月20日&#xff0c;经过近20年研究&#xff0c;微软推出了首款量子计算芯片Majorana 1&#xff0c;其宣传视频如本文末尾所示。 微软表示&#xff0c;开发Majorana 1需要创造一种全新的物质状态&#xff0c;即所谓的“拓扑体”…...

数组练习题总结

一、求出数组中的最大值let arr [1, 2, 5, 7];let max 0;for (i 0; i < arr.length; i) {// console.log(max);if (max < arr[i]) {max arr[i];}}console.log(max); 首先生成一个数组&#xff0c;设一个变量为保存最大值&#xff0c;写一个循环&#xff0c;在循环里写…...

Kotlin 中的 `reified` 关键字全解析:保留类型信息 + 优化高阶函数的双重魔法

在使用 Kotlin 编写泛型函数时&#xff0c;你是否遇到过这样的尴尬&#xff1a;你想判断某个对象是不是泛型类型 T&#xff0c;结果却发现代码根本编译不过&#xff1f;这是因为 Kotlin 和 Java 一样&#xff0c;泛型在运行时会被类型擦除。 为了解决这个问题&#xff0c;Kotl…...

在CPU服务器上部署Ollama和Dify的过程记录

在本指南中&#xff0c;我将详细介绍如何在CPU服务器上安装和配置Ollama模型服务和Dify平台&#xff0c;以及如何利用Docker实现这些服务的高效部署和迁移。本文分为三大部分&#xff1a;Ollama部署、Dify环境配置和Docker环境管理&#xff0c;适合需要在本地或私有环境中运行A…...

【计网】TCP 协议详解 与 常见面试题

三次握手、四次挥手的常见面试题 不用死记&#xff0c;只需要清楚三次握手&#xff0c;四次挥手的流程&#xff0c;回答的时候心里要记住&#xff0c;假设网络是不可靠的 问题(1)&#xff1a;为什么关闭连接时需要四次挥手&#xff0c;而建立连接却只要三次握手&#xff1f; 关…...

Java 基础-31-枚举-认识枚举

在Java编程语言中&#xff0c;枚举&#xff08;Enum&#xff09;是一种特殊的类&#xff0c;它允许一组固定的常量。它们非常适合用来表示一组固定的值&#xff0c;比如星期几、季节、颜色等。枚举自Java 5开始引入&#xff0c;为定义常量提供了一种更强大和方便的方式。本文将…...

7.4 SVD 的几何背景

一、SVD 的几何解释 SVD 将矩阵分解成三个矩阵的乘积&#xff1a; ( 正交矩阵 ) ( 对角矩阵 ) ( 正交矩阵 ) (\pmb{正交矩阵})\times(\pmb{对角矩阵})(\pmb{正交矩阵}) (正交矩阵)(对角矩阵)(正交矩阵)&#xff0c;用几何语言表述其几何背景&#xff1a; ( 旋转 ) ( 伸缩 )…...

低延迟云网络的核心技术

低延迟云网络通过架构优化、协议创新、硬件加速等多维度技术手段,将数据传输延迟降低至毫秒级甚至微秒级。 1. 网络架构优化 1.1 扁平化网络Leaf-Spine 架构 减少网络层级,缩短数据转发路径(如数据中心内部一跳可达)。 扁平化网络Leaf-Spine(叶子-脊椎)架构是一种现代…...

C++的多态-上

目录 多态的概念 多态的定义及实现 1.虚函数 2. 多态的实现 2.1.多态构成条件 2.2.虚函数重写的两个例外 (1)协变(基类与派生类虚函数返回值类型不同) (2)析构函数的重写(基类与派生类析构函数的名字不同) 2.3.多态的实现 2.4.多态在析构函数中的应用 2.5.多态构成条…...

内存与显存:从同根生到殊途异路的科技演进

在现代计算机的世界里&#xff0c;内存和显存是两个不可或缺的硬件组件。它们看似功能相近&#xff0c;却在发展历程中逐渐分道扬镳&#xff0c;各自服务于不同的计算需求。今天&#xff0c;我们将从一根内存条和一块显卡入手&#xff0c;深入探讨内存与显存的异同&#xff0c;…...

手搓多模态-04 归一化介绍

在机器学习中&#xff0c;归一化是一个非常重要的工具&#xff0c;它能帮助我们加速训练的速度。在我们前面的SiglipVisionTransformer 中&#xff0c;也有用到归一化层&#xff0c;如下代码所示&#xff1a; class SiglipVisionTransformer(nn.Module): ##视觉模型的第二层&am…...

【C++】第八节—string类(上)——详解+代码示例

hello&#xff0c;又见面了&#xff01; 云边有个稻草人-CSDN博客 C_云边有个稻草人的博客-CSDN博客——C专栏&#xff08;质量分高达97&#xff01;&#xff09; 菜鸟进化中。。。 目录 一、为什么要学习string类&#xff1f; 1.1 C语言中的字符串 1.2 面试题(暂不做讲解) …...

Java 数组与 ArrayList 核心区别解析:从源码到实战!!!

&#x1f31f; Java 数组与 ArrayList 核心区别解析&#xff1a;从源码到实战 &#x1f4a1; Java 开发者必读&#xff01; 数组&#xff08;Array&#xff09;和 ArrayList 是 Java 中最常用的数据存储结构&#xff0c;但它们的底层设计、性能表现和适用场景差异显著。本文通…...

【易飞】易飞批量选择品号处理方法,工作效率提升300%

开窗选择品号方式要么手动输入,要么以什么开头、包含、从A物料到B物料查询后返回的有规律的品号。对于没有规律且大量品号的处理方式是否有便捷的方法呢? 尤其在通常在查询多阶材料清单,查询库存明细表,整批变更元件等如品号无规律情况下,只能一个个选择,无法通过EXCEL方…...

【最新版】啦啦外卖v64系统独立版源码+全部小程序APP端+安装教程

一.系统介绍 啦啦外卖跑腿平台独立版&#xff0c;使用的都知道该系统功能非常强大&#xff0c;应该说是目前外卖平台功能最全的一套系统。主要是功能非常多&#xff0c;拿来即用&#xff0c;包括客户端小程序、配送端小程序、商户端小程序&#xff0c;还有对应四个端的APP源码…...

iproute2 工具集使用详解

目录 一、iproute2 核心命令&#xff1a;ip二、常用功能详解1. 管理网络接口&#xff08;link 对象&#xff09;2. 管理 IP 地址&#xff08;address 对象&#xff09;3. 管理路由表&#xff08;route 对象&#xff09;4. 管理 ARP 和邻居缓存&#xff08;neigh 对象&#xff0…...

项目总结之常问的一些问题

1.项目功能介绍&#xff0c;重难点 重难点&#xff1a; mock工具使用&#xff08;涉及到的三方接口过多&#xff0c;由于网络等原因无法调通&#xff0c;所以测试的时候&#xff0c;采用mock工具来模拟返回接口真正调用后响应数据&#xff09; 2.项目负责哪部分&#xff1f;…...

C语言查漏补缺:占位符篇

占位符篇 1. 整数类型2. 字符类型3. 浮点数类型4. 指针类型5. 字符串6. 修饰符 1. 整数类型 %d / %i&#xff1a;用于 int&#xff08;有符号十进制整数&#xff09;。int num -42; printf("%d", num); // 输出: -42%u&#xff1a;用于 unsigned int&#xff08;无…...

cut命令用法

cut 是 Linux/Unix 系统中一个用于按列提取文本内容的命令&#xff0c;常用于处理结构化文本&#xff08;如 CSV、日志、配置文件等&#xff09;。它通过分隔符、字符位置或字节位置来切割文本&#xff0c;提取指定部分。 核心功能 按字段&#xff08;列&#xff09;提取&#…...

java 正则表达式优化

1&#xff0c;什么是正则表达式 正则表达式使用一些特定的元字符来检索、匹配以及替换符合规则的字符串。 构造正则表达式语法的元字符&#xff0c;由普通字符、标准字符、限定字符&#xff08;量词&#xff09;、定位字符&#xff08;边界字符&#xff09;组成 普通字符 字母[…...

AD(Altium Designer)更换PCB文件的器件封装

一、确定是否拥有想换的器件PCB封装 1.1 打开现有的原理图 1.2 确定是否拥有想换的器件PCB文件 1.2.1 如果有 按照1.3进行切换器件PCB封装 1.2.2 如果没有 按照如下链接进行添加 AD(Altium Designer)已有封装库的基础上添加器件封装-CSDN博客https://blog.csdn.net/XU15…...

【文献研究】含硼钢中BN表面偏析对可镀性的影响

《B 添加钢的溶融 Zn めっき性に及ぼす BN 表面析出の影響》由JFE公司田原大輔等人撰写。研究聚焦 B 添加钢在低露点退火时 BN 形成对镀锌性的影响&#xff0c;对汽车用高强度钢镀锌工艺优化意义重大。通过多组对比实验&#xff0c;结合多种分析手段&#xff0c;明确了相关因素…...

React学习-css

W3Schools Tryit Editor CSS 教程 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明: p { /* 这是个注释 */ color:red; text-align:center; }选择器 CSS Id: #para1{ text-align:center; color:red; } Class: .center {text-align:center;} p…...

AIP-215 API特定proto

编号215原文链接AIP-215: API-specific protos状态批准创建日期2018-10-01更新日期2018-10-01 API通常使用API特定proto定义&#xff0c;偶尔依赖通用组件。保持API相互隔离可以避免版本问题和客户端库打包问题。 指南 所有特定于某个API的protos 必须 位于带有主版本号的包…...

C++ 获取一整行(一行)字符串并转换为数字

代码很简单&#xff0c;主要是自己总是忘记&#xff0c;记录一下&#xff1a; #include <iostream> #include <cstdlib> #include <cstring>#include <string> #include <vector> #include <sstream>using namespace std;void print_int_…...

数据分析-Excel-学习笔记Day1

Day1 复现报表聚合函数&#xff1a;日期联动快速定位区域SUMIF函数SUMIFS函数环比、同比计算IFERROR函数混合引用单元格格式总结汇报 拿到一个Excel表格&#xff0c;首先要看这个表格的构成&#xff08;包含了哪些数据&#xff09;&#xff0c;几行几列&#xff0c;每一列的名称…...