Ansible最佳实践之Playbook使用过滤器处理网络地址

这篇具有很好参考价值的文章主要介绍了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_work
  hosts: all
  tasks:
    - name: print
      debug:
        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' value
  assert:
    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' value
  assert:
    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/netmask
  set_fact:
    net_mask: "{{ ansible_facts.default_ipv4.network }}/{{ ansible_facts.default_ipv4.netmask }}"
- name: Task 6- Check 'net_mask' value
  assert:
    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 format
  set_fact:
    cidr: "{{ net_mask | ipaddr('net') }}"
- name: Task 8- Check 'cidr' value
  assert:
    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/mask
  set_fact:
    address_in_range: "{{ server_address | ipaddr(net_mask) }}"
- name: Task 10- Check 'address_in_range' value
  assert:
    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 CIDR
  set_fact:
    broadcast: "{{ cidr | ipaddr('broadcast') }}"
- name: Task 12- Check 'broadcast' value
  assert:
    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' value
  assert:
    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.yml

PLAY [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 exercise
  hosts: servera.lab.example.com
  roles:
    - role: netfilters

[student@workstation data-netfilters]$

博文参考

《DO447》文章来源地址https://www.toymoban.com/news/detail-617750.html

到了这里,关于Ansible最佳实践之Playbook使用过滤器处理网络地址的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 异常过滤器—MVC中异常过滤器使用

    异常过滤器( Exception Filters )是 ASP.NET Core 中用于处理全局异常的机制。它们允许你在发生异常时捕获、处理和记录异常,并提供自定义的异常处理逻辑。异常过滤器在整个应用程序范围内生效,可以用于处理各种异常情况。用于实现常见的错误处理策略,没有之前和之后事

    2024年02月13日
    浏览(60)
  • 操作过滤器—MVC中使用操作过滤器实现JWT权限认证

    上一篇文章分享了授权过滤器实现JWT进行鉴权,文章链接:授权过滤器—MVC中使用授权过滤器实现JWT权限认证,接下来将用操作过滤器实现昨天的JWT鉴权。 ​ 与授权过滤器大部分一样,只是执行的时机和继承的接口有所不同。操作过滤器是在Action执行的前和后进行调用执行

    2024年02月13日
    浏览(52)
  • 结果过滤器—MVC项目中结果过滤器(Result Filter)使用

    结果过滤器( ResultFilter ),是对执行的Action结果进行处理的一种AOP思想,适用于任何需要直接环绕 View 或格式化处理的逻辑。结果过滤器可以 替换或更改 Action 结果 。在 IActionResult 执行的前后执行,使用它能够控制Action的执行结果,比如:格式化结果等。需要注意的是,它只

    2024年02月12日
    浏览(55)
  • springboot使用过滤器

    过滤器是处于客户端与服务器资源文件之间的一道过滤网,帮助我们过滤一些不符合要求的请求。通常用作 Session校验,判断用户权限。 使用过滤器很简单,只需要实现Filter类,然后重写它的3个方法即可。 init方法:程序启动调用Filter的init()方法(永远只调用一次);在容器中

    2024年02月15日
    浏览(56)
  • Vue过滤器基本使用

    在Vue 2中,你可以使用 filters 选项来定义过滤器。以下在组件中定义和使用过滤器的简单例子: 1、app.vue 使用methods实现: 2、使用filters配合computed计算属性实现: 3、引入其他组件FilterFix.vue实现: app.vue FilterFix.vue main.js

    2024年02月09日
    浏览(56)
  • 资源过滤器—MVC中使用资源过滤器实现不执行Action方法体读取缓存信息返回

    上两篇文章分享了过滤器实现JWT进行鉴权,分别是通过授权过滤器和操作过滤器实现,这两个过滤器也是最常用的。文章链接:授权过滤器—MVC中使用授权过滤器实现JWT权限认证,操作过滤器—MVC中使用操作过滤器实现JWT权限认证,接下来将简单的谈谈资源过滤器在MVC中如何

    2024年02月13日
    浏览(55)
  • 网关Gateway过滤器的使用

    前言: 最近在学习微服务相关的知识,看了黑马的相关课程,将关于Gateway过滤器的知识又总结了一些,希望能帮到各位小伙儿们以及加深下自己的印象🎊 如果文章有什么需要改进的地方还请大佬多多指教🥂 小威先感谢大家的支持了😁 Gateway网关的过滤器分为两种,一种是

    2023年04月09日
    浏览(49)
  • Vue中过滤器如何使用?

    过滤器是对即将显示的数据做进⼀步的筛选处理,然后进⾏显示,值得注意的是过滤器并没有改变原来 的数据,只是在原数据的基础上产⽣新的数据。过滤器分全局过滤器和本地过滤器(局部过滤器)。 目录 全局过滤器 本地过滤器 过滤器传参 串联过滤器 下⾯定义⼀个全局

    2024年02月10日
    浏览(50)
  • 如何使用Vue模板的过滤器?

    你想要学习如何使用Vue模板的过滤器吗? 首先,让我们来看看Vue模板是什么。Vue模板就是一个用来描述组件的结构和内容的HTML代码。在Vue模板中,我们可以使用过滤器来对数据进行处理和格式化。过滤器可以让你的数据变得更加美观、易读,也可以实现一些复杂的数据处理

    2024年02月08日
    浏览(37)
  • springboot中使用filter过滤器

    filter过滤器其实是JavaEE中的规范,JavaWeb中的三大组件是filter过滤器、listener监听器,servlet服务。 过滤器的作用就是把请求拦截下来,从而对请求进行一些特殊操作,比如检验用户是否登录,判断权限,设置编码格式、敏感字符处理等。 filter过滤器中有三个方法: 分别是初始

    2024年02月08日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包