自动化之ansible(二)
一、ansible中playbook(剧本)
官方文档:
Ansible playbooks — Ansible Community Documentation
1、playbook的基本结构
一个基本的playbook由以下几个主要部分组成
hosts: 定义要执行任务的主机组或主机。
become: 是否需要使用超级用户权限(如 sudo)。
vars: 在 Playbook 中定义变量。tasks: 任务列表,指定要执行的操作。
注:playbook:由一个play或者多个play组成,一个paly可以包含多个task任务
ansible中playbook的文件结尾是.yml格式后缀
示例:
---
- name: Playbook名称hosts: 主机组become: true # 是否需要使用管理员权限(sudo)vars: # 可选部分,定义变量variable_name: valuetasks: # 任务列表- name: 任务1名称module_name: # Ansible模块名称parameter1: value1parameter2: value2- name: 任务2名称module_name:parameter1: value1name: Playbook或Play的名称,通常用于描述Playbook的作用。
hosts: 要运行任务的主机组。可以是inventory中定义的主机组,也可以是单个主机(如localhost)
become: 设为true时,任务将以管理员权限(sudo)执行。
vars: 定义变量,在Playbook中全局可用。
tasks: 包含一个或多个任务,每个任务由名称和模块组成。每个任务都会通过特定的模块来执行指定的操作。
2、安装和启动nginx
[master-61 root ~/playbook] # cat nginx.yml
---
- name: install nginxhosts: webbecome: truetasks:- name: install nginxyum:name: nginxstate: present- name: start nginxservice:name: nginxstate: startedenabled: true
在执行playbook脚本时报错了如下:
web7主机出现系统的文件系统被挂载为只读模式,导致没法执行yml脚本


解决方法:登录上web-7主机,将文件系统重新挂载为读写模式
检查文件系统的挂载状态,确认是否为只读模式
[web-7 root ~] # mount | grep ' / '
/dev/mapper/centos-root on / type xfs (ro,relatime,attr2,inode64,noquota)ro 表示只读,这就意味着文件系统被挂载为只读模式重新挂载为读写模式,重新挂载根文件系统(/)为读写模式
[web-7 root ~] # mount -o remount,rw /
[web-7 root ~] # df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 979M 0 979M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.5M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/mapper/centos-root 37G 2.1G 35G 6% /
/dev/sda1 1014M 140M 875M 14% /boot
tmpfs 199M 0 199M 0% /run/user/0
[web-7 root ~] # ls /root/
anaconda-ks.cfg .bash_history .bash_profile .cshrc .pki/ .tcshrc
.ansible/ .bash_logout .bashrc network.sh .ssh/ .viminfo
重新执行playbook
先执行命令检查一下是否正常
[master-61 root ~/playbook] # ansible-playbook -C nginx.yml PLAY [install nginx] **********************************************************************************TASK [Gathering Facts] ********************************************************************************
ok: [172.16.1.7]TASK [install nginx] **********************************************************************************
changed: [172.16.1.7]TASK [start nginx] ************************************************************************************
changed: [172.16.1.7]PLAY RECAP ********************************************************************************************
172.16.1.7 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
执行剧本
[master-61 root ~/playbook] # ansible-playbook nginx.yml PLAY [install nginx] **********************************************************************************TASK [Gathering Facts] ********************************************************************************
ok: [172.16.1.7]TASK [install nginx] **********************************************************************************
changed: [172.16.1.7]TASK [start nginx] ************************************************************************************
changed: [172.16.1.7]PLAY RECAP ********************************************************************************************
172.16.1.7 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
验证web-7机器是否安装启动成功

