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负责执行重启。
  1. 写一个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'

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

  1. 现在配置文件修改过了,我们在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
  1. 重新执行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的时候,我们可以通过选定标签的方式指定只执行哪一些任务或者不执行哪一些任务。

  1. 创建一个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
  1. 查看当前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'
  1. 最后给它卸掉(PS:因为我的电脑…)
ansible-playbook  remove_httpd.yml 

在这里插入图片描述

3. playbook中使用变量

  • 变量名:仅能由字母、数字和下划线组成,且只能以字母开头。
  • 变量定义:variable=value

范例:http_port=80

  • 变量调用方式:通过{{ variable_name }} 调用变量,且变量名前后建议加空格,有时用“{{ variable_name }}”才生效
  • 变量来源:
  1. ansible 的 setup facts 远程主机的所有变量都可直接调用
  2. 通过命令行指定变量,优先级最高 ansible-playbook -e varname=value
  3. 在playbook文件中定义
   vars:- var1: value1- var2: value2
  1. 在独立的变量YAML文件中定义
   - hosts: allvars_files:- vars.yml
  1. /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中定义的变量优化级高

  1. 新建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中可用的变量,如果和主机变是同名,优先级低于主机变量。

范例:

  1. 打开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
  1. 调用hostname模块,修改主机名
#先想想主机名应该是什么
ansible webservers -m hostname -a 'name={{ hname}}{{ mark }}{{ domain }}'
ansible all -a 'hostname'

在这里插入图片描述

因为主机变量优先级高于组变量(公共变量),所以linux101的主机名应该是:www1-yu.io,linux102的主机名应该是:www1.yhx.com.

  1. 还可以通过行命令来指定变量,这时候指定的变量可以覆盖之前文件中定义的变量
#命令行指定变量: 
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'

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/74465.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是msvcp140.dll?msvcp140.dll丢失的解决方法又有哪些?

msvcp140.dll 是 Microsoft Visual C Redistributable 的核心动态链接库文件,许多软件和游戏依赖它来运行。当系统提示“msvcp140.dll丢失”时,意味着该文件无法被正确加载,导致程序崩溃或无法启动。本文将提供最全面的 msvcp140.dll丢失的解…

(九)图形管线

