自动化之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: 是否需要使用超级用户…...

Docker+Dify部署DeepSeek-r1本地知识库
安装配置Docker Desktop 软件下载 Docker Desktop版本:4.38.0.181591 Docker Desktop下载地址:Docker: Accelerated Container Application Development 或者从这里下载:DockerDesktop-4.38.0.181591资源-CSDN文库 点击图下所示位置,下载windows-AMD64版本软件 启用Hy…...
C#基础:使用Linq进行简单去重处理(DinstinctBy/反射)
目录 一、示例代码 二、示例输出 三、注意雷点 四、全字段去重封装方法 1.封装 2.示例 一、示例代码 using System; using System.Collections.Generic; using System.Linq;public class Program {public static void Main(){// 创建一些示例实体对象var people new Li…...
HTML5 面试题
1. HTML5 新增了哪些重要特性? 语义化标签:这些标签有助于提高页面的可读性和可维护性。多媒体支持:HTML5 引入了 和 标签,可以直接嵌入音频和视频文件,无需依赖插件。本地存储:引入了 localStorage 和 se…...

【C++】优先级队列宝藏岛
> 🍃 本系列为初阶C的内容,如果感兴趣,欢迎订阅🚩 > 🎊个人主页:[小编的个人主页])小编的个人主页 > 🎀 🎉欢迎大家点赞👍收藏⭐文章 > ✌️ 🤞 …...

开关电源实战(一)宽范围DC降压模块MP4560
系列文章目录 文章目录 系列文章目录MP4560MP4560 3.8V 至 55V 的宽输入范围可满足各种降压应用 MOSFET只有250mΩ 输出可调0.8V-52V SW:需要低VF肖特基二极管接地,而且要靠近引脚,高压侧开关的输出。 EN:输入使能,拉低到阈值以下关闭芯片,拉高或浮空启动 COMP:Compens…...

Git是什么
简单介绍: Git是一个分布式版本控制系统,用于跟踪文件的更改,特别是在多人协作开发的环境中。 Key: 分布式 版本控制 系统 最常用于软件开发,但也可以用于管理任何类型的文件和文件夹。 Git帮助团队跟踪和管理文件的历史版本&a…...
双非计科毕业,二战未果想就业,选择嵌入式开发还是Java开发更合适?
今天给大家分享的是一位粉丝的提问,双非计科毕业,二战未果想就业,选择嵌入式开发还是Java开发更合适? 接下来把粉丝的具体提问和我的回复分享给大家,希望也能给一些类似情况的小伙伴一些启发和帮助。 同学提问&#x…...
性格测评小程序开发指南
目录 前言目录01 需求分析02 数据源设计03 搭建用户管理04 题库管理05 用户注册06 用户注册校验07 用户登录08 测评功能搭建09 提交结果10 生成报告 学习目标面向人群结语 前言 欢迎阅读《性格测评小程序开发指南》!本书旨在为开发者、低代码爱好者和学习者提供一个…...

shell编程总结
前言 shell编程学习总结,1万3千多字带你学习shell编程 往期推荐 14wpoc,nuclei全家桶:nuclei模版管理工具Nuclei 哥斯拉二开,免杀绕过规避流量检测设备 fscan全家桶:FscanPlus,fs,fscan适用…...
析言GBI:用自然语言交互重构企业数据分析范式
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、Java 与 Python 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在未来…...

【论文技巧】Mermaid VSCode插件制作流程图保存方法
插流程图快点 利用Mermaid Preview插件自带功能 如果你的VSCode安装了支持导出图片的Mermaid预览插件(如 Mermaid Markdown Syntax Highlighting 等),可以按以下步骤进行: 打开Mermaid代码文件:在VSCode中打开包含M…...

Unity 位图字体
下载Bitmap Font Generator BMFont - AngelCode.com 解压后不用安装直接双击使用 提前设置 1、设置Bit depth为32 Options->Export options 2、清空所选字符 因为我们将在后边导入需要的字符。 Edit->Select all chars 先选择所有字符 Edit->Clear all chars i…...
科技快讯 | DeepSeek推出NSA加速长上下文训练,xAI Grok系列将陆续开源,月之暗面发布Kimi Latest新模型
阶跃星辰首次开源Step系列多模态大模型 2月18日,财联社消息,阶跃星辰与吉利汽车集团宣布,双方合作开发的阶跃Step系列多模态大模型向全球开发者开源。包括参数量达300亿的Step-Video-T2V视频生成模型和行业内首款产品级开源语音交互大模型Ste…...

网络安全 | 5G网络安全:未来无线通信的风险与对策
网络安全 | 5G网络安全:未来无线通信的风险与对策 一、前言二、5G 网络的技术特点2.1 超高速率与低延迟2.2 大容量连接与网络切片三、5G 网络面临的安全风险3.1 网络架构安全风险3.2 设备终端安全风险3.3 应用场景安全风险3.4 用户隐私安全风险四、5G 网络安全对策4.1 强化网络…...

Linux 实操篇 组管理和权限管理、定时任务调度、Linux磁盘分区和挂载
一、组管理和权限管理 (1)Linux组基本介绍 在linux中的每个用户必须属于一个组,不能独立于组外 在linux中每个文件有所有者、所在组、其他组的概念 (2)文件/目录 所有者 一般为文件的创建者,谁创建了该…...

应用案例 | uaGate SI助力汽车零部件工厂将生产数据传输到MES
一、背景和挑战 (图1 汽车零部件工厂生产车间) 随着汽车工业的不断发展,新能源汽车市场的竞争日益激烈,这对汽车零部件供应商提出了更高的要求,包括提升产品精度、增强可靠性、节能环保以及控制成本等多个方面。某国际…...

Android JNI的理解与使用。
写在前面:Java相对于C/C来说是更高级的语言,隐藏了指针,可读性更高,更容易学习,但是无法直接操作硬件、运行速度较慢也是不可回避的硬伤。JNI就是Java官方定义的一套标准“接口”,用于Java和C/C之间互相调用…...

fpga助教面试题
第一题 module sfp_pwm( input wire clk, //clk is 200M input wire rst_n, input wire clk_10M_i, input wire PPS_i, output reg pwm ) reg [6:0] cunt ;always (posedge clk ) beginif(!rst_n)cunt<0;else if(cunt19) //200M是10M的20倍cunt<0;elsecunt<cunt1;…...
Git命令详解与工作流介绍:全面掌握版本控制系统的操作指南
Git Git是一个版本控制系统(也称为源代码控制系统),允许程序员和其他处理文本文件的人在独立工作时协调更改。Git还支持二进制资产,如图片,但这些格式不支持逐行版本管理,这使得版本控制真正强大。 Git概…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...