金鱼哥RHCA回忆录:DO447使用过滤器和插件转换器--使用过滤器处理网络地址

金鱼哥 发表于 2022/06/16 17:50:44 2022/06/16
【摘要】 第四章 使用过滤器和插件转换器--使用过滤器处理网络地址

🎹 个人简介:大家好,我是 金鱼哥,CSDN运维领域新星创作者,华为云·云享专家,阿里云社区·专家博主
📚个人资质:CCNA、HCNP、CSNA(网络分析师),软考初级、中级网络工程师、RHCSA、RHCE、RHCA、RHCI、ITIL😜
💬格言:努力不一定成功,但要想成功就必须努力🔥


📜4.1 收集和处理网络信息

许多过滤器和查找插件可用来收集和处理网络信息,以实现Ansible自动化。当您在托管主机上配置网络设备时,这些过滤器和插件可以与事实收集一起使用。

标准的设置模块在许多剧本开始时自动收集事实,从每个被管理的主机收集大量与网络相关的信息。

注意:如果您只需要与网络相关的事实,您可以将setup作为显式任务运行,并使用gather_subset选项来限制收集这些事实。

- name: Collect only network related facts
  setup:
  gather_subset:
    - '!all'
    - network

这里有一些特别有用的事实。事实ansible_facts[‘interfaces’]是系统上所有网络接口名称的列表。您可以使用这个列表来检查系统上每个网络接口的事实。例如,如果enp11s0是系统上的一个接口,那么它有一个名为ansible_facts [‘enp11s0’]的事实,这是一个包含它的MAC地址的字典。IPv4和IPv6地址,内核模块,等等作为值。

还有一些有用的事实需要记住:

image-20220416184309293

使用这些事实的例子:

image-20220416184332668


📜4.2 网络信息过滤

官网:https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters_ipaddr.html

ipaddr过滤器提供了操作和验证与网络相关的事实的功能。可以使用它来检查IP地址的语法,将VLSN子网掩码转换为CIDR子网前缀表记法,执行子网数学运算,并查找网络范围内的下一个可用地址,等等。

重要: ipaddr过滤器需要Python3-netaddr,该模块由Red Hat Enterprise Linux 8中的python3-netaddr包提供。使用Ansible或Yum包管理器,确保该包安装在控制节点上。

但本节将探讨它的一些用途。

在最简单的形式中,不带参数的ipaddr过滤器只接受一个值。如果值为一个IP地址,然后过滤器返回IP地址。如果不是IP地址,则返回过滤器False

如果值是一个列表,那么过滤器返回有效IP地址,而不是无效IP地址。如果所有项无效,则返回一个空列表。

{{ my_hosts_list | ipaddr }}

但是,也可以向ipaddr过滤器传递参数。这些参数可以使过滤器根据数据输入返回不同的信息。例如,如果my_network的值是10.0.0.1/23,那么下面的jinj2表达式将输出变长子网掩码(VLSN) 255.255.254.0:

{{ my_network | ipaddr('netmask') }}

ipaddr过滤器有以下选项:


📑address

验证输入的值是有效的IP地址。如果输入包含网络前缀,则将其删除。


📑net

验证输入值是网络范围,并以CIDR格式返回。


📑host

确保IP地址符合等价的CIDR前缀格式。


📑prefix

验证输入主机是否满足主机/前缀或CIDR格式,并返回其前缀(以比特为单位的网络掩码大小)


📑host/prefix

验证输入值是否为主机/前缀格式。即主机部分是网络中可用的IP地址,前缀是有效的CIDR前缀。


📑network/prefix

验证输入值是否为网络/前缀格式。即网络部分为网络地址(网络中最低的IP地址),前缀为有效的CIDR前缀。


📑public or private

验证输入的IP地址或网络范围是否在IANA分别保留为公共或私有的范围内。


📑size

将输入网络范围转换为该范围内的IP地址数。


📑Any integer number (n).

将一个网络范围转换为该范围内的第n个元素。负数返回倒数第n个元素


📑network, netmask, and broadcast

验证输入主机是否满足主机/前缀或CIDR格式,并将其转换为网络地址(对主机应用网络掩码)。或广播地址。


