创建Ansible + Juniper + Cisco的共存环境
这里是NTT通信 Advent Calendar 2017的第13篇文章。
初次见面,我是d.hayasaka。
日常工作中,我在公司的各个地方使用Selenium和Appium进行测试自动化,有时还担任Jenkins先生的超级定时任务,并从事自动化工作。
首先
在创建验证环境时,由于不同供应商的服务器和网络设备混合在一起,配置变得非常繁琐!这是一个经常发生的情况。
我想为那些希望在本次环境中使用Ansible + Juniper + Cisco来在服务器上进行部署,并希望能够使用同一工具自由地操作网络设备的读者撰写一篇文章。
为什么用Ansible?难道不能用Rancid或其他工具吗?
算了,我就想用Ansible来自动化!
假设条件
-
- Ansibleサーバ
Ubuntu 16.04.3
Juniper
Junos 17.3R1
Junos 13.3R1
Cisco
IOS XR Version 6.0.0.02I
その他
上記ネットワーク機器へのSSH接続
特にCisco機器は事前にSSH接続を済ませる必要あり
Ansible 是什么?
在座的觀眾可能不需要對Ansible進行解釋,但如果有興趣的話,請務必閱讀以下內容。
閱讀後請教我!
-
- Ansible 公式サイト
- Ansible Advent Calendar2015より
建構環境
准备安装Ansible。
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get install sshpass
为Juniper构建环境和安装Ansible。
因为ansible-galaxy上有可用于Junos的角色,所以我想感谢地借用一下。
$ sudo ansible-galaxy install Juniper.junos
$ sudo apt-get install python-dev libxslt1-dev libssl-dev libffi-dev
$ wget https://bootstrap.pypa.io/get-pip.py -O - | sudo python
$ sudo pip install junos-eznc
$ sudo pip install junos-netconify
$ sudo pip install ansible
确认ansible版本
$ ansible --version
ansible 2.0.0.2
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
在中国,版本低于2.0的人需要额外进行以下步骤。
这是为了在Cisco上使用2.1的核心ios模块。
# version2.0以下の人だけやってください
$ sudo pip install ansible==2.4.0
如果按照目前的设置进行下去,在连接到网络设备时会出现错误,所以需要进行以下设置更改。这是因为ansible默认进行主机密钥检查。
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no
在以下设定中,如果只使用Juniper设备,则可以正常运作,但在使用Cisco设备时可能会遇到问题,因此最好不要进行此设置。
-o UserKnownHostsFile=/dev/null
确认Juniper是否正常运行
我会随便创建一个主机文件。
[junos]
192.168.1.11
[junos:vars]
ansible_ssh_user=admin
ansible_ssh_pass=nttcom
接下来,我们将编写一个用于操作的yaml文件。
在这里,我们将执行”show version”命令,并将结果输出到标准输出。
- name: juniper show version
hosts: junos
gather_facts: no
sudo: false
tasks:
- name: show version
raw: show version | no-more
register: result
- debug: var=result.stdout_lines
由于文件已经准备好了,我会立即尝试运行它。
$ ansible-playbook -i hosts junos.yml
~~略~~
TASK [debug] ********************************************************************************************************
ok: [192.168.1.10] => {
"result.stdout_lines": [
"Hostname: hoge.hage",
"Model: mx80",
"Junos: 17.3R1-S1.6",
~~略~~
顺利运转起来。
只需要一个选项,用中文将以下内容进行改写:
剩下的是 yaml 文件。
raw: show version | no-more
请在该行中写下您喜欢的命令并使用。2
为思科提供环境建设
Cisco的IOS模块,如ios_command等,在Ansible2.1及以上版本中默认已包含,无需额外配置。
思科验证行动
我会按照Juniper的格式创建一个hosts文件。
[junos]
192.168.1.11
[junos:vars]
ansible_ssh_user=admin
ansible_ssh_pass=nttcom
[ios]
192.168.1.101
[ios:vars]
ansible_ssh_user=admin
ansible_ssh_pass=nttcom
ansible_ssh_common_arg="-o diffie-hellman-group1-sha1"
我們使用的IOS需要求取SHA1,但是因為openssh被標記為legacy選項,預設情況下無法通過,所以只能加入一個設定以便通過。
我們同樣創建一個YAML文件。在這裡,我們決定像Juniper一樣執行show version。
- hosts: ios show version
gather_facts: no
connection: local
tasks:
- name: include ios configuration
set_fact:
provider:
host: "{{ inventory_hostname }}"
username: "{{ ansible_ssh_user }}"
password: "{{ ansible_ssh_pass }}"
- name: show version
ios_command:
provider: "{{ provider }}"
commands:
- show version
register: result
- debug: var=result.stdout_lines
查看公式文件的示例后,我发现与Juniper类似,认证信息应该可以写在hosts中,但是被拒绝了。所以我暂时通过连接到Ansible服务器并使用provider传递认证信息的方式来处理。此外,由于经由自己,ansible.cfg中的HostKeyChecking=no将不再起作用。
因此,在使用Cisco设备之前需要预先通过ssh进行连接。(当前的问题)4
由于一切准备就绪,我将试着进行操作。
$ ansible-playbook -i hosts ios.yml
~~略~~
TASK [debug] ********************************************************************************************************
ok: [192.168.1.101] => {
"result.stdout_lines": [
[
"Tue Dec 12 10:59:54.630 UTC",
"",
"Cisco IOS XR Software, Version 6.0.0.02I",
~~略~~
如果上述的操作能执行,那就可以了。
commands:
- show version
请在这行上写下您喜欢的命令并使用它。
总结
-
- Ansible2.1以上を入れる
-
- ansible-galaxyでJuniper.junosを入れる
- IOSのバージョン次第で、SHA1を通すようにする
最终 / 参考
非常感谢您一直以来的陪伴。
为了简化起见,本次直接将用户名和密码写入hosts文件中,并且在yaml中使用了sudo(从Ansible2.0开始不推荐使用),敬请谅解。
在此撰写本文章时,我参考了以下页面。谢谢。
-
- Ansibleをはじめる人に。
-
- Creating and Executing Ansible Playbooks to Manage Devices Running Junos OS
-
- 【Ansible】AnsibleでCisco機器を制御してみる(サンプルコード1 config収集編)
- backlogで古い鍵交換を使ったssh接続