Ansible:playbook的高级用法
文章目录
- 1. handlers与notify
- 2. tags组件
- 3. playbook中使用变量
- 3.1使用 setup 模块中变量
- 3.2在playbook 命令行中定义变量
- 3.3在playbook文件中定义变量
- 3.4使用变量文件
- 3.5主机清单文件中定义变量
- 主机变量
- 组(公共)变量
1. handlers与notify
- Handlers:是task列表,用于当关注的资源发生变化时,采取一定的操作。
- Notify:被触发的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作成为handler,也即notify中调用handler中定义的操作。
- 例如:更新配置文件,重新启动playbook,系统不会重启服务,这时可以通过定义一个notify去重启服务,handlers负责执行重启。
- 写一个playbook文件安装httpd
vim httpd.yml
---
- hosts: webserversremote_user: roottasks:- name: install httpd packageyum: name=httpd- name: copy conf filecopy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes- name: start serviceservice: name=httpd state=started enabled=yes
ansible-playbook httpd.yml

2. 查看当前的端口状态
ansible webservers -a 'ss -ntl'

- 修改httpd的端口,从8080修改为81
vim ./files/httpd.conf


- 现在配置文件修改过了,我们在yaml文件中增加handlers与notify触发机制
vim httpd.yml
---
- hosts: webserversremote_user: roottasks:- name: install httpd packageyum: name=httpd- name: copy conf filecopy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yesnotify: restart service # 当配置文件改变时,调用handlers里面的restart service- name: start serviceservice: name=httpd state=started enabled=yeshandlers: # 当上面的某个或某些任务改变时,执行下面的任务- name: restart serviceservice: name=httpd state=restarted
- 重新执行playbook,就可以检测到文件的修改,触发notify和handlers操作。
ansible-playbook httpd.yml

6. 最后查看端口状态,发现8080端口已经换成了81:
ansible webservers -a 'ss -ntl'

如果报错,说明端口号没有权限,换一个端口号。
systemctl status httpd.service
notify和handlers操作可以同时定义多个,相当于多个函数其实可以同时调用。
2. tags组件
在大型项目当中,通常一个playbook会有非常多的task。而我们每次执行这个playbook时,都会将所有task运行一遍。
而事实上,在实际使用过程中,我们可能只是想要执行其中的一部分任务而已,并不想把整个playbook完整跑一遍。这个时候就需要用到tags。
通过tags,我们可以给playbook中的某一些任务打上“标签”,而在执行playbook的时候,我们可以通过选定标签的方式指定只执行哪一些任务或者不执行哪一些任务。
- 创建一个playbook文件
vim httpd_tag.yml
#install httpd
- hosts: webserversremote_user: rootgather_facts: notasks:- name: Install httpdyum: name=httpd state=present- name: Install configure filecopy: src=files/httpd.conf dest=/etc/httpd/conf/#定义tagstags: config- name: web htmlcopy: src=files/index.html dest=/var/www/html/- name: start serviceservice: name=httpd state=started enabled=yes#定义tagstags: service
- 查看当前tags列表(不知道命令就用–help查看)
ansible-playbook --list-tags httpd_tag.yml

3. 再次修改httpd的端口号
vim files/httpd.conf

4. 针对linux101这一台主机运行config 这个tag代码段。
ansible-playbook -t config httpd_tag.yml --limit linux101ansible linux101 -a 'ss -ntl'
- 最后给它卸掉(PS:因为我的电脑…)
ansible-playbook remove_httpd.yml

3. playbook中使用变量
- 变量名:仅能由字母、数字和下划线组成,且只能以字母开头。
- 变量定义:
variable=value
范例:http_port=80
- 变量调用方式:通过
{{ variable_name }}调用变量,且变量名前后建议加空格,有时用“{{ variable_name }}”才生效 - 变量来源:
- ansible 的 setup facts 远程主机的所有变量都可直接调用
- 通过命令行指定变量,优先级最高
ansible-playbook -e varname=value - 在playbook文件中定义
vars:- var1: value1- var2: value2
- 在独立的变量YAML文件中定义
- hosts: allvars_files:- vars.yml
- 在
/etc/ansible/hosts中定义
- 主机(普通)变量:主机组中主机单独定义,优先级高于公共变量
- 组(公共)变量:针对主机组中所有主机定义统一变量
6.在role中定义
3.1使用 setup 模块中变量
本模块自动在playbook调用,不要用ansible命令调用
- 案例:使用setup变量
---
#var.yml
- hosts: allremote_user: root#调用系统变量必须要收集,gather_facts: yes或者不写gather_facts: yestasks:- name: create log filefile: name=/data/{{ ansible_nodename }}.log state=touch owner=yu mode=600
ansible-playbook var.yml