📑subnet

验证输入主机是否满足主机/前缀或CIDR格式,并返回包含该主机的子网。


📑ipv4 and ipv6

验证输入是有效的网络范围,并将它们分别转换为IPv4和IPv6格式。


📜4.3 使用插件收集网络信息

您可以使用许多查找插件来收集有关网络环境的信息。其中包括dig来查找DNS信息,dnstxt来获取DNS TXT记录,以及更深奥的插入,比如aws_service_ip_ranges来获取Amazon AWS EC2服务的IP范围,以及nios_next IP来从Infoblox获取网络的下一个可用IP。


📑查找DNS信息

正如它的名字所暗示的,挖掘查找是一个用于挖掘命令的接口。dig命令对DNS服务器执行查询并返回结果记录。此查找使用了来自python3-dns包的dnspython python库,该库必须在控制节点中可用。

在其最简单的形式中,dig查找查询控制器中配置的DNS服务器,以获取提供的完全限定域名(FQDN)的A记录。

"{{ lookup('dig', 'example.com') }}"

要获得不同类型的记录,请为查找提供额外的qtype参数,或者将斜杠(/)和记录类型附加到FQDN。下面的示例从example.com域获取相同的MX记录。

"{{ lookup('dig', 'example.com', 'qtype=MX') }}"
"{{ lookup('dig', 'example.com/MX') }}"

dig查找允许使用与控制器中配置的DNS服务器不同的DNS服务器。提供一个以逗号分隔的要使用的DNS服务器列表的附加参数,以@符号作为前缀,如下所示:

"{{ lookup('dig', 'example.com', '@4.4.8.8,4.4.4.4) }}"

注意:一些DNS记录可能包含相同记录类型的多个值。在这种情况下,挖掘查找返回单个值,其中包含以逗号分隔的返回值列表。要获得值列表,请使用query和查找过滤器。

"{{ query('dig', 'example.com/MX') }}"

与其他类型一样,dig查找可以提供DNS文本记录(qtype=TXT)。如果只需要TXT记录,dnstxt查找可以代替dig查找。dnstxt查找提供了更简单的格式,并且依赖于Python的dns/dns.resolver 库在Redhat Enterprise Linux 8中的python3-dns RPM包中的解析器库。

"{{ lookup('dnstxt', ['test.example.com']) }}"

这些过滤器和函数的示例:

image-20220416184740929


📜4.4 课本练习

[student@workstation ~]$ lab data-netfilters start
[student@workstation ~]$ cd ~/DO447/labs/data-netfilters

[student@workstation ~]$ ansible localhost -m setup -a 'filter=*ipv4*'
localhost | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.122.1",
            "172.25.250.9"
        ],
        "ansible_default_ipv4": {
            "address": "172.25.250.9",
            "alias": "enp1s0",
            "broadcast": "172.25.250.255",
            "gateway": "172.25.250.254",
            "interface": "enp1s0",
            "macaddress": "52:54:00:00:fa:09",
            "mtu": 1500,
            "netmask": "255.255.255.0",
            "network": "172.25.250.0",
            "type": "ether"
        }
    },
    "changed": false
}

📑按要求修改剧本

第一个任务验证default_ipv4.addresses变量包含正确格式化的IP地址。ipaddr过滤器在没有接收到其他参数的情况下,会缩小有效ip的范围。

    server_address: "{{ ansible_facts.default_ipv4.address | ipaddr }}"

如果输入值(ansible_facts.default_ipv4.address)是有效的,ipaddr给结果(server_address)赋相同的值。否则,ipaddr返回一个空字符串。

第三个任务的目标是获取与托管主机关联的DNS名称。这也称为反向DNS或PTR记录解析,通常用于验证邮件服务器的DNS配置。

要解析反向DNS表项,请向ipaddr过滤器提供revdns参数:

    address_dns: "{{ server_address | ipaddr('revdns') }}"

在这种情况下,托管主机没有显式的PTR记录,因此返回in-addr.arpa。

