Ansible网络自动化:从模块发现到条件语句应用
1. 网络自动化基础与模块查找
在网络自动化领域,Ansible是一个强大的工具,它支持多种网络设备,包括使用Cumulus Linux操作系统的白盒交换机。使用Cumulus Linux的白盒交换机,可通过标准SSH协议连接,还能使用内置的setup模块收集设备信息。例如,成功执行操作后,能获取关于Cumulus VX虚拟交换机端口接口的详细信息,部分输出如下:
vx01.example.com | SUCCESS => {
"ansible_facts": {
"ansible_swp1": {
"active": false,
"device": "swp1",
"features": {
"esp_hw_offload": "off [fixed]",
"esp_tx_csum_hw_offload": "off [fixed]",
"fcoe_mtu": "off [fixed]",
"generic_receive_offload": "on",
"generic_segmentation_offload": "on",
"highdma": "off [fixed]",
...
要发现适合自动化任务的Ansible网络模块,可按以下步骤操作:
1. 确定设备类型 :访问 Ansible设备类型页面 ,查找Ansible支持的不同设备类型及其指定名称。以Cisco IOS为例。
2. 查找模块 :在 Ansible网络模块列表页面 ,搜索所需交换机系列的类别,查看可用模块。
目前,Ansible在20多个不同的网络平台上有数千个模块,且每个版本都会新增大量模块。以下是一些Cisco IOS模块示例:
| 模块名称 | 功能描述 |
| ---- | ---- |
| ios_banner | 用于调整和修改登录横幅(即很多系统中的motd) |
| ios_bgp | 配置BGP路由 |
| ios_command | 类似于Ansible的command模块,可执行多种命令,但建议优先使用特定模块 |
| ios_config | 可对设备配置文件进行几乎任何更改,使用时建议优先使用特定模块,且不使用缩写命令时才能保证幂等性 |
| ios_vlan | 配置VLAN |
如果使用Cumulus Linux交换机,只有一个模块nclu,因为Cumulus Linux的所有配置工作都由该命令处理。若需自定义Linux操作系统的其他方面,可使用常规方法,如template或copy模块。
2. 连接到网络设备
Ansible网络连接有一些特殊要求,需要进行特定配置。假设我们有一个Cisco IOS系统,可按以下步骤配置Ansible以管理IOS设备:
1. 创建库存文件 :创建包含设备信息的库存文件,例如:
[routers]
n1.example.com
n2.example.com
[cumulusvx]
vx01.example.com
- 设置连接变量 :在playbook的group_vars子目录中创建group_vars/routers.yml文件,内容如下:
---
ansible_connection: network_cli
ansible_network_os: ios
ansible_become: True
ansible_become_method: enable
这些特殊的Ansible变量作用如下:
- ansible_connection :决定Ansible连接设备的方式,选择network_cli表示通过SSH模式连接到CLI。
- ansible_network_os :让Ansible了解要使用的设备家族,选择ios表示期望是Cisco IOS设备。
- ansible_become :决定是否在设备上执行权限提升,设置为True表示执行权限提升。
- ansible_become_method :指定权限提升的方式,对于Cisco IOS,需设置为enable。
为验证连接是否正常,可运行以下简单的playbook(ios_facts.yaml):
---
- name: Play to return facts from a Cisco IOS device
hosts: routers
gather_facts: False
tasks:
- name: Gather IOS facts
ios_facts:
gather_subset: all
使用以下命令运行:
$ ansible-playbook -i hosts ios_facts.yml --ask-pass
若成功返回结果,说明配置正确,Ansible已获得管理IOS设备的必要授权。
若要连接Cumulus VX设备,可创建group_vars/cumulusvx.yml文件,内容如下:
---
ansible_user: cumulus
become: false
对应的playbook(cumulusvx_facts.yml)如下:
---
- name: Simply play to gather Cumulus VX switch facts
hosts: cumulusvx
gather_facts: no
tasks:
- name: Gather facts
setup:
gather_subset: all
使用以下命令运行:
$ ansible-playbook -i hosts cumulusvx_facts.yml --ask-pass
若成功,将看到类似以下的输出:
SSH password:
PLAY [Simply play to gather Cumulus VX switch facts]
***************************************************************************
*********************
TASK [Gather facts]
***************************************************************************
*********************
ok: [vx01.example.com]
PLAY RECAP
***************************************************************************
*********************
vx01.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0
rescued=0 ignored=0
3. 设置网络设备的环境变量
网络系统通常复杂多样,Ansible有大量变量可帮助调整以适应不同环境。假设存在两个不同的网络(计算网络和网络设备网络),它们无法直接通信,需通过堡垒主机连接,且目标交换机需要代理才能访问互联网。
为连接数据库网络中的IOS路由器,需创建新的设备组,并设置相应的环境变量。具体步骤如下:
1. 更新库存文件 :
[bastion_routers]
n1.example.com
n2.example.com
[bastion_cumulusvx]
vx01.example.com
- 创建组变量文件 :
- 对于Cisco IOS设备,创建group_vars/bastion_routers.yaml文件,内容如下:
---
ansible_connection: network_cli
ansible_network_os: ios
ansible_become: True
ansible_become_method: enable
ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q bastion.example.com"'
proxy_env:
http_proxy: http://proxy.example.com:8080
- 对于Cumulus VX设备,创建group_vars/bastion_cumulusvx.yml文件,内容如下:
---
ansible_user: cumulus
ansible_become: false
ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q bastion.example.com"'
proxy_env:
http_proxy: http://proxy.example.com:8080
新增的两个选项作用如下:
- ansible_ssh_common_args :可向SSH连接添加额外选项,如设置ProxyCommand以通过堡垒主机安全连接目标主机。
- http_proxy :在网络隔离较强的环境中,设备需通过代理才能访问互联网时使用。
假设已设置无密码(如基于SSH密钥)访问堡垒主机,可运行以下命令对Cumulus VX主机执行Ansible ping测试:
$ ansible -i hosts -m ping -u cumulus --ask-pass bastion_cumulusvx
若成功,将看到类似以下输出:
SSH password:
vx01.example.com | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
4. 网络设备的条件语句应用
虽然Ansible没有特定的网络条件语句,但在网络相关的Ansible使用中,条件语句很常见。在网络中,启用和禁用端口是常见操作,为使数据通过电缆传输,电缆两端的端口都应启用并处于“连接”状态。
以下是两个不同设备的条件语句应用示例:
- Arista Networks EOS设备 :假设我们对两个Arista Networks EOS设备的端口设置了ON状态,需要等待连接建立后再继续操作。可在playbook中添加以下任务:
- name: Wait for interface to be enabled
eos_command:
commands:
- show interface Ethernet4 | json
wait_for:
- "result[0].interfaces.Ethernet4.interfaceStatus eq connected"
eos_command 模块可向Arista Networks EOS设备发出自由格式的命令, wait_for 选项可指定条件,Ansible会重复执行任务直到条件满足。由于命令输出被重定向到json工具,输出为JSON格式,可使用Ansible处理JSON数据的能力遍历其结构。
- Cumulus VX设备 :可查询交换机收集的事实,判断端口swp2是否启用。若未启用,则启用它;若已启用,则跳过该命令。以下是一个简单的playbook示例:
---
- name: Simple play to demonstrate conditional on Cumulus Linux
hosts: cumulusvx
tasks:
- name: Enable swp2 if it is disabled
nclu:
commands:
- add int swp2
commit: yes
when: ansible_swp2.active == false
注意任务中 when 子句的使用,只有当swp2未激活时才会执行配置指令。首次在未配置的Cumulus Linux交换机上运行此playbook时,输出可能如下:
PLAY [Simple play to demonstrate conditional on Cumulus Linux]
***************************************************************
TASK [Gathering Facts]
***************************************************************
ok: [vx01.example.com]
TASK [Enable swp2 if it is disabled]
***************************************************************
changed: [vx01.example.com]
PLAY RECAP
***************************************************************
vx01.example.com : ok=2 changed=1 unreachable=0 failed=0 skipped=0
rescued=0 ignored=0
再次运行时,由于Ansible事实显示端口swp2已启用,任务将被跳过,输出如下:
PLAY [Simple play to demonstrate conditional on Cumulus Linux]
***************************************************************
TASK [Gathering Facts]
***************************************************************
ok: [vx01.example.com]
TASK [Enable swp2 if it is disabled]
***************************************************************
skipping: [vx01.example.com]
PLAY RECAP
***************************************************************
vx01.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=1
rescued=0 ignored=0
综上所述,Ansible可有效自动化和配置各种网络设备,通过掌握模块查找、设备连接、环境变量设置和条件语句应用等技能,能更高效地管理网络配置。
5. 总结与展望
Ansible在网络自动化领域展现出了强大的功能和广泛的适用性。它支持多种网络设备,无论是像基于Cisco IOS的专有硬件,还是运行Cumulus Linux等操作系统的白盒交换机,都能通过Ansible实现快速、安全的配置更改。借助Ansible的playbooks,我们甚至可以在替换网络中的整个设备时,确保新设备能正确配置。
在本章中,我们深入探讨了网络自动化管理的多个方面:
- 模块查找 :通过Ansible官方文档,我们可以轻松找到适用于不同网络设备的模块,为自动化任务提供了丰富的工具。
- 设备连接 :通过设置特殊的Ansible变量,我们能够顺利连接到各种网络设备,并验证连接的正确性。
- 环境变量设置 :针对复杂的网络环境,我们可以通过设置环境变量,实现跨网络的设备管理,如通过堡垒主机连接隔离网络中的设备。
- 条件语句应用 :在网络操作中,条件语句的使用可以确保任务在满足特定条件时执行,提高了自动化的灵活性和可靠性。
6. 常见问题解答
为了帮助大家更好地理解和应用Ansible进行网络自动化,以下是一些常见问题的解答:
| 问题 | 答案 |
| ---- | ---- |
| Ansible连接网络设备的主要连接类型有哪些? | Ansible主要使用netconf、network_cli、local、httpapi等连接类型,其中local已被弃用。 |
| ansible_network_os 变量的作用是什么? | 该变量用于让Ansible了解要使用的设备家族,例如选择ios表示期望是Cisco IOS设备。 |
| 连接到单独网络中的IOS路由器需要做什么? | 需要为该主机指定特殊的连接变量,通常作为库存组变量进行设置。 |
7. 未来发展趋势
随着网络技术的不断发展,网络自动化的需求也在不断增加。Ansible作为一款强大的自动化工具,未来可能会在以下几个方面得到进一步发展:
- 更多设备支持 :随着新的网络设备和技术的出现,Ansible可能会支持更多类型的网络设备,为用户提供更广泛的选择。
- 集成更多功能 :Ansible可能会与其他网络管理工具和平台进行更深入的集成,实现更全面的网络自动化管理。
- 智能化自动化 :借助人工智能和机器学习技术,Ansible可能会实现更智能化的自动化任务,例如自动识别网络故障并进行修复。
8. 流程图总结
以下是一个mermaid格式的流程图,总结了使用Ansible进行网络自动化的主要步骤:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B(确定网络设备类型):::process
B --> C(查找适用的Ansible模块):::process
C --> D(配置设备连接信息):::process
D --> E{是否需要设置环境变量?}:::decision
E -->|是| F(设置环境变量):::process
E -->|否| G(编写Ansible playbook):::process
F --> G
G --> H{是否需要使用条件语句?}:::decision
H -->|是| I(应用条件语句):::process
H -->|否| J(运行Ansible playbook):::process
I --> J
J --> K([结束]):::startend
通过这个流程图,我们可以清晰地看到使用Ansible进行网络自动化的主要步骤,从确定设备类型到最终运行playbook,每个步骤都紧密相连,为网络自动化提供了一个清晰的操作指南。
总之,Ansible为网络自动化提供了一个强大而灵活的解决方案。通过不断学习和实践,我们可以充分发挥Ansible的优势,实现更高效、更智能的网络管理。希望本文能对大家有所帮助,让我们一起迎接网络自动化的未来!
超级会员免费看
1936

被折叠的 条评论
为什么被折叠?



