金鱼哥RHCA回忆录:RH358管理网络服务--自动化服务管理和网络接口配置
RH358服务管理和自动化–自动化服务管理和网络接口配置
RH358课程在每章的最后一个章节内容都是讲解如何使用Ansible对本章所学进行自动化管理。所以需要你有Ansible的基础。若对Ansible感兴趣,可订阅金鱼哥写的Ansible专栏。本章节属于第一章第三节内容。
1. 使用Ansible的自动化
熟练的系统管理员需要能够手动安装和配置他们管理的服务。能够自动化这些服务的标准部署、配置和管理是高效和重复管理这些服务的关键,特别是在规模上。
本课程是需要你已经熟悉Ansible自动化工具上的Ansible自动化平台。如果你不熟悉Ansible,可查看金鱼哥写的Ansible文章。
2. 自动化服务管理
Ansible提供了三个在使用systemd服务时特别有用的模块:service、systemd和service_facts。
当需要对网络业务进行基本管理时,可以使用service模块。service模块提供了一组基本选项:启动、停止、重启和启用。请执行ansible-doc service命令获取更多信息。
- name: web server is started
service:
name: httpd
state: started
systemd模块提供了更多的配置选项。例如,systemd允许运行daemon-reload,但service模块不允许。请运行ansible-doc systemd命令获取更多信息。
- name: reload web server
systemd:
name: apache2
state: reload
daemon-reload: yes
service_facts模块收集关于系统上服务的信息,比如它们是否在引导时启动,它们是否正在运行,并将这些信息存储在ansible_facts['services ']变量中。请运行ansible-doc service_facts命令获取更多信息。
- name: collect service status facts
service_facts:
- name: display whether NetworkManager is running
debug:
var: ansible_facts['services']['NetworkManager.service']['state']
3. 使用网络系统角色配置网络
RHEL8或者CentOS8 中,会包含了一个名为rhel-system-roles的包(7的系统也包含),它包含了一个用于Linux服务管理的Ansible Roles集合。这些都是基于上游的Linux系统角色项目https://linux-system-roles.github.io/。当安装包时,它将角色放置在/usr/share/ansible/roles目录中,默认情况下该目录位于DEFAULT_ROLES_PATH中,以便您的剧本可以使用它们。
rhel-system-roles.network角色也称为linux-system-roles.network,是在托管主机上配置网络设置的最简单方法。
这个角色配置了network_connections变量。例如,对于特定的主机,可以在host_vars主机变量文件中包含以下内容
---
network_connections:
- name: ens4
type: ethernet
ip:
address:
- 172.25.250.30/24
network_connections变量是一个字典列表,用于配置不同的连接,指定为一个字典列表,使用接口名作为连接名。
下表列出了network_connections变量的选项。
选项名称 | 描述 |
---|---|
name | 标识连接配置文件。 |
state | 连接配置文件的运行时状态:up(如果连接配置文件是活动的),down(如果连接配置文件是非活动的)。 |
persistent_state | 当前的设置是默认的present,将创建或修改连接配置文件。您还必须指定类型选项。如果不将state状态选项设置为up,则不会启动新的或修改过的连接。absent设置将删除连接配置文件。 |
type | 标识连接类型。有效值包括ethernet、bridge、bond、team、vlan、macvlan和infiniband。 |
autoconnect | 确定连接是否自动启动。 |
mac | 限制在具有特定MAC地址的设备上使用连接。 |
interface_name | 限制特定接口使用的连接配置文件。 |
zone | 配置接口所属的防火墙区域。 |
ip | 确定连接的IP配置。支持address、指定静态IP地址、或者dns配置DNS服务器。 |
下面的例子使用了这些附加选项中的一些:
① 使用eth0作为连接名。
② 使连接持久,这是默认值。
③ 将连接类型设置为以太网。
④ 在引导时自动启动连接。这是默认值。
⑤ 限制连接设置只能被该MAC地址的设备使用。
⑥ 配置172.25.250.40/24为连接IP地址。
⑦ 配置外部作为连接的防火墙区域。
⑧ 激活连接配置文件。
要使用网络系统角色,你可以在剧本中的角色子句下指定角色名:
- name: Ensure NICs have the right configuration
hosts: webservers
roles:
- rhel-system-roles.network
上面的示例假设在剧本中为每个主机定义了network_connections变量,如果使用静态寻址,可能在host_vars中作为特定于主机的清单变量。
如果使用DHCPv4或SLAAC进行IP地址配置,则可以指定网络连接范围更广。例如,假设所有的主机在webserver中,enp5s0作为一个接口,应该配置动态寻址,你可以创建一个group_vars/webservers文件,其中包含以下内容:
network_connections:
- name: enp5s0
type: ethernet
ip:
dhcp4: yes
auto6: yes
autoconnect: yes
state: up
4. Ansible事实的网络配置
当一个play执行自动事实收集或运行setup模块时,Ansible会收集与网络配置相关的事实。如果您需要一台机器的网络接口、IP地址或当前配置的信息,以便在剧本中使用,这些事实中有许多是特别有用的。
事实名字 | 描述 |
---|---|
ansible_facts[‘all_ipv4_addresses’] | 包含以下列表被管理主机上配置的IPv4地址,省略127.0.0.1 |
ansible_facts[‘all_ipv6_addresses’] | 包含以下列表被管主机上配置的IPv6地址,省略::1,但包含fe80::/10中的链路本地地址。 |
ansible_facts[‘default_ipv4’] | 包含被管理主机上配置IPv4缺省路由的接口的事实字典,包括接口的名称、MAC地址和网络设置。如果没有缺省路由,则为空。 |
ansible_facts[‘default_ipv6’] | 包含被管理主机上配置了缺省IPv6路由的接口的事实字典,包括接口的名称、MAC地址和网络设置。如果没有缺省路由,则为空。 |
ansible_facts[‘interfaces’] | 包含被管理主机上所有网络接口的列表。 |
ansible_facts[’*interface-name*’] | 包含关于网络接口interface-name的事实字典,包括其当前网络配置和特性。 |
记住:可以使用调试模块检查这些事实的内容。
显示接口IP地址信息
如果enp11s0接口有一个IPv4地址,显示如下:
- name: display IPv4 address of enp11s0
debug:
var: ansible_facts['enp11s0']['ipv4']['address']
您可以使用过滤器来获取接口上的IPv6地址列表。下面的示例使用map(attribute=‘address’)过滤器来获取列表中每个项目的地址事实值。然后,列表过滤器将结果转换为列表。
- name: display list of IPv6 addresses of enp11s0
debug:
var: ansible_facts['enp11s0']['ipv6'] | map(attribute='address') | list
这产生下列输出:
"ansible_facts['enp011s0']['ipv6'] | map(attribute='address') | list": [
"2001:db8:1000::290",
"2001:db8:1000::4455:6677:aabb:ccdd",
"fe80::1234:5678:9abc:def0"
]
通过MAC地址识别网络接口
在Red Hat Enterprise Linux中,为了保证网络接口的稳定性,网络接口的名称通常基于系统总线的硬件拓扑结构。有时很难识别新硬件上特定端口的正确接口名称,特别是在多个网络接口可用的情况下。但是,如果您知道一个网络端口的MAC地址,那么您可以使用Ansible事实来检索该接口的名称。
例如,考虑以下运行在托管主机服务器上的剧本:
第一个任务the_interface设置为在被管理主机的target_mac变量中有MAC地址的接口的名称。
该任务的工作方式是检查被管理主机上每个接口的macaddress事实值。它只在定义了macaddress(例如,它不为ansible_facts [‘lo’])并且匹配target_mac的值时设置the_interface。
如果您将这个示例转换为在同一个剧本中检查许多主机,您将不会在剧本中硬编码target_mac的值。相反,可以将target_mac变量设置为剧本中的每个主机的主机变量,也可在host_vars文件中。
5. 课本练习(第30页)
[student@workstation ~]$ lab servicemgmt-automation start
1. 查看/home/student/servicemgmt-automation目录下的Ansible目录文件。
[student@workstation ~]$ cd ~/servicemgmt-automation
[student@workstation servicemgmt-automation]$ cat inventory
[servers]
servera.lab.example.com
2. 编写一个以servers组为目标的剧本,并确保已启动并启用NetworkManager服务。
[student@workstation servicemgmt-automation]$ vim playbook.yml
---
- name: Configure 2nd network interface
hosts: servers
become: true
tasks:
- name: Confirm NetworkManager is running
service:
name: NetworkManager
state: started
enabled: true
[student@workstation servicemgmt-automation]$ ansible-playbook \
--syntax-check playbook.yml
[student@workstation servicemgmt-automation]$ ansible-playbook playbook.yml
因为NetworkManager已经在服务器上运行了,所以playbook没有做任何改变。
3. 在相同的剧本中,添加一个任务。
# 在变量中设置每个主机的辅助接口的名称,如果你事先知道每个接口的MAC地址。
[student@workstation servicemgmt-automation]$ vim playbook.yml
---
- name: Configure 2nd network interface
hosts: servers
become: true
vars:
target_mac: "52:54:00:01:fa:0a"
tasks:
- name: Confirm NetworkManager is running
service:
name: NetworkManager
state: started
enabled: true
- name: Find the_interface for target_mac
set_fact:
the_interface: "{{ item }}"
when:
- ansible_facts[item]['macaddress'] is defined
- ansible_facts[item]['macaddress'] == target_mac
loop: "{{ ansible_facts['interfaces'] }}"
- name: Display the_interface
debug:
var: the_interface
[student@workstation servicemgmt-automation]$ ansible-playbook --syntax-check playbook.yml
playbook: playbook.yml
[student@workstation servicemgmt-automation]$ ansible-playbook playbook.yml
4. 将刚才标识的接口配置为静态地址192.168.0.1/24。
# 使用包含或导入(哪个更合适)rhel-system-roles. network的任务。
[student@workstation servicemgmt-automation]$ ansible-galaxy list
# /usr/share/ansible/roles
# /etc/ansible/roles
[WARNING]: - the configured path /home/student/.ansible/roles does not exist.
如果没有角色,请安装rhel-system-roles包。
[student@workstation servicemgmt-automation]$ sudo yum -y install rhel-system-roles
[student@workstation servicemgmt-automation]$ ansible-galaxy list
# /home/student/.ansible/roles
# /usr/share/ansible/roles
- linux-system-roles.kdump, (unknown version)
- linux-system-roles.network, (unknown version)
- linux-system-roles.postfix, (unknown version)
- linux-system-roles.selinux, (unknown version)
- linux-system-roles.storage, (unknown version)
- linux-system-roles.timesync, (unknown version)
- rhel-system-roles.kdump, (unknown version)
- rhel-system-roles.network, (unknown version)
- rhel-system-roles.postfix, (unknown version)
- rhel-system-roles.selinux, (unknown version)
- rhel-system-roles.storage, (unknown version)
- rhel-system-roles.timesync, (unknown version)
# /etc/ansible/roles
[WARNING]: - the configured path /home/student/.ansible/roles does not exist.
[student@workstation servicemgmt-automation]$ vim confignet.yml
---
- name: Configure 2nd network interface
hosts: servers
become: true
vars:
target_mac: "52:54:00:01:fa:0a"
network_connections:
- name: static_net
type: ethernet
mac: "{{ target_mac }}"
state: up
ip:
dhcp4: no
address:
- 192.168.0.1/24
roles:
- rhel-system-roles.network
5. 运行playbook配置服务器。
[student@workstation servicemgmt-automation]$ ansible-playbook \
--syntax-check confignet.yml
playbook: confignet.yml
[student@workstation servicemgmt-automation]$ ansible-playbook confignet.yml
6. 手动确认服务器网口设置是否正确。
[root@servera ~]# nmcli device
DEVICE TYPE STATE CONNECTION
eth0 ethernet connected Wired connection 1
eth1 ethernet connected static_net
eth2 ethernet disconnected --
lo loopback unmanaged --
[root@servera ~]# nmcli connection show
NAME UUID TYPE DEVICE
Wired connection 1 4ae4bb9e-8f2d-3774-95f8-868d74edcc3c ethernet eth0
static_net 01a4c317-ce0f-4fa5-b71d-c5bf401d6e44 ethernet eth1
Wired connection 2 c0e6d328-fcb8-3715-8d82-f8c37cb42152 ethernet --
Wired connection 3 9b5ac87b-572c-3632-b8a2-ca242f22733d ethernet --
[root@servera ~]# nmcli con show static_net | grep ipv4
ipv4.method: manual
ipv4.dns: --
ipv4.dns-search: --
ipv4.dns-options: --
ipv4.dns-priority: 0
ipv4.addresses: 192.168.0.1/24
ipv4.gateway: --
ipv4.routes: --
ipv4.route-metric: -1
ipv4.route-table: 0 (unspec)
ipv4.routing-rules: --
ipv4.ignore-auto-routes: no
ipv4.ignore-auto-dns: no
ipv4.dhcp-client-id: --
ipv4.dhcp-timeout: 0 (default)
ipv4.dhcp-send-hostname: yes
ipv4.dhcp-hostname: --
ipv4.dhcp-fqdn: --
ipv4.never-default: no
ipv4.may-fail: yes
ipv4.dad-timeout: -1 (default)
[root@servera ~]# ping -c2 192.168.0.254
7. 重新启动servera。确认NetworkManager服务正在运行,并且网络接口配置仍然正确。
[root@servera ~]# reboot
[student@workstation servicemgmt-automation]$ ansible servers -m shell -a 'nmcli con show'
[student@workstation servicemgmt-automation]$ ansible servers -m shell \
-a 'nmcli con show static_net' | grep ipv4
完成实验
[student@workstation ~]$ lab servicemgmt-automation finish
总结
- 介绍了如何自动化服务管理。
- 介绍了使用网络系统角色(rhel-system-roles.network)进行网络配置。
- 介绍了使用Ansible Facts进行网络配置。
以上就是【金鱼哥】对 第一章 管理网络服务–自动化服务管理和网络接口配置 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。
如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!
- 点赞
- 收藏
- 关注作者
评论(0)