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》

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

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

相关文章

Blazor前后端框架Known-V1.2.8

V1.2.8 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行。 Gitee: https://gitee.com/known/KnownGithub:https://github.com/known/Known 概述 基于C#和Blazor…

Linked List

文章目录 链表定义专业术语代码链表分类常见算法链表创建和常用算法 链表总结 链表 补充知识 typedef 给类型换名字,比如 typedef struct Student {int sid;char name[100];char sex; }ST;//ST就代表了struct Student //即这上方一大坨都可以用ST表示 //原先结构体…

Springer独立出版 | 2023年触觉与虚拟现实国际会议(ICHVR 2023)

会议简介 Brief Introduction 2023年触觉与虚拟现实国际会议(ICHVR 2023) 会议时间:2023年12月15日-17日 召开地点:中国北海 大会官网:www.ichvr.org 2023年触觉与虚拟现实国际会议(ICHVR 2023)由东南大学、上海交通大学联合主办;…

通过String字符生成base64编码

* base64转图片 //对字节数组字符串进行Base64解码并生成图片 * param base64str base64码 * return // param savePath 图片路径private static final String savePath"image_ver\\verifyCode"; 判断是否为base64编码 public static void mainDD…

PHP使用Redis实战实录4:单例模式和面向过程操作redis的语法

PHP使用Redis实战实录系列 PHP使用Redis实战实录1:宝塔环境搭建、6379端口配置、Redis服务启动失败解决方案PHP使用Redis实战实录2:Redis扩展方法和PHP连接Redis的多种方案PHP使用Redis实战实录3:数据类型比较、大小限制和性能扩展PHP使用Re…

ajax概述

目录 1.什么是ajax 2.ja原生ajax 3.jQuery框架的ajax 4.综合案例 1.什么是ajax Ajax 即"Asynchronous Javascript And XML"(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。Ajax 异步 JavaScript 和 XML&…

多线程(JavaEE初阶系列5)

目录 前言: 1.什么是定时器 2.标准库中的定时器及使用 3.实现定时器 结束语: 前言: 在上一节中小编给大家介绍了多线程中的两个设计模式,单例模式和阻塞式队列模式,在单例模式中又有两种实现方式一种是懒汉模式&a…

初识TDMQ

目录 一:需求背景二:相关文档三:验证TDMQ广播消息 一:需求背景 目前公司需要将决策引擎处理的结果, 一部分数据交给下游分析/入黑/通知等功能。因此就需要决策引擎生产结果让多方下游去消费。 而我需要实现下游的一部…

微信小程序转抖音小程序的坑:The component <xxx> used in pages/xxx/xxx is undefined

微信小程序组件定义在根目录的 app.json 中了,在抖音小程序中出现找不到的情况。 在需要用到组件的 pages 目录中页面文件夹的 json "usingComponents": {} 大括号中添加页面使用的组件,即可使用...

STM32使用HAL库BH1750光照度传感器

开发环境 单片机:STM32F103C8T6 光照度传感器:BH1750 IDE:KEILSTM32CUBEMX 单片机配置 1、STM32CUBEMX BH1750代码 1、头文件 /* ************************************************* BH1750光照数据计算(LUX) …

Shell脚本实现分库分表操作

目录 一,分库备份 二,分库操作 三,分库分表备份 四,备份还原 一,分库备份 #!/bin/bash mysql_cmd-uroot -pzly666666 bak_path/backup/db [ -d ${bak_path} ] || mkdir -p ${bak_path}mysql ${mysql_cmd} -e show…

操作系统期末总复习结构

目录 前言 操作系统引论 操作系统的目标 操作系统的基本特征 操作系统的主要功能 系统调用的基本概念 进程的描述与控制 进程和程序的区别 程序为什么不能并发执行(引入进程的原因) 进程的基本状态与转换 进程通信的类型 线程的概念以及与进程…

解决Django报错 : No module named ‘MySQLdb‘

Django的版本是2.0,Python的版本号是3.6.4 在models.py创建好了模型类之后使用命令:python manage.py makemigrations 进行迁移,但是突然报错:ImportError:No module named MySQLdb 查询了相关资料发现python2.x版本是支持mysql…

Linux - PostgreSQL 适用于9.x 以上的 tar.gz 源码安装与理解 - 报错集锦

这里写目录标题 序言主要内容bash 配置文件个人理解关于初始化 PostgreSQL 数据库的理解 启动方法检查服务器是否在PostgreSQL中运行关闭 postgresql 数据库方法参考链接 序言 PostgreSQL 9.x 以下版本笔者没用过,具体操作看参考链接,笔者就不记录重复操…

类与对象(上-2)

类与对象(上-2) 6、类的实例化7、计算类空间的大小8、this指针 6、类的实例化 Test.cpp //用类类型创建对象的过程,称为类的实例化。 //类是对对象进行描述的,是一个 模型 一样的东西,来限定了类有哪些成员&#xff…

回答网友 修改一个exe

网友说:他有个很多年前的没有源码的exe,在win10上没法用,让俺看一下。 俺看了一下,发现是窗体设计的背景色的问题。这个程序的背景色用的是clInactiveCaptionText。clInactiveCaptionText 在win10之前的系统上是灰色,但…

幅度调制与角度调制

文章目录 前言一、调制简介1、调制定义2、调制目的3、调制的分类 二、幅度调制(线性调制)1、幅度调制的一般模型2、常规双边带调幅 AM①、AM 信号的产生②、AM 调制器的模型③、AM 波形和频谱④、AM 信号的特点⑤、AM 包络检波⑥、调幅系数 3、抑制载波双…

Java中对Redis的常用操作

目录 数据类型五种常用数据类型介绍各种数据类型特点 常用命令字符串操作命令哈希操作命令列表操作命令集合操作命令有序集合操作命令通用命令 在Java中操作RedisRedis的Java客户端Spring Data Redis使用方式介绍环境搭建配置Redis数据源编写配置类,创建RedisTempla…

推荐带500创作模型的付费创作V2.1.0独立版系统源码

ChatGPT 付费创作系统 V2.1.0 提供最新的对应版本小程序端,上一版本增加了 PC 端绘画功能, 绘画功能采用其他绘画接口 – 意间 AI,本版新增了百度文心一言接口。 后台一些小细节的优化及一些小 BUG 的处理,前端进行了些小细节优…

Spring依赖注入和ioc在spring中的实现方式

目录 一、依赖注入 1.IOC思想 2.什么是依赖注入? 3.实例化对象中有pojo类型属性 二、IOC在Spring中的实现方式 1.获取bean的三种方式 1.1根据bean的id获取 1.2根据bean的类型获取(最常用,因为在IOC容器中,一个类型的bean只…