ansible all -a 'ls /data'

3.2在playbook 命令行中定义变量
在playbook中写变量,在命令行赋值调用
范例:
vim val_install.yml
---
- hosts: webserversremote_user: roottasks:- name: install packageyum: name={{ pkname }} state=present
ansible-playbook –e pkname=httpd val_install.yml

3.3在playbook文件中定义变量
范例:
vim var_uninstall.yml
---
- hosts: webserversremote_user: rootvars:- pkname: httpdtasks:- name: uninstall pknameyum: name={{ pkname }} state=absent
直接运行,使用默认参数:
ansible-playbook var_uninstall.yml
在运行时重新给变量赋值,会修改参数:
ansible-playbook -e 'pkname=nginx' var_uninstall.yml
3.4使用变量文件
可以在一个独立的playbook文件中定义变量,在另一个playbook文件中引用变量文件中的变量,比playbook中定义的变量优化级高
- 新建playbook定义变量
vim vars.yml
---
# variables file
var1: httpd
var2: nginx
vim var_log.yml
---
- hosts: webserversremote_user: rootvars_files:- vars.yml
# - /root/playbook/vars.ymltasks:- name: create httpd logfile: name=/data/{{ var1 }}.log state=touch- name: create nginx logfile: name=/data/{{ var2 }}.log state=touch
ansible-playbook var_log.yml
ansible all -a 'ls /data/ '

3.5主机清单文件中定义变量
主机变量
在inventory 主机清单文件中为指定的主机定义变量以便于在playbook中使用
组(公共)变量
在inventory 主机清单文件中赋予给指定组内所有主机上的在playbook中可用的变量,如果和主机变是同名,优先级低于主机变量。
范例:
- 打开hosts文件,添加主机变量和公共变量
vim /etc/ansible/hosts
[webservers]
linux101 hname=www1 domain=yu.io #添加主机变量(优先级高于公共变量)
linux102 hname=www1 domain=yhx.com[webservers:vars]#添加webservers的组变量(公共变量)
mark="-"
domain=edu.cn
- 调用
hostname模块,修改主机名
#先想想主机名应该是什么
ansible webservers -m hostname -a 'name={{ hname}}{{ mark }}{{ domain }}'
ansible all -a 'hostname'

因为主机变量优先级高于组变量(公共变量),所以linux101的主机名应该是:www1-yu.io,linux102的主机名应该是:www1.yhx.com.
- 还可以通过行命令来指定变量,这时候指定的变量可以覆盖之前文件中定义的变量
#命令行指定变量:
ansible webservers -e domain=sch.com -m hostname -a 'name={{ hname }}{{ mark }}{{ domain }}'
ansible all -a 'hostname'

4. 再将hostname修改回去
ansible linux101 -m hostname -a 'name=linux101'
ansible linux102 -m hostname -a 'name=linux102'
ansible all -a 'hostname'

