Successfully reported this slideshow.
Your SlideShare is downloading. ×

Ansible ではじめる ネットワーク自動化(Ansible 2.9版)

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad

Check these out next

1 of 36 Ad
Advertisement

More Related Content

Slideshows for you (20)

Similar to Ansible ではじめる ネットワーク自動化(Ansible 2.9版) (20)

Advertisement

More from akira6592 (20)

Recently uploaded (20)

Advertisement

Ansible ではじめる ネットワーク自動化(Ansible 2.9版)

  1. 1. Ansible ではじめる ネットワーク⾃動化(Ansible 2.9版) 2020/07/08 Ansibleについて語る会【ビヨンド勉強会#25】 株式会社エーピーコミュニケーションズ 横地 晃 1
  2. 2. はじめに ¡ Ansible はネットワーク機器にも対応しています ¡ 概要やサンプル、ハマりどころなどをご紹介します 2 Cisco IOS、Juniper Junos、Arista EOS など
  3. 3. ⾃⼰紹介 3 所属 エーピーコミュニケーションズ 業務 ネットワーク⾃動化の⽀援、アウトプット コミュニティ Ansible ユーザー会、JANOG 共著・寄稿 Ansible実践ガイド 第3版 Software Design 2018年12⽉号 他 横地 晃 @akira6592 https://book.impress.co.jp/books/1118101094 https://tekunabe.hatenablog.jp/ https://gihyo.jp/magazine/SD/archive/2018/201812 てくなべ(ブログ)
  4. 4. Ansible ユーザー会について ¡ Ansible Night ¡ 事例やナレッジの発表イベント ¡ もくもく会 ¡ ⽉⼀くらいで開催のハンズオン ¡ 直近は 7/14 開催 ¡ Slack ¡ #network、#cloud、#windows などのジャンル別チャンネル ¡ 質問できる #qa チャンネル 4 https://ansible-users.connpass.com/ https://bit.ly/ansiblejp-slack 現在、開催時はフルリモート
  5. 5. 内容 ¡ ネットワーク対応の概要 ¡ ネットワークモジュールを使うために ¡ サンプル ¡ ハマりどころ ¡ よくある質問 5
  6. 6. ネットワーク対応の概要 6
  7. 7. 接続⽅式とできること ¡ 接続⽅式 ¡ SSH、NETCONF、RESTCONF、HTTP/HTTPS(API)などによってネットワーク機器に接続 ¡ できることの例 ¡ 参照(show)コマンド実⾏による情報取得 ¡ 設定コマンド実⾏による設定追加・変更・削除 7 SSH NETCONF RESTCONF HTTP API 参照 設定
  8. 8. 対応プラットフォーム(ネットワークOS) ¡ Cisco IOS、IOS-XR、NX-OS、Juniper Junos、Arista EOS など、 50 以上のプラットフォームに対応 ¡ 他、サードパーティモジュールとして提供しているベンダーもある 8ネットワークモジュール⼀覧 https://docs.ansible.com/ansible/latest/modules/list_of_network_modules.html • A10 • Aci • Aireos • Aruba • Asa • Avi • Bigswitch • Check_Point • Cloudengine • Cloudvision • Cnos • Cumulus • Dellos10 • Dellos6 • Dellos9 • Edgeos • Edgeswitch • Enos • Eos • Eric_Eccli • Exos • F5 • Files • Fortianalyzer • Fortimanager • Fortios • Frr • Ftd • Icx • Illumos • Ingate • Ios • Iosxr • Ironware • Itential • Junos • Meraki • Netact • Netscaler • Netvisor • Nos • Nso • Nuage • Nxos • Onyx • Opx • Ordnance • Ovs • Panos • Radware • Routeros • Skydive • Slxos • Sros • Voss • Vyos
  9. 9. メリット1: ログインやモード変更の処理を簡略化できる ¡ 認証情報を定義しておくだけで暗黙的にログイン、ログアウト ¡ 設定系モジュールは暗黙的にコンフィギュレーションモードへ移⾏ 9 マクロと⽐較した主観 login: password: conf t
  10. 10. メリット2: プロンプトのハンドリンクが簡略化できる ¡ エラーや正常プロンプトはモジュールに組み込まれている 10 マクロと⽐較した主観 terminal_stdout_re = [ re.compile(br"[¥r¥n]?[¥w¥+¥-¥.:¥/¥[¥]]+(?:¥([^¥)]+¥)){0,3}(?:[>#]) ?$") ] terminal_stderr_re = [ re.compile(br"% ?Error"), # re.compile(br"^% ¥w+", re.M), re.compile(br"% ?Bad secret"), re.compile(br"[¥r¥n%] Bad passwords"), re.compile(br"invalid input", re.I), re.compile(br"(?:incomplete|ambiguous) command", re.I), re.compile(br"connection timed out", re.I), re.compile(br"[^¥r¥n]+ not found"), re.compile(br"'[^']' +returned error code: ?¥d+"), re.compile(br"Bad mask", re.I), re.compile(br"% ?(¥S+) ?overlaps with ?(¥S+)", re.I), re.compile(br"[%¥S] ?Error: ?[¥s]+", re.I), re.compile(br"[%¥S] ?Informational: ?[¥s]+", re.I), re.compile(br"Command authorization failed") ] https://github.com/ansible/ansible/blob/v2.9.10/lib/ansible/plugins/terminal/ios.py#L35-L54
  11. 11. メリット3: Ansible の他の機能と連携しやすい ¡ 例1: コマンド実⾏結果を copy モジュールに渡してファイルに保存 ¡ 例2: テンプレート機能を利⽤して、コンフィグを⽣成して投⼊ ¡ 例3: 監視サーバーに登録されているホスト情報を接続に利⽤ 11 マクロと⽐較した主観
  12. 12. ネットワークモジュールを使うために 12
  13. 13. ネットワークモジュールの探し⽅ ¡ 公式ドキュメントの「Network modules」を確認 ¡ モジュール名には規則がある 13 例) ios_command プラットフォーム名 ios Cisco IOS/IOS-XE nxos Cisco NX-OS junos Juniper Junos eos Arista EOS : : 機能名 command 主に show コマンド config 設定コマンド facts システム情報取得 interfaces インターフェース設定 : : ios_command モジュール https://docs.ansible.com/ansible/latest/modules/ios_command_module.html
  14. 14. 必要な変数その1: 接続と認証 ¡ ネットワーク機器への接続するための⽅式や認証情報を指定 14 変数名 意味 値の例 ansible_network_os プラットフォーム名 ios、nxos、junos ansible_connection 接続⽅式 network_cli、netconf ansible_user ユーザー名 ansible_password パスワード プラットフォームやコネクションプラグインによって変数や値が異なる。詳細は以下のページ https://docs.ansible.com/ansible/latest/network/user_guide/platform_index.html
  15. 15. 必要な変数その2: 特権モードへの移⾏ ¡ 特権モードへの移⾏が必要な場合は指定 15 変数名 意味 値の例 ansible_become 特権移⾏の有無 true、false ansible_become_method 特権移⾏コマンド enable ansible_become_password 特権パスワード
  16. 16. サンプル1: show コマンド結果のファイル保存 16
  17. 17. サンプル1: show コマンド結果のファイル保存 ¡ show running-config コマンドの実⾏結果をファイルに保存する 17 (1) show running-config 実⾏ (2) コマンド実⾏結果取得 (3) ファイル保存 Cisco IOS
  18. 18. --- ansible_network_os: ios ansible_connection: network_cli ansible_user: admin ansible_password: testpassword サンプル1: show コマンド結果のファイル保存 ¡ インベントリファイル(inventory.ini) ¡ グループ変数ファイル(group_vars/ios.yml) 18 [ios] ios01 ansible_host=172.16.0.1 対象器機を定義 OS、コネクションプラグイン、 認証情報を定義 これらのファイルは、以降のサンプルでも共通
  19. 19. サンプル1: show コマンド結果のファイル保存 ¡ Playbook の作成 19 --- - hosts: ios gather_facts: no tasks: - name: show running-config ios_command: commands: - show running-config register: result_run - name: save config to file copy: content: "{{ result_run.stdout[0] }}" dest: "show_runing-config_{{ inventory_hostname }}.log" (1) ios_command で IOS 機器に 実⾏したい show コマンドを指定 (2) copyモジュールで コマンド実⾏結果をファイルに保存 ios_command モジュール https://docs.ansible.com/ansible/latest/modules/ios_command_module.html
  20. 20. サンプル1: show コマンド結果のファイル保存 ¡ Playbook 実⾏ログ 20 $ ansible-playbook -i inventory.ini show.yml PLAY [ios] ******************************************************************** TASK [show running-config] **************************************************** ok: [ios01] TASK [save to file] *********************************************************** changed: [ios01] PLAY RECAP ******************************************************************** ios01 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ansible-playbook コマンドを実⾏ 結果が新たに保存されたログ
  21. 21. サンプル1: show コマンド結果のファイル保存 ¡ 保存されたファイルの確認 21 $ cat show_running-config_ios01.log Building configuration... Current configuration : 1736 bytes ! ! Last configuration change at 00:36:42 UTC Sun Jun 28 2020 by ansible ! version 15.8 service timestamps debug datetime msec service timestamps log datetime msec no service password-encryption ! hostname rt01 ! boot-start-marker boot-end-marker ! ...(略)... show running-config 実⾏結果が ファイルとして保存された
  22. 22. サンプル1: show コマンド結果のファイル保存 ¡ 応⽤・補⾜ ¡ 指定次第で他の show コマンドも取得できる ¡ show running-config であれば、ios_config や ios_facts モジュールでも取得できる ¡ ファイルを git push して履歴管理などの応⽤も 22 - name: show running-config ios_command: commands: - show running-config register: result_run
  23. 23. サンプル2: インターフェースの設定 23
  24. 24. サンプル2: インターフェースの設定 ¡ ios_interfaces モジュールでインターフェースの基本設定 24 --- - hosts: ios gather_facts: no tasks: - name: set interface ios_interfaces: config: - name: GigabitEthernet0/1 description: set by ansible enabled: True # no shutdown 相当 ios_interfaces モジュール https://docs.ansible.com/ansible/latest/modules/ios_interfaces_module.html (1) description の設定と有効化
  25. 25. サンプル2: インターフェースの設定 ¡ Playbook 実⾏ログ 25 $ ansible-playbook -i inventory.ini set_interface.yml PLAY [ios] ************************************************************************* TASK [set interface] *************************************************************** changed: [ios01] PLAY RECAP ************************************************************************* ios01 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 インターフェースの有効化と description 設定がされた
  26. 26. サンプル3: 任意の設定コマンドを実⾏ 26
  27. 27. サンプル3: 任意の設定コマンドを実⾏ ¡ 専⽤の設定モジュールがない場合は ios_config モジュールを利⽤ 27 --- - hosts: ios gather_facts: no tasks: - name: set snmp ios_config: lines: - "snmp-server community {{ item.com }} {{ item.priv }}" loop: - com: public priv: RO - com: secret priv: RW (1) 任意のコマンド(のテンプレート) (2) コマンドに埋め込む変数
  28. 28. サンプル3: 任意の設定コマンドを実⾏ ¡ Playbook 実⾏ログ 28 $ ansible-playbook -i inventory.ini set_config.yml PLAY [ios] *********************************************************************** TASK [set snmp] ****************************************************************** changed: [ios01] => (item={'com': 'public', 'priv': 'RO'}) changed: [ios01] => (item={'com': 'secret', 'priv': 'RW'}) PLAY RECAP *********************************************************************** ios01 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 以下のコマンドが実⾏された snmp-server community public RO snmp-server community private RW
  29. 29. ハマりどころ 29
  30. 30. ping モジュールでは疎通確認できない ¡ ネットワーク機器向けのコネクションプラグインと ping モジュール の組み合わせは、コントロールノード⾃⾝に疎通確認してしまう ¡ 代わりに *_facts や *_command など、実際に接続するモジュールを利⽤ 30 ネットワーク機器 には接続しない 【pingモジュール】 コントロールノード⾃⾝に疎通確認 対策 ※ Ansible 2.9 の場合
  31. 31. 省略コマンドは意図せず changed になってしまう ¡ *_config モジュールで省略コマンドを指定すると、毎回 changed になる ¡ コマンドは省略せずに指定 31 - name: config ios_config: lines: - ntp ser 10.0.0.123 [参考] Why do the *_config modules always return changed=true with abbreviated commands? https://docs.ansible.com/ansible/latest/network/user_guide/faq.html#why-do-the-config-modules-always-return-changed-true-with-abbreviated-commands 172.16.0.2 : ok=1 changed=1 unreachable=0 failed=0(略) RouterA# sh run | inc ntp ntp server 10.0.0.123 172.16.0.2 : ok=1 changed=1 unreachable=0 failed=0(略) Playbook 実⾏ コンフィグ 再実⾏ 「server」 でなく「ser」と省略すると・・ Playbookで指定した省略コマンドと、 機器に設定済みの完全コマンドが ⼀致しないため、また changed 対策
  32. 32. よくある質問 32
  33. 33. telnet じゃだめなの︖ ¡ telnet モジュール is 「dirty」、作り込みが必要でバグのもと ¡ いわゆる expect やマクロっぽくなり、Ansible のメリットが活かせない 33サンプル引⽤元 https://docs.ansible.com/ansible/latest/modules/telnet_module.html#examples - name: send configuration commands to IOS telnet: user: cisco password: cisco login_prompt: "Username: " prompts: - "[>#]" command: - terminal length 0 - configure terminal - hostname ios01 認証情報がタスクごとに必要 プロンプトを⾃分で定義する必要あり • 戻り値に送信コマンドが混⼊する • タスクごとに接続・切断されて効率が悪い • モジュールがほとんどメンテされていない、 など
  34. 34. まとめ 34
  35. 35. まとめ ¡ 50以上のネットワークプラットフォームに対応 ¡ Cisco IOS、Juniper Junos、Arista EOS などに対して、showコマンドや設定変更を実⾏できる ¡ マクロにないメリットがある ¡ プロンプトのハンドリング、ログイン/ログインの簡略化、他の Ansible の機能との連携 ¡ サーバー系のモジュールと異なる特徴がある ¡ コネクションプラグインの選択、ansible_network_os 変数、pingモジュールの扱い、など 35
  36. 36. 参考 ¡ ネットワークモジュール⼀覧 ¡ https://docs.ansible.com/ansible/latest/modules/list_of_network_modules.html ¡ Ansible Network FAQ ¡ https://docs.ansible.com/ansible/latest/network/user_guide/faq.html ¡ AnsibleでNW⾃動化する⼈に伝えたいこと ¡ https://www.slideshare.net/kotasaegusa/ansible-night-236232594 36

×