てくなべ

インフラ、ネットワーク、自動化などの技術的なことを書いていきます。

仮想Junos4台とAnsibleホストをVagrantで構築するVagrantfile

■ 1. はじめに

Ansibleのネットワークモジュールを使いたいとき、試す環境がなくて困るケースはないでしょうか。 https://labs.networktocode.com/ といった有料のラボサービスもありますが、手元に無料で構築したいこともあるかと思います。 この記事では、仮想Junos4台とAnsibleホストをVagrantで気軽に構築する方法をご紹介します。

以前書いた以下の記事の応用編です。 tekunabe.hatenablog.jp

なお、私が試した環境は以下の通りです。

(大変参考にさせていただいた海外のエントリがあったのですが失念してしまいました・・)

■ 2. 構成図

以下の構成の環境を構築します。 f:id:akira6592:20170826213828p:plain

■ 3. Vagrantfile の用意

以下の内容のVagrantfileを用意します。

Vagrant.configure(2) do |config|
  config.vm.box = "juniper/ffp-12.1X47-D15.4-packetmode"

  config.vm.provider "virtualbox" do |vb|
    vb.memory = 512
    vb.cpus = 2
    vb.gui = false
  end

  # vsrx1
  config.vm.define "vsrx1" do |vsrx|
    vsrx.vm.host_name = "vsrx1"
    vsrx.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2201
    # ge-0/0/1
    vsrx.vm.network "private_network",
                     ip: "172.16.0.1",
                     virtualbox__intnet: "management"
    # ge-0/0/2
    vsrx.vm.network "private_network",
                     ip: "10.0.12.1",
                     virtualbox__intnet: "1-2"
    # ge-0/0/3
    vsrx.vm.network "private_network",
                     ip: "10.0.13.1",
                     virtualbox__intnet: "1-3"
  end
  
  # vsrx2
  config.vm.define "vsrx2" do |vsrx|
    vsrx.vm.host_name = "vsrx2"
    vsrx.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2202
    # ge-0/0/1
    vsrx.vm.network "private_network",
                     ip: "172.16.0.2",
                     virtualbox__intnet: "management"
    # ge-0/0/2
    vsrx.vm.network "private_network",
                     ip: "10.0.12.2",
                     virtualbox__intnet: "1-2"
    # ge-0/0/3
    vsrx.vm.network "private_network",
                     ip: "10.0.24.2",
                     virtualbox__intnet: "2-4"
  end
  
  # vsrx3
  config.vm.define "vsrx3" do |vsrx|
    vsrx.vm.host_name = "vsrx3"
    vsrx.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2203
    # ge-0/0/1
    vsrx.vm.network "private_network",
                     ip: "172.16.0.3",
                     virtualbox__intnet: "management"
    # ge-0/0/2
    vsrx.vm.network "private_network",
                     ip: "10.0.13.3",
                     virtualbox__intnet: "1-3"
    # ge-0/0/3
    vsrx.vm.network "private_network",
                     ip: "10.0.34.3",
                     virtualbox__intnet: "3-4"
  end
  
  # vsrx4
  config.vm.define "vsrx4" do |vsrx|
    vsrx.vm.host_name = "vsrx4"
    vsrx.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2204
    # ge-0/0/1
    vsrx.vm.network "private_network",
                     ip: "172.16.0.4",
                     virtualbox__intnet: "management"
    # ge-0/0/2
    vsrx.vm.network "private_network",
                     ip: "10.0.24.4",
                     virtualbox__intnet: "2-4"
    # ge-0/0/3
    vsrx.vm.network "private_network",
                     ip: "10.0.34.4",
                     virtualbox__intnet: "3-4"
  end

  # ansible
  config.vm.define "centos7" do |node|
    node.vm.box = "centos/7"
    node.vm.hostname = "centos7"
    node.vm.network "private_network",
                     ip: "172.16.0.9",
                     virtualbox__intnet: "management"
    node.vm.network :forwarded_port, id: "ssh", host_ip:"127.0.0.1", guest: 22, host: 2209
    node.vm.synced_folder ".", "/vagrant", disabled: true
    
    # provision
    node.vm.provision "shell", inline: "yum -y groupinstall 'Development Tools'"
    node.vm.provision "shell", inline: "yum -y install python-devel"
    node.vm.provision "shell", inline: "curl -kL https://bootstrap.pypa.io/get-pip.py | python"
    node.vm.provision "shell", inline: "pip install ansible"
    node.vm.provision "shell", inline: "pip install ncclient"  # junosモジュールで利用
  end

end

お好みに応じて書き換えてください。

■ 4. Vagrantプラグインのインストール

今回利用する仮想JUONSのBoxでは vagrant-junosvagrant-host-shell というVagrantプラグインが必要のためあらかじめインストールしておきます。

vagrant plugin install vagrant-junos
vagrant plugin install vagrant-host-shell

■ 5. vagrant up

用意したVagrantfileのあるディレクトリで、vagrant up してしばらく待ちます。

■ 6. 確認

6.1. Ansibleホスト

ホストOSから localhost:2209SSHにアクセスできます。 vagrantユーザと対応する秘密鍵でログインできます。 ログイン後、以下のようにansbleがインストールされたことが確認できます。

[vagrant@centos7 ~]$ ansible --version
ansible 2.3.2.0
  config file =
  configured module search path = Default w/o overrides
  python version = 2.7.5 (default, Nov  6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]

※2017/08/26現在の pipでインストールされるバージョンは2.3.2

6.2. vsrx1

ホストOSから localhost:2201SSHにアクセスできます。 vagrantユーザと対応する秘密鍵か、rootユーザーとパスワードJuniperでログインできます。 ここでは show version コマンドを実行して確認します。

root@vsrx1> show version
Hostname: vsrx1
Model: firefly-perimeter
JUNOS Software Release [12.1X47-D15.4]

同じように

  • localhost:2202vsrx2
  • localhost:2203vsrx3
  • localhost:2204vsrx4

にアクセスできます。

これで、仮想Junos4台とAnsibleホストをVagrantを構築できました。

■ その他

172.16.0.0/24 のネットワークですが、VirtualBoxのネットワーク設定に起因するのか、以下のようにpingの応答がduplicateしたりします。

[vagrant@centos7 ~]$ ping 172.16.0.2
PING 172.16.0.2 (172.16.0.2) 56(84) bytes of data.
64 bytes from 172.16.0.2: icmp_seq=1 ttl=64 time=31.5 ms
64 bytes from 172.16.0.2: icmp_seq=1 ttl=64 time=75.5 ms (DUP!)
64 bytes from 172.16.0.2: icmp_seq=1 ttl=63 time=75.6 ms (DUP!)
64 bytes from 172.16.0.2: icmp_seq=1 ttl=63 time=75.6 ms (DUP!)
64 bytes from 172.16.0.2: icmp_seq=1 ttl=62 time=76.5 ms (DUP!)
64 bytes from 172.16.0.2: icmp_seq=1 ttl=62 time=76.5 ms (DUP!)
64 bytes from 172.16.0.2: icmp_seq=1 ttl=61 time=77.5 ms (DUP!)

色々試したのですが、VirtualBoxの設定で該当する仮想NICのプロミスキャスモードを 許可されたVMに変更したりすると直ることがありました。 f:id:akira6592:20170826215345p:plain

以上です。