AnsibleでEVE-NG仮想ネットワークラボをインストールして使用します。 初めての体験

画像







この記事では、自宅でEVE-NGバーチャルラボを展開して、シスコの専門家試験に備えるネットワークエンジニアの経験について説明します。







私は、インターネット上の記事に散らばっている設定のすべての主要なマイルストーンを収集しようとし、勉強しながら、ansible-構成管理システムにトポロジーを追加しようとしました。 経験を失ってすみませんでしたので、別のファイルに保存することにしました。 それであなたの裁判所に提出します。







この記事に記載されているすべてのソリューションが最適であると主張しているわけではありませんが、確実に機能します。







EVE-NGのインストール



ホストの準備



ホストとして、Intel Xeon X3240、Gentooを実行する32Gb RAMのシステムを使用します。 GentooでKVMをセットアップするのは非常に簡単で、実を言うと、展開時にどのような落とし穴に直面したか覚えていません。 ずいぶん前のことです。







EVE-NGラボベンチのパフォーマンスに壊滅的な影響を与える主なものは、 ネストされた仮想化 (ネストされた仮想化)を使用する機能を起動するカーネルパラメーターです。







Intelプロセッサーの場合:







kvm-intel.nested=1
      
      





詳細はリンクをご覧ください







ネットワークデバイスイメージのマウント



接続用のネットワークデバイスのイメージは、cisco.comから無料で入手できます。ダウンロードするには、エントリーレベルのアカウントがあれば十分です。 XRvCSRが必要になります。

指定されたリンクでダウンロードし、 how-toの推奨事項に従ってください







イメージを追加するときに遭遇した問題は、 hda.qcow2ファイルを追加するディレクトリの名前の付け方でした 。 解決策は、いつものように、リバースエンジニアリングです。 EVE-NGによって処理されるヘッダーのリストは、ファイルに保存されます。







 /opt/unetlab/html/includes/init.php
      
      