一图说明问题 顶点数据->顶点着色器->细分着色器->几何着色器->光栅化->片元着色器->颜色混合 创建图形管线函数放在后面位置 void MyApplication::initVulkan() { createInstance(); createSurface(); pickPhysicalDevice(); createLogicalDevice(); cre…

《inZOI(云族裔)》50+MOD整合包

载具 RebelCore - 年龄和时间 mod启动器 优化补丁 去除雾气 坦克模型 菜单 前置 跳过启动 更好性能 等 共计50MOD整合 在游戏的世界里,追求更丰富、更优质的体验是玩家们永恒的主题。RebelCore 这款游戏通过精心打造的 50MOD 整合,为玩家带来了前所未有的…

国家天文台携手阿里云,发布国际首个太阳大模型“金乌”

2025年4月1日,中国科学院国家天文台与阿里云共同宣布推出全球首个太阳物理大模型“金乌”,在太阳活动预测领域实现颠覆性突破——其针对破坏性最强的M5级太阳耀斑预报准确率高达91%,远超传统数值模型,标志着人类对太阳的认知迈入“…

U盘实现——BOT 常用命令

文章目录 U盘实现——BOT 常用命令命令格式CBWCSW数据传输条件命令传输数据传输状态传输命令汇总INQUIRY Command:12h数据格式抓包READ FORMAT CAPACITIES Command: 23h数据格式抓包READ CAPACITY Command: 25h数据格式抓包TEST UNIT READY Command: 00h数据格式抓包WRITE(10) …

【Axure元件分享】月份范围选择器

Axure月份范围选择器是一个月份范围下拉筛选元件,支持月份范围定义选择。组件自动加载系统当前年月份作为默认值,用户可通过箭头图标或键盘快捷键快速切换年份月份,其样式支持高度定制,包括颜色主题、字体尺寸及交互反馈&#xff…

JavaScript基础-移动端常用开发框架

随着移动互联网的发展,越来越多的应用和服务需要支持移动设备。为了提高开发效率和用户体验,开发者们依赖于一些成熟的JavaScript框架来构建响应迅速、功能丰富的移动Web应用。本文将介绍几款广泛使用的移动端开发框架,并通过具体的示例展示它…

数字人训练数据修正和查看 不需要GPU也能运行的DH_live-加载自己训练-

自己训练模pth报错 le "D:\ai\dh_live\app.py", line 42, in demo_mini interface_mini(asset_path, wav_path, output_video_name) File "D:\ai\dh_live\demo_mini.py", line 21, in interface_mini renderModel_mini.loadModel("checkpoi…

基姆拉尔森计算公式

基姆拉尔森计算公式(Zellers Congruence 的变体)是一种快速根据公历日期计算星期几的数学公式。其核心思想是通过对年月日的数值进行特定变换和取模运算,直接得到星期几的结果。 公式定义 对于日期 年-月-日,公式如下&#xff1a…

数字孪生在智慧城市中的前端呈现与 UI 设计思路

一、数字孪生技术在智慧城市中的应用与前端呈现 数字孪生技术通过创建城市的虚拟副本,实现了对城市运行状态的实时监控、分析与预测。在智慧城市中,数字孪生技术的应用包括交通流量监测、环境质量分析、基础设施管理等。其前端呈现主要依赖于Web3D技术、…

基于CNN-LSTM的深度Q网络(Deep Q-Network,DQN)求解移动机器人路径规划,MATLAB代码

一、深度Q网络(Deep Q-Network,DQN)介绍 1、背景与动机 深度Q网络(DQN)是深度强化学习领域的里程碑算法,由DeepMind于2013年提出。它首次在 Atari 2600 游戏上实现了超越人类的表现,解决了传统…

结构型设计模式。持续更新

结构型 - 外观 提供了一个统一的接口,用来访问子系统中的一群接口,从而让子系统更容易使用。 public class SubSystem {public void turnOnTV() {System.out.println("turnOnTV()");}public void setCD(String cd) {System.out.println(&quo…

从零构建大语言模型全栈开发指南:第五部分:行业应用与前沿探索-5.1.2行业落地挑战:算力成本与数据隐私解决方案

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 从零构建大语言模型全栈开发指南-第五部分:行业应用与前沿探索5.1.2 行业落地挑战:算力成本与数据隐私解决方案1. 算力成本挑战与优化策略1.1 算力成本的核心问题1.2 算力优化技术方案2. 数据隐私挑战…

量子计算与人工智能融合的未来趋势

最近研学过程中发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。 在当今科技飞速发展…

六种光耦综合对比——《器件手册--光耦》

目录 十二、光耦 简述 基本结构 工作原理 主要特点 应用领域 优势与局限性 选择光耦时需要考虑的因素 详尽阐述 1 栅极驱动光耦 基本结构 工作原理 主要特点 应用领域 选择栅极驱动光耦时需要考虑的因素 典型产品示例 总结 2 逻辑输出光耦 基本结构 工作原理 主要特点 应用…

【蓝桥杯嵌入式——学习笔记一】2016年第七届省赛真题重难点解析记录,闭坑指南(文末附完整代码)

在读题过程中发现本次使用的是串口2,需要配置串口2。 但在查看产品手册时发现PA14同时也是SWCLK。 所以在使用串口2时需要拔下跳线帽去连接CH340。 可能是用到串口2的缘故,在烧录时发现报了一个错误。这时我们要想烧录得按着复位键去点击烧录&#xff0c…

三、GPIO

一、GPIO简介 GPIO(General Purpose Input Output)通用输入输出口GPIO引脚电平:0V(低电平)~3.3V(高电平),部分引脚可容忍5V 容忍5V,即部分引脚输入5V的电压,…

Java实战报错

哪错了 Preview 在这段Java代码中,map.put("Cc", 20); 这一行的键 "Cc" 被标记为错误。这可能是由于以下几种原因: 键值类型不匹配:虽然在你的代码中没有显示出来,但确保 HashMap 的键是 String 类型&#xf…

25大唐杯赛道一本科B组知识点大纲(下)

5G/6G网络技术知识点(10%) 工程概论及通信工程项目实践(20%) 5G垂直行业应用知识点(20%) ⭐⭐⭐为重点知识,尽量要过一遍哦 大唐杯赛道一国一备赛思路 大唐杯国一省赛回忆录--有付出就会有收…

docker的文件系统Overlay2

OverlayFS(Overlay2)文件系统深度解析 Overlay2 是 Docker 默认使用的联合文件系统(Union Filesystem),用于管理容器镜像的分层存储和容器运行时文件系统的合并。它基于 Linux 内核的 OverlayFS 技术,是早…