相关文章:
Ansible:playbook的高级用法
文章目录 1. handlers与notify2. tags组件3. playbook中使用变量3.1使用 setup 模块中变量3.2在playbook 命令行中定义变量3.3在playbook文件中定义变量3.4使用变量文件3.5主机清单文件中定义变量主机变量组(公共)变量 1. handlers与notify Handlers&am…...
【C++进阶九】继承和虚继承
【C进阶九】继承和虚继承 1.什么是继承2.继承关系2.1protected和private的区别2.2通过父类的函数去访问父类的private成员2.3默认继承 3.基类和派生类对象的赋值转换4.继承中的作用域5.子类中的默认成员函数6.继承与静态成员7. 菱形继承8.虚继承9.继承和组合 1.什么是继承 继承…...
近日八股——计算机网络
一.c. TCP握手为什么三次、不能是二次、或四次? i.不能是两次: 防止已经失效的连接报文突然又传到了服务端,产生错误 如果不采用三次握手,服务端直接建立连接,会白白浪费资源 三次握手告诉服务端,客户端有没有收这个数据&#…...
HOW - Axios 拦截器特性
目录 Axios 介绍拦截器特性1. 统一添加 Token(请求拦截器)2. 处理 401 未授权(响应拦截器)3. 统一处理错误信息(响应拦截器)4. 请求 Loading 状态管理5. 自动重试请求(如 429 过载)6…...
自适应信号处理任务(过滤,预测,重建,分类)
自适应滤波 # signals creation: u, v, d N = 5000 n = 10 u = np.sin(np.arange(0, N/10., N/50000...
电子电气架构 --- 面向服务的体系架构
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁&am…...
TypeScript 装饰器类型详解
TypeScript 装饰器类型详解 一、类装饰器 // 参数:类的构造函数 function ClassDecorator(constructor: Function) {Object.defineProperty(constructor.prototype, timestamp, {value: Date.now()}); }ClassDecorator class DataService {// 装饰后自动添加times…...
Nyquist内置函数-杂项函数
1 Nyquist内置函数-杂项函数 1.1 杂项函数 这些函数对于日常使用来说都是安全且推荐的。 1.1.1 to-mono(sound) [SAL] (to-mono sound) [LISP] 如果 sound 是多声道声音,返回其所有声道的总和;如果 sound 本身就是单声道声音,则直接返回&…...
基姆拉尔森计算公式
基姆拉尔森计算公式(Zellers Congruence 的变体)是一种快速根据公历日期计算星期几的数学公式。其核心思想是通过对年月日的数值进行特定变换和取模运算,直接得到星期几的结果。 公式定义 对于日期 年-月-日,公式如下:…...
5 分钟用满血 DeepSeek R1 搭建个人 AI 知识库(含本地部署)
最近很多朋友都在问:怎么本地部署 DeepSeek 搭建个人知识库。 老实说,如果你不是为了研究技术,或者确实需要保护涉密数据,我真不建议去折腾本地部署。 为什么呢? 目前 Ollama 从 1.5B 到 70B 都只是把 R1 的推理能力…...
Python数据可视化-第6章-坐标轴的定制
环境 开发工具 VSCode库的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本书为《Python数据可视化》一书的配套内容,本章为第6章 坐标轴的定制 本章主要介绍了坐标轴的定制,包括向任意位置添加坐标轴、定制刻度、隐藏轴脊和移动轴脊。 参考 第…...
18认识Qt坐标系
平面直角坐标系(笛卡尔坐标系) 数学上的坐标系 右手坐标系 计算机中的坐标系 左手坐标系 坐标系的原点(0,0) 就是屏幕的左上角 /窗口的左上角 给 Qt 的某个控件,设置位置,就需要指定坐标.对于这个控件来说, 坐标系原点就是相对于父窗口/控件的. QPushButton 的父元素/父控件/父…...
动态循环表单+动态判断表单类型+动态判断表单是否必填方法
页面效果: 接口请求到的数据格式: list: [{demandType: "设备辅助功能要求",demandSettingList: [{id: "1907384788664963074",name: "测试表单",fieldType: 0,contentValue: "",vaildStatus: 0, // 0 非必填&a…...
keep-alive缓存
#keep-alive缓存动态路由的使用指南# 代码如下图 : <router-view v-slot"{ Component }"> <keep-alive :include"[Hot, Notifications, User, Setting, Test]"> <component :is"Component" …...
25.4.3学习总结【Java】
又是一道错题: 1. 班级活动https://www.lanqiao.cn/problems/17153/learning/?page1&first_category_id1&sortdifficulty&asc1&second_category_id3 问题描述 小明的老师准备组织一次班级活动。班上一共有 n 名 (n 为偶数) 同学,老师…...
Python入门(3):语句
目录 1 基本语句 1.1 表达式语句 1.2 赋值语句 2 控制流语句 2.1 条件语句 2.2 循环语句 while循环: for循环: 2.3 流程控制语句 1. break语句:退出整个循环体 2. continue语句:只跳过本次循环,还会进…...
运维之 Centos7 防火墙(CentOS 7 Firewall for Operations and Maintenance)
运维之 Centos7 防火墙 1.介绍 Linux CentOS 7 防火墙/端口设置: 基础概念: 防火墙是一种网络安全设备,用于监控和控制网络流量,以保护计算机系统免受未经授权的访问和恶意攻击。Linux CentOS 7操作系统自带了一个名为iptables的…...
开发一个小程序需要多久时间?小程序软件开发周期
开发一个小程序所需时间受多种因素影响,以下为你详细列举: 一、需求复杂度。若只是简单展示类小程序,如企业宣传、产品介绍,功能单一,大概 1 - 2 周可完成。若涉及复杂交互,像电商小程序,涵盖商…...
【数据结构篇】算法征途:穿越时间复杂度与空间复杂度的迷雾森林
文章目录 【数据结构篇】算法征途:穿越时间复杂度与空间复杂度的迷雾森林 一、 什么是算法1. 算法的定义1.1 算法的五个特征1.2 好算法的特质 2. 时间复杂度3. 空间复杂度 【数据结构篇】算法征途:穿越时间复杂度与空间复杂度的迷雾森林 💬欢…...
新增帧能耗指标|UWA Gears V1.0.9
UWA Gears 是UWA最新发布的无SDK性能分析工具。针对移动平台,提供了实时监测和截帧分析功能,帮助您精准定位性能热点,提升应用的整体表现。 本次版本更新主要新增帧能耗指标,帮助大家对每一帧的能耗进行精准监控,快速…...
蓝桥杯嵌入式16届———LCD模块
LCD有官方给我们提供的库,我们使用其非常简单,唯一要注意的就是LCD和LED的引脚冲突。 引脚状况 STM32CubeMX 端口配置 使能 比赛给的选手 资源数据包中有以下三个文件,(除去led相关的),将他们复制到自己…...
Ubuntu服务器挂载之前的数据硬盘
这里假设在挂载硬盘之前,您的硬盘从之前的服务器上正确卸载下来。请注意,以下任何操作不当都有可能导致硬盘数据丢失或损坏,如果您的数据非常重要,请及时备份。 1. 确认硬盘分区信息 使用以下命令查看磁盘信息,找到要…...
CMake在Windows环境下Visual Studio Code的使用
1,安装下载 地址:Visual Studio Code - Code Editing. Redefined 双击安装 选择安装路径 可勾选微软的AI工具 2,环境介绍 2.1 ,界面介绍 2.2中文包的安装 下载中文简体 汉化后的界面 2.3 配置C/C环境 VSCode安装好之后…...
注意力机制在大语言模型中的原理与实现总结
注意力机制在大语言模型中的原理与实现总结 1. 章节介绍 在大语言模型的学习中,理解注意力机制至关重要。本章节旨在深入剖析注意力机制的原理及其在大语言模型中的应用,为构建和优化大语言模型提供理论与实践基础。通过回顾神经网络基础及传统架构的局…...
大学生机器人比赛实战(二)软件篇
大学生机器人比赛深度开发指南:核心技术详解与实战代码解析 作为参加过多次机器人竞赛的选手,我将详细剖析比赛中的核心技术实现,包括软件架构设计、实时系统应用、各大赛事代码特点以及性能优化技巧。本指南将帮助你从代码层面深入理解如何…...
AI大模型从0到1记录学习 day13
第 13 章 Python高级语法 13.1 浅拷贝与深拷贝 直接赋值:对象的引用(别名),不产生拷贝。 浅拷贝:拷贝父对象,不会拷贝对象的内部的子对象。拷贝后只有第一层是独立的。 深拷贝:完全拷贝…...
大模型学习三:DeepSeek R1蒸馏模型组ollama调用流程
一、说明 目前DeepSeek R1及其蒸馏模型均支持使用ollama进行调用,可以在模型主页查看调用情况 deepseek-r1https://ollama.com/library/deepseek-r1 显存需求 ,我们显存是16G,可以玩好几个 二、以14B模型演示 1、安装ollama curl -fsSL htt…...
RAGFlow部署与使用介绍-深度文档理解和检索增强生成
ragflow部署与使用教程-智能文档处理与知识管理的创新引擎 1. ragflow简介 RAGFlow作为新一代智能文档处理平台,深度融合检索增强生成(RAG)技术与自动化工作流引擎,为企业级知识管理提供全栈解决方案。通过结合多模态解析、语…...
一文读懂 UML:基础概念与体系框架
UML 图是一种标准化的建模语言,在软件开发和系统设计等领域有着广泛的应用。以下是对 UML 图各类图的详细介绍: 1.用例图 定义:用例图是从用户角度描述系统功能的模型图,展现了系统的参与者与用例之间的关系。作用:帮…...
【AI赋能:58招聘数据的深度剖析之旅】
影刀出鞘,抓取数据 在当今数字化时代,数据分析已成为企业决策和发展的关键驱动力。而获取高质量的数据则是数据分析的首要任务。在这个信息爆炸的时代,网络上蕴含着海量的数据,其中招聘网站的数据对于人力资源分析、市场趋势研究…...