ここに持ってきます:







 $node_templates = Array( 'a10' => 'A10 vThunder', 'clearpass' => 'Aruba ClearPass', 'timos' => 'Alcatel 7750 SR', 'veos' => 'Arista vEOS', 'barracuda' => 'Barraccuda NGIPS', 'brocadevadx' => 'Brocade vADX', 'cpsg' => 'CheckPoint Security Gateway VE', 'docker' => 'Docker.io', 'acs' => 'Cisco ACS', 'asa' => 'Cisco ASA', 'asav' => 'Cisco ASAv', 'cda' => 'Cisco Context Directory Agent', 'csr1000v' => 'Cisco CSR 1000V', 'csr1000vng' => 'Cisco CSR 1000V (Denali and Everest)', 'cips' => 'Cisco IPS', 'cucm' => 'Cisco CUCM', 'ise' => 'Cisco ISE', 'c1710' => 'Cisco IOS 1710 (Dynamips)', 'c3725' => 'Cisco IOS 3725 (Dynamips)', 'c7200' => 'Cisco IOS 7206VXR (Dynamips)', 'iol' => 'Cisco IOL', 'titanium' => 'Cisco NX-OSv (Titanium)', 'nxosv9k' => 'Cisco NX-OSv 9K', 'firepower' => 'Cisco FirePower', 'firepower6' => 'Cisco FirePower 6', 'ucspe' => 'Cisco UCS-PE', 'vios' => 'Cisco vIOS', 'viosl2' => 'Cisco vIOS L2', 'vnam' => 'Cisco vNAM', 'vwlc' => 'Cisco vWLC', 'vwaas' => 'Cisco vWAAS', 'phoebe' => 'Cisco Email Security Appliance (ESA)', 'coeus' => 'Cisco Web Security Appliance (WSA)', 'xrv' => 'Cisco XRv', 'xrv9k' => 'Cisco XRv 9000', 'nsvpx' => 'Citrix Netscaler', 'sonicwall' => 'Dell SonicWall', 'cumulus' => 'Cumulus VX', 'extremexos' => 'ExtremeXOS', 'bigip' => 'F5 BIG-IP LTM VE', 'fortinet' => 'Fortinet FortiGate', //'radware' => 'Radware Alteon', 'hpvsr' => 'HP VSR1000', 'olive' => 'Juniper Olive', 'vmx' => 'Juniper vMX', 'vmxvcp' => 'Juniper vMX VCP', 'vmxvfp' => 'Juniper vMX VFP', 'vsrx' => 'Juniper vSRX', 'vsrxng' => 'Juniper vSRX NextGen', 'vqfxre' => 'Juniper vQFX RE', 'vqfxpfe' => 'Juniper vQFX PFE', 'linux' => 'Linux', 'mikrotik' => 'MikroTik RouterOS', 'ostinato' => 'Ostinato', 'paloalto' => 'Palo Alto VM-100 Firewall', 'pfsense' => 'pfSense Firewall', 'riverbed' => 'Riverbed', 'sterra' => 'S-Terra', 'vyos' => 'VyOS', 'win' => 'Windows (Legacy template)', 'winstation' => 'Windows Workstation', 'winserver' => 'Windows Server', 'vpcs' => 'Virtual PC (VPCS)' );
      
      





つまり、以下で行うように、Linuxでイメージを追加する必要がある場合は、 / opt / unetlab / addons / qemu / linux-something-there /ディレクトリを作成し、その中にhda.qcow2イメージファイルを配置します。







環境設定



環境とは、私たちの生活をより便利にするものすべてを意味します。







ルーターコンソールアクセス



EVE-NGでは、開発者がHTML5を使用してWeb経由でネットワークデバイスのコンソールにアクセスする機能を実装しているにもかかわらず、サードパーティクライアントからのアクセスはより便利で使い慣れています。 私の場合、パテが提供する主な利便性は、クリップボードを使用できることです。 コピー/貼り付けは、Webコンソールでは機能しません。







そのため、プロセスは次のとおりです。







アクセス元のマシンにパテをインストールします。 私はubuntuを使用してPCで作業しているため、







 sudo apt-get install putty
      
      





しかし、これでは十分ではありません。ブラウザに伝える必要があります。私の場合は、 telnet://のようなリンクへの応答方法はchromeです。 これを行うには、次の内容の〜/ .local / share / applications / telnet.desktopファイルを作成します







 [Desktop Entry] Version=1.0 Name=Telnet GenericName=Telnet Comment=Telnet Client Exec=/usr/bin/putty %U TryExec=/usr/bin/putty Terminal=false Type=Application Categories=TerminalEmulator;Network;Telnet;Internet;BBS; MimeType=x-scheme/telnet X-KDE-Protocols=telnet Keywords=Terminal;Emulator;Network;Internet;BBS;Telnet;Client;
      
      





ハンドラーを登録します。







 xdg-mime default telnet.desktop x-scheme-handler/telnet
      
      





その後、コンソールはパテで完全に開きます。 タブまたはそのアナログを使用してgnome-terminalに切り替えるタスクは、あとで残されます。







交通探知機



Wiresharkは、ネットワークテクノロジーを学習する際に不可欠です。 その使用について多くのことが書かれています。 繰り返しません。 設定のプロセスを説明します。







クライアントのインストール:







 sudo apt-get install wireshark
      
      





ただし、ブラウザはキャプチャの処理方法を理解していません://リンク







彼はこれを3段階で説明しなければなりません:







ステージ1:

コンソールと同様に、ファイル〜/ .local / share / applications / wireshark.desktopは次の形式です:







 [Desktop Entry] Name=Wireshark Exec=capture_chrom.sh %u MimeType=x-scheme-handler/capture; Type=Application
      
      





ハンドラー登録:







 xdg-mime default wireshark.desktop x-scheme-handler/capture
      
      





ステージ2:

PATHリストの任意のディレクトリにあるクライアントマシン上のbashスクリプト形式のハンドラー:







 #!/bin/bash ip=`echo $@ | sed 's/.*\/\/\(.*\)\/\(.*\)/\1/g'` interface=`echo $@ | sed 's/.*\/\/\(.*\)\/\(.*\)/\2/g'` ssh root@$ip tcpdump -i $interface -U -w - | wireshark -k -i -
      
      





ステージ3:

クライアントマシンとEVE-NG間の主要なsshアクセス。







クライアントマシンで(ip_eveの代わりに、アドレスEVE-NGを入力します):







 ssh-keygen -t rsa ssh root@_ip_eve_ mkdir -p .ssh cat ~/.ssh/id_eve_ng.pub | ssh root@ip_eve 'cat >> .ssh/authorized_keys2'
      
      





その後、クライアント側でWiresharkへのトラフィックをキャプチャします。 これが必要なものです。







気取らないユーザーはそこで停止できますが、完璧に制限はありません。







ansibleサーバーインスタンスのセットアップ



旅の始めに仮想ラボトポロジを実現する必要性は、私には明らかではありませんでした。 しかし、時間の経過とともに、実験室の2ダースの時間で、過負荷になることなく開始トポロジーのデバイスへのロードを自動化するのではなく、時間を節約するという考えが浮かび上がりますか?







それではどこから始めますか? 制限付きで! はい、彼らは本当にです。 プログラミングに関しては、フォーラムの1つでの提案はあまりにも残酷であることがわかりました。自分でtelnetハンドラーを追加することはできませんでした。 額のソリューションにはTelnetが必要でした-EVE-NG仮想マシンでansibleを設定し、仮想ルーターのコンソールポートにTelnetを設定します。 しかし、そこには-sshのみが機能します。







しかし、私たちは古いエンジニアであり、退却に慣れていません! 山がモハメッドに行かない場合は、山に移動します。これには機会があるため、トポロジ自体にububtuを使用して別のインスタンスを設定します。

ubuntu.comからダウンロードしたイメージをKVMに展開する方法は教えません。 これを別のマシンで行い、調整してEVE-NGにアップロードしました。 インストール後、telnetサーバーを含むパッケージが必要になり、静的IPアドレスを構成します。







Telnetサーバーのセットアップ



EVE-NGを使用して、デバイスをクリックするだけで標準的な方法でサーバーコンソールを表示することはできませんでした。 深く掘り下げないために、私はあちこちに行きました-Telnetサーバーをセットアップします。 もちろん、SSH v2も利用可能であり、CSRで動作しますが、インタラクティブな作業には非常に時間がかかり、役に立たない-実稼働ではなく、実験室のスタンドがあります。







その後、サーバーの必要性はなくなりましたが、チートシートのエントリは残ったので、私もそれを与えます。







それでは始めましょう:







  sudo apt-get install xinetd telnetd
      
      





もちろん、 xinetdが自動的に開始された後は、インターネットで約束されたとおり、何も起こりませんでした。







次の内容のtelnetファイルを/etc/xinetd.dに追加する必要があります。







 service telnet { disable = no flags = REUSE socket_type = stream wait = no user = root server = /usr/sbin/in.telnetd }
      
      





xinetdサーバーを再起動します。







 sudo service xinetd restart
      
      





telnetをローカルで確認します。







 @ansible-server:~$ telnet 127.0.0.1 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. Ubuntu 16.04.2 LTS ansible-server login:
      
      





うまくいく!







結果のイメージをEVE-NG仮想マシンにアップロードし、トポロジの収集を試みます。







これで、トポロジ内の隣接するtsiskにあるサーバーのサブネットからアドレスを構成し、telnet経由でアクセスできます。 SSHのようではなく、すべてが高速に動作します。







トポロジコレクション



ここではすべてが非常に簡単です。 私のトポロジーは次のとおりです。







画像







ansibleサブシステムの展開



ansibleで動作するようにCSRを構成する



各ルーターで、管理用に個別のポートを選択し、Gi2ポートをansibleサーバーとの共有ハブに接続します。 管理用のサブネットを選択してみましょう。192.168.0.0/ 24です。 そして、ルーターの数に応じてポートにIPアドレスを割り当てます。







/ etc / hostsサーバーに同じ情報を入力ます。







 192.168.0.1 R1 192.168.0.2 R2 192.168.0.3 R3 192.168.0.4 R4 192.168.0.5 R5 192.168.0.6 R6 192.168.0.7 R7 192.168.0.8 R8 192.168.0.9 R9 192.168.0.10 R10 192.168.0.11 XR1 192.168.0.12 XR2 192.168.0.20 SW1
      
      





各ルーターで、 リンクに従ってSSH v2を構成します。 すべてが些細なことです。必要なSSHv2を実行するには、768ビット以上のキーを生成する必要があるとしか言えません。サイズは2048を選択しました。







サーバーからSSHへのルーターへのアクセスを確認すると同時に、ストア内のキーを収集します。







構成をルーターに保存します。







 R1#wr Building configuration... [OK]
      
      





そして、再起動中にデバイスを再構成しないように、構成をEVE-NGにエクスポートします。







画像







EVE-NGのこの機能は、以前のUnetlabのように、さまざまな成功を収めて機能します。 しかし、期待しましょう。







最初のブックを作成する



私たちが思い出すように、ansible構造は2つの主要部分で構成されています-デバイスの説明(インベントリ)と、実際にはシステムのロジックを備えたワークブックです。







この場合、インベントリは非常に原始的であり、インベントリを含むファイル( / etc / ansible / hosts )は次の形式を取ります







 [ios] R[1:10]
      
      





R1からR10までのホスト名のリストで明らかになったこと(名前解決のために/ etc / hostsをすでに登録していることを思い出してください)。







しかし、vorbukをいじる必要があります。







最初のステップは、実験室の関心の構成をIOS仮想ルーターにアップロードするために、IP制御とVTY設定のみを含む初期ゼロにロールバックする必要があります。







このために、 ios_commandモジュールの使用を試みます







iOSデバイスの構成の変更に関するすべての作業の基礎は、ルーターの特権モードコマンドの機能です。







 configure replace scp://[PATH] force
      
      





ディレクトリ/ home / router / default_configs /にあるネームルーターの下の新しいユーザーのホームディレクトリにあるサーバーのゼロ構成を保存します。 将来的には、ファイルはインベントリ内と同じ名前を持つようになります。 この例では、R1、R2などです。







形式の/ opt / ansibleに rollback.ymlファイルを作成します。







 - name: rollback hosts: ios serial: 1 connection: local gather_facts: false remote_user: cisco tasks: - name: Performing rollback to default configuration. ios_command: commands: configure replace scp://router:cisco@192.168.0.101:~/default_configs/{{ inventory_hostname }} force timeout: 30
      
      





だから、順番に:







プレイブック名:







 - name: rollback
      
      





使用済み在庫の名前:







 hosts: ios
      
      





インベントリから同時に構成されたデバイスの数。 後続のパフォーマンス最適化の重要な部分。







  serial: 1
      
      





私の理解では、これはローカルジョブハンドラーへの接続を示しています。 私は間違っている可能性があります。







  connection: local
      
      





ホスト情報収集の無効化:







 gather_facts: false
      
      





デバイスに接続するためのユーザー名:







 remote_user: cisco
      
      





モジュール呼び出し:







 ios_command:
      
      





インベントリからデバイスへのコマンドの転送:







  commands: configure replace scp://router:cisco@192.168.0.101:~/default_configs/{{ inventory_hostname }} force
      
      





秒単位の応答タイムアウト:







 timeout: 30
      
      





複雑すぎることはありませんが、1つだけあります!







実行してみましょう...







 ansible-playbook ./rollover.yml -k -vvvv
      
      





エラーが発生します!







 "msg": "ios_command does not support running config mode commands. Please use ios_config instead"
      
      





グーグルはこれについてあまり語らないので、私たちは独創性を備えて、誰がこれを語ったのかを見つけようとします。 そして、使用しているモジュールのファイルを見つけます: /usr/local/lib/python2.7/dist-packages/ansible-2.3.0-py2.7.egg/ansible/modules/network/ios/ios_ios.command.pyこれを含むコード:







  if module.check_mode and not item['command'].startswith('show'): warnings.append( 'only show commands are supported when using check mode, not ' 'executing `%s`' % item['command'] ) elif item['command'].startswith('conf'): module.fail_json( msg='ios_command does not support running config mode ' 'commands. Please use ios_config instead' )
      
      





明らかに、開発者は行き過ぎて、すべての構成パラメーターを構成モードにし、適切な行に追加します。







 elif item['command'].startswith('configure terminal'):
      
      





稼いだ!







 root@ansible-server:/opt/ansible# ansible-playbook ./rollback.yml -k SSH password: PLAY RECAP ****************************************************** R1 : ok=1 changed=0 unreachable=0 failed=0 R10 : ok=1 changed=0 unreachable=0 failed=0 R2 : ok=1 changed=0 unreachable=0 failed=0 R3 : ok=1 changed=0 unreachable=0 failed=0 R4 : ok=1 changed=0 unreachable=0 failed=0 R5 : ok=1 changed=0 unreachable=0 failed=0 R6 : ok=1 changed=0 unreachable=0 failed=0 R7 : ok=1 changed=0 unreachable=0 failed=0 R8 : ok=1 changed=0 unreachable=0 failed=0 R9 : ok=1 changed=0 unreachable=0 failed=
      
      





2番目のブックを作成する



前の段階ほど詳細に説明するのではなく、有名なブランドの実験室作業のテーマの初期構成を名前に3文字で埋めるワークブックの例を簡単に示します。







/ etc / ansible /ホスト







 [ios] R[1:10] [ios.base.ipv4] R[1:6]
      
      





/opt/ansible/base.ipv4.yml







 - name: base.ipv4 hosts: ios.base.ipv4 connection: local gather_facts: false remote_user: cisco serial: 1 tasks: - name: base.ipv4 configuration load ios_config: src: ./IOS-XE-initials/base.ipv4/{{ inventory_hostname }}
      
      





初期構成ファイルは、それぞれ/opt/ansible/IOS-XE-initials/base.ipv4にあります。 このシナリオの主な違いは、 ios_configモジュールの機能の使用と、デバイスで実行する必要のあるコマンドを解釈するためのモジュールへの権限の転送です。







それだけです、ご清聴ありがとうございました。 この記事を継続する価値がある場合、次のトピックはIOS XRとansibleの相互作用のセットアップです。








All Articles