【Ansible】尝试使用Ansible控制Cisco设备(样本代码1-配置收集篇)
首先
这次和上次一样。
像这样的事情和那样的事情。
所以,Ansible的核心网络模块好像得到了充实。
#拿这个提起来太晚了吧…
以下是ansible官方文档中关于网络模块的列表,其中包括Ios(Cisco)、Eos(Arista)、Junos(Juniper)和open switch等。
在数千台Switch面前,我们使用expect或者teraterm宏进行了不停的测试。
对我们来说,这是个好消息,我们决定试试看,因为它看起来非常有潜力。
我们采用了这个选项。
-
- ios_command.py
- ios_config.py
这些是模块的每个部分。
这些是截至2016年3月的动作环境等情况。
2. 执行环境
构成
为了注意以下事项,我在CentOS7上运行了Ansible。
3. 注意事项
-
- RedHat印のAnsibleでのみ動作可
mac OSXのbrew installで入るversionにはNW関連のupdateが含まれない(version 1.9.4)
yum installで入れるAnsibleにも同じくupdateが含まれない
※2016年6月現在は含まれる
githubにはあるのでcloneしても可
4. 配置收集示例代码
[cisco]
192.168.199.2
192.168.199.3
[cisco:vars]
ansible_ssh_user=operator
ansible_ssh_pass=operators_password
enable_pass=enable
---
- hosts: all
gather_facts: no
tasks:
- name: crawl config file
local_action:
module: ios_command
authorize: yes
auth_pass: "{{ enable_pass }}"
username: "{{ ansible_ssh_user }}"
password: "{{ ansible_ssh_pass }}"
host: "{{ inventory_hostname }}"
commands:
- show run
register: result
- name: log write out
local_action: template src=/myfolder/conf.j2 dest=/myfolder/{{ inventory_hostname }}.log
- name: parse config
local_action: shell cat {{ inventory_hostname }}.log | sed -e 's/ \"//g' | sed -e 's/",//g' | sed -e "1,2d" | sed -e '$d' | sed -e '$d' > {{ inventory_hostname }}.conf
- name: remove logfile
local_action: file path=./{{ inventory_hostname }}.log state=absent
5. 戰術指南解說
-
- 基本的的组装
-
- 如果手动进行,以下是步骤:
$ enable
密码:
# show run
通过设置终端的日志记录功能,
切换到特权模式并执行(可能需要term len 0之类的命令)sh run,
将配置写入到文件中。
抓取配置文件任务
在local_action模块中调用cisco模块。
具体内容如下:
playbook_detail
local_action:
module: ios_command //声明要使用的模块
authorize: yes //切换到特权模式
auth_pass: “{{ enable_pass }}” //特权模式的密码
username: “{{ ansible_ssh_user }}” //首次登录时的用户名
password: “{{ ansible_ssh_pass }}” //首次登录时的用户密码
host: “{{ inventory_hostname }}” //用于循环(可以处理多台设备)
commands: //下面是实际要执行的命令
– show run //显示配置
register: result //将显示结果存储到result中
顺便说一句,“我想获取的不是config,而是sh int和sh ip route!”
这样有两个任务的贪心用户,推荐查看同事编写的这篇文章。
写入日志任务
在ansible执行机器上写入中间文件。
conf.j2的内容如下:
conf.j2
{{ result.stdout_lines | to_nice_json }}
在前一个任务中,以json格式显示存储在result中的内容,
并将其写入名为主机IP地址.log的文件中。
解析配置任务
由于生成了json格式的文件,所以使用sed进行强制格式化和重定向。
一点也不优雅。
删除JSON中的多余空格
删除JSON中的“,”字符串
删除第一行和第二行
删除最后一行的括号两次
移除日志文件任务
删除中间文件的~.log。
6. 诀窍
我认为在”local_action”模块中使用”network”模块是关键。
Ansible是一个非常简单的工具,可以通过SSH连接到被管理主机(也可以称为操作主机),并通过操作其内部的Python来完成工作。
因为大部分网络设备中没有安装Python,所以假设正常地编写Ansible的playbook将不适用于上述情况,我认为可以考虑使用local_action来发送适用于设备的命令。
7. 进一步继续
我忘记写出重要的执行方法,但以下是将样本代码一并放入同一个文件夹中的方法。
ansible-playbook -i inventory_file playbook_config_crawl.yml
如果正确运用这个示例代码,就可以通过一行命令从多台设备获取配置。
接下来,我想展示通过Ansible进行设备设置更改的示例,其中包括端口设置的更改。