前面介绍了一款运维神器,其中里面有一个强大的功能叫做playbook,我们可以通过写一些剧本来批量完成一些任务,这对运维人员带来了很大的帮助。比如我们需要在大量服务器上安装一项服务时,我们只需写个playbook一执行这些服务器就批量安装了,而不需要我们一台台登录上去安装。

那么对于我们网络工程师而言是不是也可以利用ansible来管理众多网络设备呢?答案是肯定的。比如有这样一个需求,网络工程师需要定期备份所有网络设备的配置,你们会怎么做的,利用远程工具比如SecureCRT一台一台登录到设备,比如思科设备输入“show run”命令导出配置。如果数量少一些还好,如果数量多几十台上百台的设备,我想也会是挺费时间的一件事吧。可能你会想到肯定可以用程序解决,比如用python写个程序脚本,但是我想大多数网工毕竟不是专业的程序员出生,编程能力往往还是有限的,而且编写程序可以说还是相对复杂的。但是我想说的网络工程师如果掌握一下ansible,就可以达到事半功倍的效果,而且ansible playbook的写法按格式套路是很容易上手的,比编程而言实在是太简单了。因为ansible本身底层就是用python编写的工具,集成了的大量的模块,你只要学会使用这些模块就行了,而不需要自己去编写,这可以说给网工们带来了巨大的方便。下面我就简单介绍一下如何利用ansible实现网络设备的备份。

1.Ansible是用ssh服务去管理设备的,所以网络设备上需要开启SSH服务,以思科路由器为例:
crypto key generate rsa general-keys modulus 1024 #生成秘钥
aaa new-model #启用3a认证
username cisco password cisco #创建用户名和密码
ip domain name cisco #定义域名
line vty 0 4 #在vty线路下开启ssh
transport input ssh
2.Ansible服务器上配置hosts添加网络设备信息,可以进行相应分组和命名。
# vi /etc/ansible/hosts
[Cisco]
Cisco2911 ansible_host=192.168.18.100
Cisco2921ansible_host=192.168.18.108
3.编辑一个playbook,通过之前的介绍,我们知道playbook是通过task任务来执行的,这里使用两个模块ios_command和copy模块来执行。模块ios_command使用命令“show run”输出配置,copy模块讲输出的配置保存到本地文件。
# vi /etc/ansible/playbooks/bk.yaml
---
- hosts: Cisco2911
connection: local
tasks:
- name: Show Run
ios_command:
commands: show run
provider:
username: cisco
password: cisco
authorize: yes
auth_pass: cisco
register: config
- name: Save Output
copy:
content: "{{config.stdout[0]}}"
dest: "/etc/ansible/cisco.txt"
4.执行结果。

可以看到playbook的编写是相当简洁明了,都不用太多解释,首先使用ios_command模块,使用命令"show run"输出配置,需要传入一些参数,用户名和密码,还有登录后的特权密码。然后将输出的内容定义到register变量中,最后通过copy模块保存到本地就行了。