二、ansible中roles角色
1、roles介绍
roles相当于是在ansible中playbooks的目录组织结构。它可以将任务(tasks)、变量(vars)、文件(files)、模板(templates)、处理器(handlers)、默认值(defaults)、以及其他资源分组到一个单独的目录中,提升代码的可维护性。
2、roles目录结构如下
my_role/
├── defaults/
│ └── main.yml # 默认变量
├── files/ # 存放静态文件
├── handlers/
│ └── main.yml # 任务完成后的处理器
├── meta/
│ └── main.yml # 角色的元数据,例如依赖关系
├── tasks/
│ └── main.yml # 主要的任务文件
├── templates/ # 存放 Jinja2 模板文件
├── tests/
│ └── test.yml # 测试脚本
└── vars/└── main.yml # 存放变量
每个目录的用途如下:
defaults/main.yml:定义角色的默认变量,变量值可以被 Playbook 或其它角色覆盖。
files/:存放一些静态的文件,可以通过 copy 或 template 模块来部署到目标主机。
handlers/main.yml:用于定义触发特定条件时执行的处理器。通常是服务的重启、重载等操作。
meta/main.yml:描述角色的元数据,如角色的依赖关系、作者信息等。
tasks/main.yml:包含角色的任务,定义了这个角色执行的具体工作。
templates/:存放 Jinja2 模板文件。你可以在角色中使用模板来动态生成文件。
tests/test.yml:用于测试角色是否正常工作,通常会包含一些验证任务,确保角色行为符合预期。
vars/main.yml:存放角色的变量,这些变量在 Playbook 中可以覆盖。
3、创建roles角色
命令:ansible-galaxy init 角色名
(11:04:31)[master-61 root /etc/ansible/roles] # ansible-galaxy init my_role
- Role my_role was created successfully
(11:04:35)[master-61 root /etc/ansible/roles] #
(11:04:38)[master-61 root /etc/ansible/roles] # tree my_role/
my_role/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars└── main.yml8 directories, 8 files
4、使用roles角色
roles角色的执行流程:
定义tasks任务 --> 定义jinja2模板,作为配置文件用 --> 定义变量 --> 定义触发 --> 定义roles的yml文件 -->检查yml语法 --> 执行roles.yml文件 --> 查看nginx服务启动状态
4.1定义任务,在task/main.yml文件中定义任务
(14:45:56)[master-61 root /etc/ansible/roles/nginx] # cat tasks/main.yml ---
- name: "Install wget"yum:name: "wget"state: "present"- name: "Download nginx package"get_url:url: "http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.18.0-1.el7.ngx.x86_64.rpm"dest: "/etc/ansible/roles/nginx/files/"
- name: "Copy nginx package to /tmp"copy:src: "nginx-1.18.0-1.el7.ngx.x86_64.rpm"dest: "/tmp/nginx-1.18.0-1.el7.ngx.x86_64.rpm"- name: "Install nginx from rpm package"yum:name: "/tmp/nginx-1.18.0-1.el7.ngx.x86_64.rpm"state: "latest"- name: "Configure nginx"template:src: "nginx.conf.j2"dest: "/etc/nginx/nginx.conf"tags:- "nginxconf"notify:- "Reload nginx configuration"- name: "Start nginx service"service:name: "nginx"state: "started"enabled: true
4.2 定义templates生成配置文件
(16:23:43)[master-61 root /etc/ansible/roles/nginx] # cat templates/nginx.conf.j2
user nginx; # 设置 Nginx 服务的系统使用用户
worker_processes {{ ansible_processor_vcpus }}; # 工作进程数error_log /var/log/nginx/error.log warn; # Nginx 的错误日志
pid /var/run/nginx.pid; # Nginx 启动时的 PIDevents {worker_connections 1024; # 每个进程允许的最大连接数
}http { # HTTP 请求配置,一个 http 可以包含多个 serverinclude /etc/nginx/mime.types; # 定义 Content-Typedefault_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main; # 访问日志sendfile on; # 高效文件传输keepalive_timeout 65; # 客户端与服务端的超时时间server { # HTTP 服务,一个 server 可以配置多个 locationlisten {{ nginx_config.nginx_port }}; # 服务监听端口server_name localhost; # 主机名、域名location / {root /usr/share/nginx/html; # 页面存放目录index index.html index.htm; # 默认页面}error_page 500 502 503 504 /50x.html; # 错误页面重定向location = /50x.html {root /usr/share/nginx/html; # 页面存放的目录}}include /etc/nginx/conf.d/*.conf; # 包含其他配置文件
}
4.3定义变量,在vars/main.yml文件中定义变量
(14:49:48)[master-61 root /etc/ansible/roles/nginx] # vim vars/main.yml
---
nginx_config:nginx_port:888
4.4 定义触发
(16:25:55)[master-61 root /etc/ansible/roles/nginx] # cat handlers/main.yml
---
- name: reload new config service: name: nginxstatr: restarted
4.5定义剧本文件
(16:26:42)[master-61 root /etc/ansible/roles/nginx] # cat roles.yml
- hosts: webremote_user: rootroles: - nginx
4.6 检查yml文件语法是否正确,如果报错需要检查对应配置文件
(16:27:11)[master-61 root /etc/ansible/roles/nginx] # ansible-playbook --syntax-check roles.yml playbook: roles.yml
4.7 执行roles.yml文件
(10:48:31)[master-61 root /etc/ansible/roles/nginx] # ansible-playbook roles.yml PLAY [web] ********************************************************************************************TASK [Gathering Facts] ********************************************************************************
ok: [172.16.1.8]
ok: [172.16.1.7]TASK [nginx : Install wget] ***************************************************************************
ok: [172.16.1.7]
ok: [172.16.1.8]TASK [Download nginx package] *************************************************************************
ok: [172.16.1.7]
ok: [172.16.1.8]TASK [Install nginx from rpm package] *****************************************************************
ok: [172.16.1.7]
ok: [172.16.1.8]TASK [Configure nginx] ********************************************************************************
changed: [172.16.1.7]
changed: [172.16.1.8]TASK [Start nginx service] ****************************************************************************
changed: [172.16.1.7]
changed: [172.16.1.8]PLAY RECAP ********************************************************************************************
172.16.1.7 : ok=6 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.16.1.8 : ok=6 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
4.8 检查服务启动状态
web-7和web-8中nginx服务都正常启动


