Ansible最佳实践之Playbook使用过滤器处理网络地址
写在前面
- 使用过滤器检查、验证和操作包含网络信息的变量
- 理解不足小伙伴帮忙指正
傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波
收集和处理网络信息
标准 setup 模块可在多个 play 开头自动收集事实,从每个受管主机上收集大量与网络相关的信息。
常用的网络事实:
- ansible_facts[‘dns’][‘nameservers’]
- ansible_facts[‘domain’]
- ansible_facts[‘all_ipv4_addresses’]
- ansible_facts[‘all_ipv6_addresses’]
- ansible_facts[‘fqdn’]
- ansible_facts[‘hostname’]
查看所有清单主机的完全限定名
---
- name: net_workhosts: alltasks:- name: printdebug:msg: "{{ ansible_facts['fqdn'] }}"
$
执行测试
$ ansible-playbook network.yaml
.........
TASK [print] ***************************************************************************************************************
ok: [servera] => {"msg": "servera.lab.example.com"
}
ok: [serverb] => {"msg": "serverb.lab.example.com"
}
ok: [serverc] => {"msg": "serverc.lab.example.com"
}
ok: [serverd] => {"msg": "serverd.lab.example.com"
}
ok: [servere] => {"msg": "servere.lab.example.com"
}
ok: [serverf] => {"msg": "serverf.lab.example.com"
}
网络信息过滤器
ipaddr 过滤器可用于处理和验证网络相关的事实:
- 检查IP地址的语法
- 转换VLSN子网掩码为CIDR子网
- 执行子网数学运算
- 在网络范围内找到下一个可用地址
使用要求:RHEL8系统使用ipaddr过滤器需要安装 python3-netaddr 软件包,该包提供Python模块netaddr。
[student@workstation laomalS sudo yum install -y python3-netaddr
ipaddr 过滤器提供了操作和验证与网络相关的事实功能。
可以用于检查 IP 地址的语法,从 VLSN 子网掩码转换为 CIDR 子网前缀表示法,执行子网计算,查找网络范围内的下一个可用地址等。
在最简单的形式中,不带参数的 ipaddr 过滤器接受单个值。如果值是 IP 地址,则过滤器返回 IP 地址,如果不是IP 地址,则过滤器将返回 False。
- 如果该值为有效的P地址,则过滤器将返回地址。
- 如果该值不是有效的IP地址,则过滤器返回False。
$ ansible servera -m debug -a 'msg={{ "175.25.250.50" | ipaddr}}'
servera | SUCCESS => {"msg": "175.25.250.50"
}
$ ansible servera -m debug -a 'msg={{ "175.25.250.50/24" | ipaddr}}'
servera | SUCCESS => {"msg": "175.25.250.50/24"
}
$ ansible servera -m debug -a 'msg={{ "175.25.250.500/24" | ipaddr}}'
servera | SUCCESS => {"msg": false
}
ipaddr过滤器接受参数值:
- 如果该值包涵有效的IP地址,则返回有效的IP地址。
- 如果所有项目均无效,则返回一个空列表。
$ ansible servera -m debug -a 'msg={{ "175.25.250.50/24" | ipaddr("netmask")}}'
servera | SUCCESS => {"msg": "255.255.255.0"
}
$
- ipaddr 过滤器接受以下选项:
- address:验证输入值是否为有效的 IP 地址,如果输入中包含网络前缀,其会被剥离。
- net:验证输入值是否为网络范围,并以 CIDR 格式返回。
- host:确保 IP 地址符合等效的 CIDR 前缀格式。
- prefix:验证输入主机是否满足主机/前缀或 CIDR 格式,并返回前缀。
- host/prefix:验证输入是否为网络/前缀格式。
- public 或 private:验证输入 IP 地址或网络范围是否由 IANA 分别预留为公共或私有的范围内。
- size:将输入网络范围转换为该范围内的 IP 地址数。
- n:任何整数。将网络范围转换为该范围内的第 N 个元素。负数返回从最后一个数的第 n 个元素。
- network、netmask、broadcast:验证输入主机是否满足主机/前缀或CIDR格式,并将其分别转换为网络地址、子网掩码或广播地址。
- subnet:验证输入主机是否满足主机/前缀或 CIDR 格式,并返回包含该主机的子网。
- ipv4 ipv6:验证输入是否有效的网络范围,并将它们分别转换为 ipv4 和 ipv6 格式。
$ ansible servera -m debug -a 'msg={{ "175.25.250.50/24" | ipaddr("ipv6")}}'
servera | SUCCESS => {"msg": "::ffff:175.25.250.50/120"
}
$ ansible servera -m debug -a 'msg={{ "175.25.250.50/24" | ipaddr("subnet")}}'
servera | SUCCESS => {"msg": "175.25.250.0/24"
}
$ ansible servera -m debug -a 'msg={{ "175.25.250.50/24" | ipaddr("size")}}'
servera | SUCCESS => {"msg": "256"
}
使用插件收集网络信息
查找 DNS 信息
dig 命令针对 DNS 服务进行查询,并返回生成的记录。dig 需要在控制节点上安装 python3-dns 软件包。
$ ansible servera -m debug -a 'msg={{ lookup("dig","servera.lab.example.com")}}'
servera | SUCCESS => {"msg": "172.25.250.10"
}
$ ansible servera -m debug -a 'msg={{ lookup("dig","example.com")}}'
servera | SUCCESS => {"msg": "172.25.254.254"
}
$ ansible servera -m debug -a 'msg={{ lookup("dig","com")}}'
servera | SUCCESS => {"msg": "NXDOMAIN"
}
dig 查找 DNS 服务器中是否存在提供 FQDN 的 A 记录:
$ ansible servera -m debug -a 'msg={{ lookup("dig","example.com", "qtype=A")}}'
servera | SUCCESS => {"msg": "10 classroom.example.com."
}
$ ansible servera -m debug -a 'msg={{ lookup("dig","example.com", "@")}}'
servera | SUCCESS => {"msg": "172.25.254.254"
}
一个 Demo
[student@workstation netfilters]$ cat ./tasks/main.yml
# Complete each task by setting the fact as the expected value.
# Replace ellipsis by the appropriate filter usage.
# All task but the last one should be using the 'ipaddr' filter.
# Use the lookup filter with the `dig` command for the last task# Tasks make use of th gathered fact 'default_ipv4', and its keys 'address', 'network' and 'netmask'- name: Task 1- Verify the 'ansible_default_ipv4.addresss' provided address is correctly formatted.set_fact:server_address: "{{ ansible_facts.default_ipv4.address | ipaddr }}"
- name: Task 2- Check 'server_address' valueassert:that: "server_address == ansible_facts.default_ipv4.address"fail_msg: "'server_address' must be {{ ansible_facts.default_ipv4.address }}, but is {{ server_address }}"- name: Task 3- Obtain the DNS name associated to the server IP address (reverse DNS)set_fact:address_dns: "{{ server_address | ipaddr('revdns') }}"
- name: Task 4- Check 'address_dns' valueassert:that: "address_dns == '10.250.25.172.in-addr.arpa.'"fail_msg: "'address_dns' must be '10.250.25.172.in-addr.arpa.', but is {{ address_dns }}"- name: Task 5- Obtain server's network/netmaskset_fact:net_mask: "{{ ansible_facts.default_ipv4.network }}/{{ ansible_facts.default_ipv4.netmask }}"
- name: Task 6- Check 'net_mask' valueassert:that: "net_mask == '172.25.250.0/255.255.255.0'"fail_msg: "'net_mask' must be '172.25.250.0/255.255.255.0', but is {{ net_mask }}"- name: Task 7- Transform the network/netmask to the CIDR formatset_fact:cidr: "{{ net_mask | ipaddr('net') }}"
- name: Task 8- Check 'cidr' valueassert:that: "cidr == '172.25.250.0/24'"fail_msg: "'cidr' must be '172.25.250.0/24', but is {{ cidr }}"- name: Task 9- Verify the server address actualy belong to the network/maskset_fact:address_in_range: "{{ server_address | ipaddr(net_mask) }}"
- name: Task 10- Check 'address_in_range' valueassert:that: "address_in_range == server_address"fail_msg: "'address_in_range' must be {{ server_address }}, but is {{ address_in_range }}"- name: Task 11- Obtain the broadcast address associated to the CIDRset_fact:broadcast: "{{ cidr | ipaddr('broadcast') }}"
- name: Task 12- Check 'broadcast' valueassert:that: "broadcast == '172.25.250.255'"fail_msg: "'broadcast' must be '172.25.250.255', but is {{ broadcast }}"- name: Task 13- DIG for the MX record of the domain 'example.com'set_fact:dig_record: "{{ lookup( 'dig', 'example.com.', 'qtype=MX') }}"
- name: Task 14- Check 'dig_record' valueassert:that: "dig_record == '10 classroom.example.com.'"fail_msg: "'dig_record' must be '10 classroom.example.com.', but is '{{ dig_record }}'"
[student@workstation data-netfilters]$ ansible-playbook site.ymlPLAY [Tasks for netfilter guided exercise] *****************************************************************************TASK [Gathering Facts] *************************************************************************************************
ok: [servera.lab.example.com]TASK [netfilters : Task 1- Verify the 'ansible_default_ipv4.addresss' provided address is correctly formatted.] ********
ok: [servera.lab.example.com]TASK [netfilters : Task 2- Check 'server_address' value] ***************************************************************
ok: [servera.lab.example.com] => {"changed": false,"msg": "All assertions passed"
}TASK [netfilters : Task 3- Obtain the DNS name associated to the server IP address (reverse DNS)] **********************
ok: [servera.lab.example.com]TASK [netfilters : Task 4- Check 'address_dns' value] ******************************************************************
ok: [servera.lab.example.com] => {"changed": false,"msg": "All assertions passed"
}TASK [netfilters : Task 5- Obtain server's network/netmask] ************************************************************
ok: [servera.lab.example.com]TASK [netfilters : Task 6- Check 'net_mask' value] *********************************************************************
ok: [servera.lab.example.com] => {"changed": false,"msg": "All assertions passed"
}TASK [netfilters : Task 7- Transform the network/netmask to the CIDR format] *******************************************
ok: [servera.lab.example.com]TASK [netfilters : Task 8- Check 'cidr' value] *************************************************************************
ok: [servera.lab.example.com] => {"changed": false,"msg": "All assertions passed"
}TASK [netfilters : Task 9- Verify the server address actualy belong to the network/mask] *******************************
ok: [servera.lab.example.com]TASK [netfilters : Task 10- Check 'address_in_range' value] ************************************************************
ok: [servera.lab.example.com] => {"changed": false,"msg": "All assertions passed"
}TASK [netfilters : Task 11- Obtain the broadcast address associated to the CIDR] ***************************************
ok: [servera.lab.example.com]TASK [netfilters : Task 12- Check 'broadcast' value] *******************************************************************
ok: [servera.lab.example.com] => {"changed": false,"msg": "All assertions passed"
}TASK [netfilters : Task 13- DIG for the MX record of the domain 'example.com'] *****************************************
ok: [servera.lab.example.com]TASK [netfilters : Task 14- Check 'dig_record' value] ******************************************************************
ok: [servera.lab.example.com] => {"changed": false,"msg": "All assertions passed"
}PLAY RECAP *************************************************************************************************************
servera.lab.example.com : ok=15 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0[student@workstation data-netfilters]$ cat site.yml
- name: Tasks for netfilter guided exercisehosts: servera.lab.example.comroles:- role: netfilters[student@workstation data-netfilters]$
博文参考
《DO447》
相关文章:
Ansible最佳实践之Playbook使用过滤器处理网络地址
写在前面 使用过滤器检查、验证和操作包含网络信息的变量理解不足小伙伴帮忙指正 傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去…...
测试常见前端bug
目录 协作 测试方法 标签:标签 内容/ref/ 判断 arr&&arr.length 交互 样式不生效:devtools查找,编译前的标签,运行时不一定存在 可交互的需要提示 hover样式 没有交互逻辑,就不要设置交互 无法交互…...
【Python数据分析】Python常用内置函数(一)
🎉欢迎来到Python专栏~Python常用内置函数(一) ☆* o(≧▽≦)o *☆嗨~我是小夏与酒🍹 ✨博客主页:小夏与酒的博客 🎈该系列文章专栏:Python学习专栏 文章作者技术和水平有限,如果文…...
OpenCV图像处理-图像分割-MeanShift
MeanShift 1. 基本概念2.代码示例 1. 基本概念 MeanShift严格说来并不是用来对图像进行分割的,而是在色彩层面的平滑滤波。它会中和色彩分布相近的颜色,平滑色彩细节,侵蚀掉面积较小的的颜色区域,它以图像上任意一点P为圆心&…...
【Rust 基础篇】Rust Trait 实现:灵活的接口抽象
导言 Rust是一种以安全性和高效性著称的系统级编程语言,其设计哲学是在不损失性能的前提下,保障代码的内存安全和线程安全。为了实现这一目标,Rust引入了"所有权系统"、"借用检查器"等特性,有效地避免了常见…...
【嵌入式Linux项目】基于Linux的全志H616开发板智能家居项目(语音控制、人脸识别、安卓APP和PC端QT客户端远程操控)有视频功能展示
目录 一、功能需求 二、开发环境 1、硬件: 2、软件: 3、引脚分配: 三、关键点 1、设计模式之工厂模式 2、wiringPi库下的相关硬件操作函数调用 3、语音模块的串口通信 4、线程 5、摄像头的实时监控和拍照功能 6、人脸识别 四、编…...
ElasticSearch基础篇-条件查询与映射
ElasticSearch基础篇二 条件查询 GET http://10.192.193.98:9200/shopping/_search?qtitle:小米手机q:代表查询条件 响应结果 {"took": 772,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped…...
大模型部署框架 FastLLM 实现细节解析
0x0. 前言 接着 大模型部署框架 FastLLM 简要解析 这篇文章首先梳理了一下FastLLM的调用链和关键的数据结构,然后解析了 FastLLM 的一些实现细节和CPU/GPU后端实现采用的优化技巧。 0x1. 调用链和数据结构解析 以chatglm-6b的支持为例,函数入口在 htt…...
Flutter ios真机调试连接断开后应用闪退
使用ios真机调试的时候,能正常打开应用,但是当数据线断开连接的时候,应用就会关闭,重新打开就会闪退。 原因是flutter默认在开发过程中使用debug模式编译 只需要将debug选择为release 重新编译就行。...
序列化,反序列化之实例
别怕,我一直陪着你 一.知识1.魔术方法 二.实例1.绕过__wakeup, private2.php://filter, data://, __tostring3. 一.知识 1.魔术方法 __construct() 当一个对象创建时自动调用 __destruct() 当对象被销毁时自动调用 (php绝大多数情况下会自动调用销毁对象) __sleep…...
2022年全国职业院校技能大赛(高职组)“软件测试”赛项竞赛任务书
2022年全国职业院校技能大赛(高职组) “软件测试”赛项竞赛任务书 2022年7月 一、竞赛时间、内容及成绩组成 (一)竞赛时间 本阶段竞赛时间共为8小时,参赛选手自行安排任务进度,休息、饮水、如厕等不设专…...
第18节:R语言分析:临床安全性数据的数据分析
临床安全性数据的数据分析 背景 医疗器械临床试验中收集的数据的主要组成部分是关于患者安全的。 不良事件被定义为“受试者、使用者或其他人的任何不良医疗事件、非预期疾病或伤害,或不良临床体征(包括异常实验室发现),无论是否与研究医疗器械相关”。 收集并用于此数据…...
36.悬浮板
悬浮板 html部分 <div class"container"><div class"square"></div> </div>css部分 *{margin: 0;padding: 0; } body{background-color: #111;height: 100vh;overflow: hidden;display: flex;justify-content: center;align-it…...
BLE基础理论/Android BLE开发示例
参考:https://blog.csdn.net/qq_36075612/article/details/127739150?spm1001.2014.3001.5502 参考: https://blog.csdn.net/qq_36075612/article/details/122772966?spm1001.2014.3001.5502 目录 蓝牙的分类传统蓝牙低功耗蓝牙 蓝牙专业词汇ÿ…...
rocketmq 5.13任意时间延迟消息
原理是采用timewhile 实现的,源码分析可以参考 https://blog.csdn.net/sinat_14840559/article/details/129266105 除了useDelayLevel 已经默认改为false private boolean useDelayLevel false;官方示意代码在public class TimerMessageProducer for (int i 0;…...
小程序picker 在苹果手机不兼容 bug,按month时在iPhone 显示不正确及自动定位时间问题
如下图:点击弹出时间列表:日历控件点击选择显示1年1月 解决: 加上起始时间字段 <picker mode"date" value"{{date}}" start"1970-09-01" end"2030-09-01"></picker> 问题二: 还是&a…...
区块链服务网络的顶层设计与应用实践
日前,2023全球数字经济大会专题论坛:Web3.0发展趋势专题论坛暨2023区块链、元宇宙蓝皮书发布会在北京举行。本次论坛上隆重发布了《中国区块链发展报告(2023)》,对我国区块链行业在2022年的发展状况进行了总结梳理&…...
tomcat日志输出乱码
在Tomcat中,默认的字符编码可能导致应用参数日志出现乱码问题。这通常发生在接收来自客户端的请求参数,并将其记录到日志文件时。 Tomcat默认使用平台的默认字符编码,这可能是不稳定的,特别是当应用程序运行在不同的操作系统上时…...
Form1单例模式与互斥锁
一、使用mutex来解决。 如何让窗体Form1也是一个单例模式呢? 在窗体项目中找到Program.cs,双击。找到入口点,更改如下: [STAThread]private static void Main(){string mutexName "MyapplicatonMutexApp1121";usin…...
MySQL | 常用命令示例
MySQL | 常用命令示例 一、启停MySQL数据库服务二、连接MySQL数据库三、创建和管理数据库四、创建和管理数据表五、数据备份和恢复六、查询与优化 MySQL是一款常用的关系型数据库管理系统,广泛应用于各个领域。在使用MySQL时,我们经常需要编写一些常用脚…...
赋能音乐自由:Unlock Music技术解密与全场景应用指南
赋能音乐自由:Unlock Music技术解密与全场景应用指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https:…...
收藏!小白程序员必看:Agent和工作流是最佳拍档,教你如何协同它们(附案例)
文章探讨了AI智能体(Agent)和工作流工具的关系,指出它们并非竞争对手,而是最佳拍档。Agent擅长自主决策和动态规划,适用于探索性和不确定性任务;工作流则负责流程编排和确定性执行,适用于重复性…...
通义千问1.5-1.8B-Chat-GPTQ-Int4场景应用:网络安全威胁情报的智能分析与报告生成
通义千问1.5-1.8B-Chat-GPTQ-Int4场景应用:网络安全威胁情报的智能分析与报告生成 1. 引言:当安全分析师遇上信息洪流 想象一下,你是一名网络安全分析师。凌晨三点,刺耳的告警声把你从睡梦中惊醒。屏幕上,来自防火墙…...
AI写专著必备攻略:专业工具推荐,轻松开启学术专著创作之旅
学术专著写作困境与AI工具解决方案 学术专著的严谨性,离不开大量资料和数据的支持。资料的搜集和数据整合,往往是写作过程中最为繁琐和耗时的环节。研究者必须全面检索国内外的前沿文献,以确保这些文献的权威性和相关性,同时还要…...
GLM-4.1V-9B-Base行业实践:农业病虫害田间照片识别与防治建议辅助
GLM-4.1V-9B-Base行业实践:农业病虫害田间照片识别与防治建议辅助 1. 农业场景下的视觉AI需求 在现代农业生产中,病虫害防治一直是困扰农户的核心问题。传统识别方法依赖农技人员现场勘查,效率低下且成本高昂。根据农业农村部数据ÿ…...
Kodi PVR IPTV Simple全方位应用指南:从入门到精通的多场景解决方案
Kodi PVR IPTV Simple全方位应用指南:从入门到精通的多场景解决方案 【免费下载链接】pvr.iptvsimple IPTV Simple client for Kodi PVR 项目地址: https://gitcode.com/gh_mirrors/pv/pvr.iptvsimple 一、场景痛点分析:当IPTV体验不如预期时&…...
bilibili-downloader完全指南:从入门到精通的4个关键步骤
bilibili-downloader完全指南:从入门到精通的4个关键步骤 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 一、痛点分析&am…...
Qwen3-ASR-0.6B方言识别效果展示:粤语、四川话实测
Qwen3-ASR-0.6B方言识别效果展示:粤语、四川话实测 1. 引言 语音识别技术发展至今,已经能够很好地处理普通话和英语等主流语言,但方言识别一直是技术难点。不同地区的方言在发音、语调、词汇上都有很大差异,让机器准确识别并非易…...
GLM-4.1V-9B-Base部署教程:NVIDIA驱动版本兼容性验证与降级方案
GLM-4.1V-9B-Base部署教程:NVIDIA驱动版本兼容性验证与降级方案 1. 模型概述 GLM-4.1V-9B-Base是智谱开源的一款视觉多模态理解模型,专注于图像内容识别与分析任务。该模型具备以下核心能力: 图片内容描述与场景理解图像主体识别与定位颜色…...
springboot+vue基于web的在线学习资源推荐的设计与实现
目录功能模块分析推荐系统功能交互功能设计后台管理功能技术实现要点项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作功能模块分析 用户管理模块 用户注册与登录:支持邮箱/手机号注册,提供密码找回功能…...
