-
导航到新的项目目录以进行网络管理。
cd ~/project
mkdir system-network
cd system-network
-
创建本次实验的 inventory 文件。
cat << EOF > inventory.ini
[webservers]
localhost ansible_connection=local
EOF
-
创建一个全面的网络和系统信息收集 playbook。
nano network_info.yml
添加以下内容:
---
- name: Gather comprehensive system information
hosts: webservers
become: true
tasks:
- name: Gather all system facts
ansible.builtin.setup:
- name: Create system report directory
ansible.builtin.file:
path: /tmp/system_reports
state: directory
mode: "0755"
- name: Generate system information report
ansible.builtin.template:
src: system_report.j2
dest: /tmp/system_reports/system_info_{{ ansible_facts['hostname'] }}.html
mode: "0644"
- name: Generate network configuration report
ansible.builtin.template:
src: network_report.j2
dest: /tmp/system_reports/network_info_{{ ansible_facts['hostname'] }}.html
mode: "0644"
- name: Collect network interface information
ansible.builtin.command:
cmd: ip addr show
register: ip_info
changed_when: false
- name: Collect routing information
ansible.builtin.command:
cmd: ip route show
register: route_info
changed_when: false
- name: Collect DNS configuration
ansible.builtin.command:
cmd: cat /etc/resolv.conf
register: dns_info
changed_when: false
- name: Display network summary
ansible.builtin.debug:
msg: |
System: {{ ansible_facts['hostname'] }}
OS: {{ ansible_facts['distribution'] }} {{ ansible_facts['distribution_version'] }}
Kernel: {{ ansible_facts['kernel'] }}
Default IPv4: {{ ansible_facts['default_ipv4']['address'] | default('N/A') }}
Default Interface: {{ ansible_facts['default_ipv4']['interface'] | default('N/A') }}
Total Memory: {{ ansible_facts['memtotal_mb'] }}MB
CPU Cores: {{ ansible_facts['processor_vcpus'] }}
-
创建模板目录和文件以用于报告。
mkdir templates
nano templates/system_report.j2
为系统报告模板添加以下内容:
<!doctype html>
<html>
<head>
<title>System Report - {{ ansible_facts['hostname'] }}</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
}
.section {
margin-bottom: 20px;
padding: 10px;
border: 1px solid #ccc;
}
.header {
background-color: #f5f5f5;
padding: 10px;
}
table {
border-collapse: collapse;
width: 100%;
}
th,
td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
</style>
</head>
<body>
<div class="header">
<h1>System Report for {{ ansible_facts['hostname'] }}</h1>
<p>
Generated on: {{ ansible_date_time.date }} {{ ansible_date_time.time
}}
</p>
</div>
<div class="section">
<h2>System Information</h2>
<table>
<tr>
<th>Property</th>
<th>Value</th>
</tr>
<tr>
<td>Hostname</td>
<td>{{ ansible_facts['hostname'] }}</td>
</tr>
<tr>
<td>FQDN</td>
<td>{{ ansible_facts['fqdn'] }}</td>
</tr>
<tr>
<td>Operating System</td>
<td>
{{ ansible_facts['distribution'] }} {{
ansible_facts['distribution_version'] }}
</td>
</tr>
<tr>
<td>Kernel</td>
<td>{{ ansible_facts['kernel'] }}</td>
</tr>
<tr>
<td>Architecture</td>
<td>{{ ansible_facts['architecture'] }}</td>
</tr>
<tr>
<td>CPU Cores</td>
<td>{{ ansible_facts['processor_vcpus'] }}</td>
</tr>
<tr>
<td>Total Memory</td>
<td>{{ ansible_facts['memtotal_mb'] }}MB</td>
</tr>
<tr>
<td>Uptime</td>
<td>{{ ansible_facts['uptime_seconds'] }} seconds</td>
</tr>
</table>
</div>
<div class="section">
<h2>Storage Information</h2>
<table>
<tr>
<th>Mount Point</th>
<th>Filesystem</th>
<th>Size</th>
<th>Used</th>
<th>Available</th>
</tr>
{% for mount in ansible_facts['mounts'] %}
<tr>
<td>{{ mount.mount }}</td>
<td>{{ mount.fstype }}</td>
<td>
{{ (mount.size_total / 1024 / 1024 / 1024) | round(2) }}GB
</td>
<td>
{{ ((mount.size_total - mount.size_available) / 1024 / 1024 /
1024) | round(2) }}GB
</td>
<td>
{{ (mount.size_available / 1024 / 1024 / 1024) | round(2) }}GB
</td>
</tr>
{% endfor %}
</table>
</div>
<div class="section">
<h2>Services Status</h2>
<table>
<tr>
<th>Service</th>
<th>Status</th>
</tr>
<tr>
<td>httpd</td>
<td>
{{ ansible_facts.services['httpd.service']['state'] |
default('not installed') }}
</td>
</tr>
<tr>
<td>sshd</td>
<td>
{{ ansible_facts.services['sshd.service']['state'] |
default('unknown') }}
</td>
</tr>
<tr>
<td>NetworkManager</td>
<td>
{{ ansible_facts.services['NetworkManager.service']['state'] |
default('unknown') }}
</td>
</tr>
</table>
</div>
</body>
</html>
-
创建网络报告模板。
nano templates/network_report.j2
添加以下内容:
<!doctype html>
<html>
<head>
<title>Network Report - {{ ansible_facts['hostname'] }}</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
}
.section {
margin-bottom: 20px;
padding: 10px;
border: 1px solid #ccc;
}
.header {
background-color: #f5f5f5;
padding: 10px;
}
table {
border-collapse: collapse;
width: 100%;
}
th,
td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
pre {
background-color: #f9f9f9;
padding: 10px;
overflow-x: auto;
}
</style>
</head>
<body>
<div class="header">
<h1>Network Configuration Report</h1>
<p>Host: {{ ansible_facts['hostname'] }}</p>
<p>
Generated on: {{ ansible_date_time.date }} {{ ansible_date_time.time
}}
</p>
</div>
<div class="section">
<h2>Network Interfaces</h2>
<table>
<tr>
<th>Interface</th>
<th>IPv4 Address</th>
<th>IPv6 Address</th>
<th>MAC Address</th>
<th>Status</th>
</tr>
{% for interface_name in ansible_facts['interfaces'] %} {% if
interface_name != 'lo' %} {% set interface_facts =
ansible_facts[interface_name] %}
<tr>
<td>{{ interface_name }}</td>
<td>
{{ interface_facts.get('ipv4', {}).get('address', 'N/A') }}
</td>
<td>
{{ interface_facts.get('ipv6', [{}])[0].get('address', 'N/A') if
interface_facts.get('ipv6') else 'N/A' }}
</td>
<td>{{ interface_facts.get('macaddress', 'N/A') }}</td>
<td>
{{ interface_facts.get('active', false) | ternary('Active',
'Inactive') }}
</td>
</tr>
{% endif %} {% endfor %}
</table>
</div>
<div class="section">
<h2>Default Gateway</h2>
<table>
<tr>
<th>Property</th>
<th>Value</th>
</tr>
<tr>
<td>Default IPv4 Address</td>
<td>
{{ ansible_facts['default_ipv4']['address'] | default('N/A') }}
</td>
</tr>
<tr>
<td>Default Interface</td>
<td>
{{ ansible_facts['default_ipv4']['interface'] | default('N/A')
}}
</td>
</tr>
<tr>
<td>Default Gateway</td>
<td>
{{ ansible_facts['default_ipv4']['gateway'] | default('N/A') }}
</td>
</tr>
</table>
</div>
<div class="section">
<h2>DNS Configuration</h2>
<table>
<tr>
<th>DNS Servers</th>
</tr>
{% for dns in ansible_facts['dns']['nameservers'] %}
<tr>
<td>{{ dns }}</td>
</tr>
{% endfor %}
</table>
</div>
</body>
</html>
-
创建一个网络接口配置 playbook。
nano configure_network.yml
添加以下内容:
---
- name: Configure network settings
hosts: webservers
become: true
tasks:
- name: Install NetworkManager if not present
ansible.builtin.dnf:
name: NetworkManager
state: present
- name: Ensure NetworkManager is running
ansible.builtin.service:
name: NetworkManager
state: started
enabled: yes
- name: Configure hosts file with system information
ansible.builtin.lineinfile:
path: /etc/hosts
line: "{{ ansible_facts['default_ipv4']['address'] }} {{ ansible_facts['hostname'] }}.lab.example.com {{ ansible_facts['hostname'] }}"
regexp: ".*{{ ansible_facts['hostname'] }}.*"
backup: yes
- name: Create network monitoring script
ansible.builtin.copy:
content: |
#!/bin/bash
## Network monitoring script generated by Ansible
echo "=== Network Status Report ==="
echo "Generated at: $(date)"
echo
echo "=== Interface Status ==="
ip addr show
echo
echo "=== Routing Table ==="
ip route show
echo
echo "=== DNS Configuration ==="
cat /etc/resolv.conf
echo
echo "=== Network Connectivity Test ==="
ping -c 3 8.8.8.8
dest: /usr/local/bin/network-status.sh
mode: "0755"
- name: Create network information gathering cron job
ansible.builtin.cron:
name: Network status monitoring
job: "/usr/local/bin/network-status.sh >> /var/log/network-status.log 2>&1"
minute: "*/15"
user: root
cron_file: network-monitoring
state: present
-
执行网络信息收集 playbook。
ansible-playbook -i inventory.ini network_info.yml
这将生成全面的系统和网络报告。
-
执行网络配置 playbook。
ansible-playbook -i inventory.ini configure_network.yml
这将配置网络设置和监控。
-
查看生成的报告。
## 列出生成的报告
ls -la /tmp/system_reports/
## 查看系统报告(你也可以在浏览器中打开)
cat /tmp/system_reports/system_info_*.html
## 检查网络监控脚本
cat /usr/local/bin/network-status.sh
## 测试网络监控脚本
sudo /usr/local/bin/network-status.sh
## 检查网络监控 cron 作业
sudo cat /etc/cron.d/network-monitoring
-
创建一个最终的综合 playbook,将所有学到的概念结合起来。
nano complete_system_setup.yml
添加以下内容:
---
- name: Complete system setup and configuration
hosts: webservers
become: true
vars:
admin_users:
- webuser1
- webuser2
tasks:
- name: Ensure all required packages are installed
ansible.builtin.dnf:
name:
- httpd
- lvm2
- NetworkManager
- cronie
state: present
- name: Ensure all services are running
ansible.builtin.service:
name: "{{ item }}"
state: started
enabled: yes
loop:
- httpd
- NetworkManager
- crond
- name: Generate final system status report
ansible.builtin.template:
src: system_report.j2
dest: /tmp/final_system_report.html
mode: "0644"
- name: Display completion message
ansible.builtin.debug:
msg: |
============================================
RHEL System Administration Automation Complete!
============================================
Summary of configured components:
- Software: EPEL repository and packages installed
- Users: {{ admin_users | length }} administrative users created
- Services: httpd, NetworkManager, and crond configured
- Storage: LVM volumes and filesystems configured
- Network: Interface configuration and monitoring set up
- Scheduling: Cron jobs and at tasks configured
Reports available at:
- /tmp/system_reports/
- /tmp/final_system_report.html
Your RHEL system is now fully automated with Ansible!
-
执行最终的综合设置。
ansible-playbook -i inventory.ini complete_system_setup.yml