RH358服务管理和自动化–自动化服务管理和网络接口配置
RH358课程在每章的最后一个章节内容都是讲解如何使用Ansible对本章所学进行自动化管理。所以需要你有Ansible的基础。若对Ansible感兴趣,可订阅金鱼哥写的Ansible专栏。本章节属于第一章第三节内容。
开篇回顾:https://blog.csdn.net/qq_41765918/article/details/121875149
1. 使用Ansible的自动化
熟练的系统管理员需要能够手动安装和配置他们管理的服务。能够自动化这些服务的标准部署、配置和管理是高效和重复管理这些服务的关键,特别是在规模上。
本课程是需要你已经熟悉Ansible自动化工具上的Ansible自动化平台。如果你不熟悉Ansible,可查看金鱼哥写的Ansible专栏:https://blog.csdn.net/qq_41765918/category_11512932.html。
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. 使用网络系统角色配置网络
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事实的网络配置
4. Ansible事实的网络配置
当一个play执行自动事实收集或运行setup模块时,Ansible会收集与网络配置相关的事实。如果您需要一台机器的网络接口、IP地址或当前配置的信息,以便在剧本中使用,这些事实中有许多是特别有用的。
事实名字描述ansible_facts[‘all_ipv4_addresses’]包含以下列表被管理主机上配置的IPv4地址,省略127.0.0.1ansible_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地址信息
显示接口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地址识别网络接口
通过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页)
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进行网络配置。若喜欢金鱼哥的文章,顺手点个赞。也可点个关注,因为后续会不断上干货。