第五个任务通过添加ansible_facts来创建ansible_facts.default_ipv4.network的事实。一个斜线(/)和ansible_facts.default_ipv4.netmask事实。这个事实在第七个任务中被用来为网络生成CIDR格式。

在第七个任务中更新cidr变量的表达式。添加带有net参数的ipaddr过滤器:

    cidr: "{{ net_mask | ipaddr('net') }}"

修改第9个任务中address_in_range变量的表达式,以检查server_address变量是否属于网络:

    address_in_range: "{{ server_address | ipaddr(net_mask) }}"

第九个任务验证在第一个任务中获得的托管主机地址实际上属于在第五个和第七个任务中创建的网络定义。如果ipaddr过滤器接收到一个有效的网络定义,过滤器检查输入参数IP地址属于提供的网络。否则,该IP地址将被过滤,结果为空。

第11个任务获取网络定义的广播地址。在ipaddr过滤器中使用broadcast参数,并以network/mask或CIDR格式提供网络定义:

    broadcast: "{{ cidr | ipaddr('broadcast') }}"

第十三个任务利用dig查找插件获取example.com域的DNS记录。

使用dig查找插件将dig_record变量的值设置为与example.com域关联的MX记录。为此,dig查找插件需要域和记录类型作为参数:

    dig_record: "{{ lookup( 'dig', 'example.com.', 'qtype=MX') }}"

如果没有提供qtype参数,那么dig过滤器将返回A记录类型。


📑执行剧本

[student@workstation data-netfilters]$ ansible-playbook site.yml


📑清除实验

[student@workstation ~]$ lab data-netfilters finish


🔎5 章节实验

[student@workstation ~]$ lab data-review start


📑拉取实验代码

[student@workstation ~]$ mkdir -p /home/student/git-repos
[student@workstation ~]$ cd /home/student/git-repos
[student@workstation git-repos]$ git clone http://git.lab.example.com:8081/git/data-review.git
[student@workstation git-repos]$ cd data-review

📑重构防火墙任务

重构防火墙角色中的任务,以实现灵活的防火墙规则规范。角色处理firewall_rules变量,该变量定义了防火墙规则规范列表

# 在所有三个防火墙任务的state关键字的每个jinj2表达式的末尾添加| default('enabled')。
[student@workstation data-review]$ vim roles/firewall/tasks/main.yml
---
# tasks file for firewall

- name: Ensure Firewall Sources Configuration
  firewalld:
    source: "{{ item.source }}"
    zone: "{{ item.zone }}"
    permanent: yes
    state: "{{ item.state | default('enabled') }}"
  loop: "{{ firewall_rules }}"
  when: item.source is defined
  notify: reload firewalld

- name: Ensure Firewall Service Configuration
  firewalld:
    service: "{{ item.service }}"
    zone: "{{ item.zone }}"
    permanent: yes
    state: "{{ item.state | default('enabled') }}"
  loop: "{{ firewall_rules }}"
  when: item.service is defined
  notify: reload firewalld

- name: Ensure Firewall Port Configuration
  firewalld:
    port: "{{ item.port }}/{{ item.protocol }}"
    zone: "{{ item.zone }}"
    permanent: yes
    state: "{{ item.state | default('enabled') }}"
  loop: "{{ firewall_rules }}"
  when: item.port is defined
  notify: reload firewalld

# 在所有三个防火墙任务的zone关键字的每个jinj2表达式的末尾添加I default(omit)。
---
# tasks file for firewall

- name: Ensure Firewall Sources Configuration
  firewalld:
    source: "{{ item.source }}"
    zone: "{{ item.zone | default(omit) }}"
    permanent: yes
    state: "{{ item.state | default('enabled') }}"
  loop: "{{ firewall_rules }}"
  when: item.source is defined
  notify: reload firewalld

- name: Ensure Firewall Service Configuration
  firewalld:
    service: "{{ item.service }}"
    zone: "{{ item.zone | default(omit) }}"
    permanent: yes
    state: "{{ item.state | default('enabled') }}"
  loop: "{{ firewall_rules }}"
  when: item.service is defined
  notify: reload firewalld

