创建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接続
您可以通过在ssh的配置文件中进行相应配置来解决这个问题。请注意,如果忘记了no-more命令,会导致连接超时。发现了无效的连接,期望的连接是本地连接。如果在ssh连接中遇到SHA1错误,请参考此链接。
广告
将在 10 秒后关闭
bannerAds