网页访问也正常


相关文章:
自动化之ansible(二)
一、ansible中playbook(剧本) 官方文档: Ansible playbooks — Ansible Community Documentation 1、playbook的基本结构 一个基本的playbook由以下几个主要部分组成 hosts: 定义要执行任务的主机组或主机。 become: 是否需要使用超级用户…...
QSNCTF-WEB做题记录
第一题,文章管理系统 来自 <天狩CTF竞赛平台> 描述:这是我们的文章管理系统,快来看看有什么漏洞可以拿到FLAG吧?注意:可能有个假FLAG哦 1,首先观察题目网站的结构和特征 这个一个文件管理系统&#x…...
Ruoyi-Vue 3.8.7集成积木报表JmReport和积木大屏JimuBI
Ruoyi-Vue 3.8.7集成积木报表JmReport和积木大屏JimuBI 一、版本 RuoYi-Vue版本:v3.8.7 JMreport报表版本: v1.9.4 JimuBI大屏版本:V1.9.4 二、数据库 积木数据库sql 下载后,使用数据库管理工具执行sql脚本,将需…...
OSPF(开放路径最短优先)
ospf优先级:内部优先级默认为10,外部优先级默认为150 1.ospf的三张表 (1)邻居表 <记录邻居状态和关系> (2)拓扑表 <链路状态数据库> (3)路由表 <对链路状态数据库进…...
请谈谈 Vue 中的响应式原理,如何实现?
一、Vue2响应式原理:Object.defineProperty的利与弊 实现原理: // 数据劫持核心实现 function defineReactive(obj, key, val) {const dep new Dep(); // 依赖收集容器Object.defineProperty(obj, key, {get() {if (Dep.target) { // 当前Watcher实例…...
亲测可用,IDEA中使用满血版DeepSeek R1!支持深度思考!免费!免配置!
作者:程序员 Hollis 之前介绍过在IDEA中使用DeepSeek的方案,但是很多人表示还是用的不够爽,比如用CodeChat的方案,只支持V3版本,不支持带推理的R1。想要配置R1的话有特别的麻烦。 那么,今天,给…...
jvm中各个参数的理解
MEMORY - MANAGERS 定义 MEMORY - MANAGERS即内存管理器,它是操作系统或软件系统中负责管理计算机内存资源的组件。从本质上来说,它是一种软件机制,旨在协调计算机系统中内存的分配、使用和回收等操作,确保系统能够高效、稳定地…...
【队列】循环队列(Circular Queue)详解
文章目录 一、循环队列简介二、循环队列的判空和判满三、循环队列的实现leetcode 622. 设计循环队列 一、循环队列简介 在实际开发中,队列是一种常用的数据结构,而循环队列(Circular Queue)则一般是一种基于数组实现的队列&#x…...
Deepseek快速做PPT
背景: DeepSeek大纲生成 → Kimi结构化排版 → 数据审查,细节调整 DeepSeek 拥有深度思考能力,擅长逻辑构建与内容生成,它会根据我们的问题进行思考,其深度思考能力当前测试下来,不愧为国内No.1,而且还会把中间的思考过程展示出来,大多时候会给出很多我们意想不到的思…...
DeepSeek掀起推理服务器新风暴,AI应用迎来变革转折点?
AI 浪潮下,推理服务器崭露头角 在科技飞速发展的当下,AI 是耀眼明星,席卷各行业,深刻改变生活与工作模式,从语音助手到医疗诊断、金融风险预测,AI 无处不在。其发展分数据收集整理、模型训练、推理应用三个…...
离线部署大模型:ollama+deepseek+open-webui
ollama 是一个开源的本地大语言模型运行框架,它提供了非常简单便捷的使用形式,让用户可以十分方便的在本地机器上部署和运行大型语言模型,从而实现免费离线的方式使用 LLM 能力,并确保私有数据的隐私和安全性。 1 ollama 安装 o…...
深入解析浏览器渲染全流程:从URL输入到页面渲染的底层原理与性能优化(附实战代码)
本文以https://example.com为例,逐层剖析浏览器从输入URL到页面渲染的完整链路,涵盖DNS解析、TCP/TLS握手、HTTP请求、DOM/CSSOM构建等核心阶段,结合代码示例与性能调优技巧,助你掌握浏览器底层运行机制。 一、导航阶段࿱…...
现代游戏UI架构深度解析——以UIController为核心的模块化界面管理系统
一、架构全景与设计哲学 本文将以重构后的UIController为核心,深入探讨Unity引擎下的高效UI管理方案。该体系采用"分层-分治"设计理念,通过界面生命周期管理、动态适配策略、资源优化机制三个维度的协同工作,构建了适应复杂交互需…...
Vue 项目中逐步引入 TypeScript 的类型检查
在现有的 Vue 项目中逐步引入 TypeScript 的类型检查 本文源于一道面试题:注:两种问法一个意思哈!! 问题一:“ 老项目Js写的,如何轻量方式享受 ts 类型?” 问题二:“如何 在现有的 …...
Git企业开发
Git(版本控制器) 在我们对于文档进行操作的时候,很多时候可能会出现多个文档,对这些文档进行多个版本的保存和记录就变成必要的。通俗的讲,就是记录每次的修改和记录版本迭代的管理系统。目前最主流的版本控制器就是G…...
DeepSeek预测25考研分数线
25考研分数马上要出了。 目前,多所大学已经陆续给出了分数查分时间,综合往年情况来看,每年的查分时间一般集中在2月底。 等待出成绩的日子,学子们的心情是万分焦急,小编用最近爆火的“活人感”十足的DeepSeek帮大家预…...
备战蓝桥杯 -牛客
习题-[NOIP2006]明明的随机数 1046-习题-[NOIP2006]明明的随机数_2021秋季算法入门班第一章习题:模拟、枚举、贪心 思路:这道题用stl的set,今天写这道题复习了一下set的用法: s.find(a) s.end()的意思是判断元素a是否存在于集…...
基于springboot校园健康系统的设计与实现(源码+文档)
大家好我是风歌,今天要和大家聊的是一款基于springboot的园健康系统的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于springboot校园健康系统的设计与实现的主要使用者管理员具有最高的权限,通…...
出现 [ app.json 文件内容错误] app.json: 在项目根目录未找到 app.json (env: Windows,mp 解决方法
目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 hbuilder X 执行代码的时候出现如下所示 [ app.json 文件内容错误] app.json: 在项目根目录未找到 app.json (env: Windows,mp,1.06.2412050; lib:...
设计模式教程:责任链模式(Chain of Responsibility Pattern)
责任链模式(Chain of Responsibility Pattern)是一种常用的设计模式,它属于行为型模式,主要解决的是多个对象处理一个请求时,如何解耦请求的发送者和接收者,以及如何将请求的处理职责分配给不同的对象。 1…...
【YOLOv8】损失函数
学习视频: yolov8 | 损失函数 之 5、类别损失_哔哩哔哩_bilibili yolov8 | 损失函数 之 6、定位损失 CIoU DFL_哔哩哔哩_bilibili 2.13、yolov8损失函数_哔哩哔哩_bilibili YOLOv8 的损失函数由类别损失和定位损失构成 类别损失:BCE Loss 定位损失…...
ollama修改监听ip: 0.0.0.0
确认Ollama绑定IP地址 默认情况下,Ollama可能仅监听本地回环地址(127.0.0.1)。要允许外部访问,需将其配置为监听所有IP(0.0.0.0)或指定IP(如10…19)。 修改启动命令(推荐…...
【Linux】【网络】Libevent 内部实现简略版
【Linux】【网络】Libevent 内部实现简略版 1 event_base结构–>相当于Reactor 在使用libevent之前,就必须先创建这个结构。 以epoll为例: 1.1evbase void* evbase-->epollop结构体(以epoll为例) libevent通过一个void…...
计算机网络抄手 运输层
一、运输层协议概述 1. 进程之间的通信 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。当网络边缘部分的两台主机使用网络核心部分的功能进行端到端的通信时&…...
MATLAB图像处理:图像分割方法
图像分割将图像划分为具有特定意义的子区域,是目标检测、医学影像分析、自动驾驶等领域的核心预处理步骤。本文讲解阈值分割、边缘检测、区域生长、聚类分割、基于图的方法等经典与前沿技术,提供MATLAB代码实现。 目录 1. 图像分割基础 2. 经典分割方…...
【机器学习】线性回归 多元线性回归
多元线性回归 V1.1多元线性回归一元线性回归与多元线性回归多元线性回归模型的误差衡量多元线性回归的最优解多元线性回归的解析解(标准数学解法)多元线性回归的解析解公式分析 多元线性回归的搜索解法 V1.1 加入链接会影响文章推荐权重,阅读…...
【VSCode】MicroPython环境配置
【VSCode】MicroPython环境配置 RT-Thread MicroPython 插件安装MicroPython 库文件配置结束语 RT-Thread MicroPython 插件安装 在 VSCode 拓展中搜索 “RT-Thread MicroPython” 并安装,详细配置步骤(修改 VSCode 默认终端、MicroPython 代码补全&…...
【python】网页批量转PDF
安装wkhtmltopdf 网站:wkhtmltopdf wkhtmltopdf http://www.baidu.com/ D:website1.pdf 安装pdfkit库 pip install pdfkit 批量转换代码 import os import pdfkit path_wkthmltopdf rE:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe config pdfkit.configu…...
基于Flask的租房信息可视化系统的设计与实现
【Flask】基于Flask的租房信息可视化系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 随着互联网的快速发展,租房市场日益繁荣,信息量急剧增加ÿ…...
Scrapy安装,创建Scrapy项目,启动Scrapy爬虫
Scrapy安装,创建Scrapy项目,启动Scrapy爬虫 1. 安装 Python2. 安装 Scrapy3. 验证安装4. 创建 Scrapy 项目5. 启动爬虫5.1 示例 总结 Scrapy 的安装方式比较简单,下面是基于 Python 环境的安装流程: 1. 安装 Python 首先&#x…...