- name: Ensure Firewall Port Configuration
  firewalld:
    port: "{{ item.port }}/{{ item.protocol }}"
    zone: "{{ item.zone | default(omit) }}"
    permanent: yes
    state: "{{ item.state | default('enabled') }}"
  loop: "{{ firewall_rules }}"
  when: item.port is defined
  notify: reload firewalld

- name: Ensure Firewall Port Configuration
  firewalld:
    port: "{{ item.port }}/{{ item.protocol | default('tcp') | lower }}"
    zone: "{{ item.zone | default(omit) }}"
    permanent: yes
    state: "{{ item.state | default('enabled') }}"
  loop: "{{ firewall_rules }}"
  when: item.port is defined
  notify: reload firewalld

📑执行测试剧本

[student@workstation data-review]$ ansible-playbook test_firewall_role.yml

📑替换模板

带有一个查找插件,用于检索负载均衡器变量的IP地址。

[student@workstation data-review]$ vim templates/apache_firewall_rules.yml.j2
- port: {{ apache_port }}
  protocol: TC
  zone: internal
{% for load_balancer in groups['lb_servers'] %}
- zone: internal
  source: "{{ lookup('dig', load_balancer) }}"
{% endfor %}

要使用挖掘查找插件,还必须在执行playbook的主机上安装python3-dns

[student@workstation data-review]$ sudo yum -y install python3-dns

📑修改使用模板

[student@workstation data-review]$ vim deploy_apache.yml 
---
- name: Ensure Apache is deployed
  hosts: web_servers
  force_handlers: True
  gather_facts: no

  roles:
    # Use the apache_firewall_rules.yml.j2 template to
    # generate the firewall rules.
    - role: apache
#      firewall_rules: "{{ plugin | filter }}"
      firewall_rules: "{{ lookup('template', 'apache_firewall_rules.yml.j2') | from_yaml }}"

# 注意:firewall_rules变量定义在一行上。为了提高可读性,可以使用特殊变量来保持行长度在80个字符以下。下面的变化也是有效的:
  roles:
    # Use the apache_firewall_rules.yml.j2 template to
    # generate the firewall rules.
    - role: apache
#      firewall_rules: "{{ plugin | filter }}"
      firewall_rules: "{{ lookup('template', tfile ) | from_yaml }}"
      tfile: apache_firewall_rules.yml.j2

📑执行剧本并验证

[student@workstation data-review]$ ansible-playbook site.yml
[student@workstation data-review]$ curl servera
This is serverb. (version v1.0)
[student@workstation data-review]$ curl servera
This is serverc. (version v1.0)

📑上传代码

[student@workstation data-review]$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   deploy_apache.yml
	modified:   roles/firewall/tasks/main.yml
	modified:   templates/apache_firewall_rules.yml.j2

no changes added to commit (use "git add" and/or "git commit -a")

[student@workstation data-review]$ git add deploy_apache.yml roles/firewall/tasks/main.yml templates/apache_firewall_rules.yml.j2 

[student@workstation data-review]$ git commit -m "Added Filters and Plugins"
[master 58ca8ae] Added Filters and Plugins
 3 files changed, 11 insertions(+), 10 deletions(-)

[student@workstation data-review]$ git push
Enumerating objects: 17, done.
Counting objects: 100% (17/17), done.
Delta compression using up to 4 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (9/9), 900 bytes | 900.00 KiB/s, done.
Total 9 (delta 5), reused 0 (delta 0)
To http://git.lab.example.com:8081/git/data-review.git
   a35a1f8..58ca8ae  master -> master

📑评分并清楚实验

[student@workstation ~]$ lab data-review grade
[student@workstation ~]$ lab data-review finish

💡总结

RHCA认证需要经历5门的学习与考试,还是需要花不少时间去学习与备考的,好好加油,可以噶🤪。

以上就是【金鱼哥】对 第四章 使用过滤器和插件转换器–使用过滤器处理网络地址 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。

💾红帽认证专栏系列:
RHCSA专栏:戏说 RHCSA 认证
RHCE专栏:戏说 RHCE 认证
此文章收录在RHCA专栏:RHCA 回忆录

如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点。

如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。