Ansible ではじめる
ネットワーク⾃動化(Ansible 2.9版)
2020/07/08 Ansibleについて語る会【ビヨンド勉強会#25】
株式会社エーピーコミュニケーションズ
横地 晃
1
はじめに
¡ Ansible はネットワーク機器にも対応しています
¡ 概要やサンプル、ハマりどころなどをご紹介します
2
Cisco IOS、Juniper Junos、Arista EOS など
⾃⼰紹介
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
てくなべ(ブログ)
Ansible ユーザー会について
¡ Ansible Night
¡ 事例やナレッジの発表イベント
¡ もくもく会
¡ ⽉⼀くらいで開催のハンズオン
¡ 直近は 7/14 開催
¡ Slack
¡ #network、#cloud、#windows などのジャンル別チャンネル
¡ 質問できる #qa チャンネル
4
https://ansible-users.connpass.com/
https://bit.ly/ansiblejp-slack
現在、開催時はフルリモート
内容
¡ ネットワーク対応の概要
¡ ネットワークモジュールを使うために
¡ サンプル
¡ ハマりどころ
¡ よくある質問
5
ネットワーク対応の概要
6
接続⽅式とできること
¡ 接続⽅式
¡ SSH、NETCONF、RESTCONF、HTTP/HTTPS(API)などによってネットワーク機器に接続
¡ できることの例
¡ 参照(show)コマンド実⾏による情報取得
¡ 設定コマンド実⾏による設定追加・変更・削除
7
SSH
NETCONF
RESTCONF
HTTP API
参照
設定
対応プラットフォーム(ネットワーク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
メリット1: ログインやモード変更の処理を簡略化できる
¡ 認証情報を定義しておくだけで暗黙的にログイン、ログアウト
¡ 設定系モジュールは暗黙的にコンフィギュレーションモードへ移⾏
9
マクロと⽐較した主観
login:
password:
conf t
メリット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
メリット3: Ansible の他の機能と連携しやすい
¡ 例1: コマンド実⾏結果を copy モジュールに渡してファイルに保存
¡ 例2: テンプレート機能を利⽤して、コンフィグを⽣成して投⼊
¡ 例3: 監視サーバーに登録されているホスト情報を接続に利⽤
11
マクロと⽐較した主観
ネットワークモジュールを使うために
12
ネットワークモジュールの探し⽅
¡ 公式ドキュメントの「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
必要な変数その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
必要な変数その2: 特権モードへの移⾏
¡ 特権モードへの移⾏が必要な場合は指定
15
変数名 意味 値の例
ansible_become 特権移⾏の有無 true、false
ansible_become_method 特権移⾏コマンド enable
ansible_become_password 特権パスワード
サンプル1: show コマンド結果のファイル保存
16
サンプル1: show コマンド結果のファイル保存
¡ show running-config コマンドの実⾏結果をファイルに保存する
17
(1) show running-config 実⾏
(2) コマンド実⾏結果取得
(3) ファイル保存
Cisco IOS
---
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、コネクションプラグイン、
認証情報を定義
これらのファイルは、以降のサンプルでも共通
サンプル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
サンプル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 コマンドを実⾏
結果が新たに保存されたログ
サンプル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 実⾏結果が
ファイルとして保存された
サンプル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
サンプル2: インターフェースの設定
23
サンプル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 の設定と有効化
サンプル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 設定がされた
サンプル3: 任意の設定コマンドを実⾏
26
サンプル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) コマンドに埋め込む変数
サンプル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
ping モジュールでは疎通確認できない
¡ ネットワーク機器向けのコネクションプラグインと ping モジュール
の組み合わせは、コントロールノード⾃⾝に疎通確認してしまう
¡ 代わりに *_facts や *_command など、実際に接続するモジュールを利⽤
30
ネットワーク機器
には接続しない
【pingモジュール】
コントロールノード⾃⾝に疎通確認
対策
※ Ansible 2.9 の場合
省略コマンドは意図せず 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
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
まとめ
¡ 50以上のネットワークプラットフォームに対応
¡ Cisco IOS、Juniper Junos、Arista EOS などに対して、showコマンドや設定変更を実⾏できる
¡ マクロにないメリットがある
¡ プロンプトのハンドリング、ログイン/ログインの簡略化、他の Ansible の機能との連携
¡ サーバー系のモジュールと異なる特徴がある
¡ コネクションプラグインの選択、ansible_network_os 変数、pingモジュールの扱い、など
35
参考
¡ ネットワークモジュール⼀覧
¡ 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

More Related Content

PDF
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
PDF
大規模DCのネットワークデザイン
PDF
OpenStack超入門シリーズ Novaのディスク周りあれこれ
PDF
インターネットの仕組みとISPの構造
PPTX
フロー技術によるネットワーク管理
PDF
show コマンド結果をパースする方法あれこれ #npstudy
PDF
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
PDF
大規模サービスを支えるネットワークインフラの全貌
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
大規模DCのネットワークデザイン
OpenStack超入門シリーズ Novaのディスク周りあれこれ
インターネットの仕組みとISPの構造
フロー技術によるネットワーク管理
show コマンド結果をパースする方法あれこれ #npstudy
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
大規模サービスを支えるネットワークインフラの全貌

What's hot (20)

PDF
無料で仮想Junos環境を手元に作ろう
PDF
AvailabilityZoneとHostAggregate
PDF
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
PDF
ソーシャルゲームのためのデータベース設計
PDF
OpenStackトラブルシューティング入門
PDF
Docker Compose 徹底解説
PDF
Keycloak拡張入門
PDF
新入社員のための大規模ゲーム開発入門 サーバサイド編
PDF
ストリーム処理を支えるキューイングシステムの選び方
PPTX
NGINXをBFF (Backend for Frontend)として利用した話
PPTX
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
PDF
ルータコンフィグのGit管理のススメ 〜Git管理以外を自動化してみた〜
PDF
ネットワークの自動化・監視の取り組みについて #netopscoding #npstudy
PPTX
Cisco Modeling Labs (CML)を使ってネットワークを学ぼう!(DevNet編)
PPTX
本当は恐ろしい分散システムの話
PDF
BuildKitの概要と最近の機能
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
PPTX
動的コンテンツをオリジンとしたCloudFrontを構築してみた
PDF
Dockerからcontainerdへの移行
PPTX
RLSを用いたマルチテナント実装 for Django
無料で仮想Junos環境を手元に作ろう
AvailabilityZoneとHostAggregate
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
ソーシャルゲームのためのデータベース設計
OpenStackトラブルシューティング入門
Docker Compose 徹底解説
Keycloak拡張入門
新入社員のための大規模ゲーム開発入門 サーバサイド編
ストリーム処理を支えるキューイングシステムの選び方
NGINXをBFF (Backend for Frontend)として利用した話
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
ルータコンフィグのGit管理のススメ 〜Git管理以外を自動化してみた〜
ネットワークの自動化・監視の取り組みについて #netopscoding #npstudy
Cisco Modeling Labs (CML)を使ってネットワークを学ぼう!(DevNet編)
本当は恐ろしい分散システムの話
BuildKitの概要と最近の機能
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
動的コンテンツをオリジンとしたCloudFrontを構築してみた
Dockerからcontainerdへの移行
RLSを用いたマルチテナント実装 for Django
Ad

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

PDF
Ansibleではじめるサーバー・ネットワークの自動化(2018/07/05)
PDF
Ansible とネットワーク自動化の概要(SmartCS と Ansible の連携による自動化の可能性を体験!)
PDF
Ansibleではじめるサーバー・ネットワークの自動化(2018/08/22)
PDF
Ansible 2.8 アップデート情報 -機能追加と注意点-
PDF
What is an Ansible?
PDF
ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催)
PDF
ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)
PDF
インフラ自動構築エンジン "Ansible"の勘所を1日でつかむ ~基礎入門編~
PDF
Cell/B.E. プログラミング事始め
PDF
ACI + Ansible
PDF
Ansible2.0と実用例
PDF
Ansible2とOpenStackの関係
PDF
Hinemosによる初期構築~障害検知自動復旧システムの実現について
PDF
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
PDF
Ansible 2.10 と Collection
PDF
モバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組み
PDF
Zマイスターとの新たな価値探求 z/OS
PDF
Ansible2.9 ネットワーク対応のアップデート #ansiblejp
PPT
Intalio Cloud Workshop
PDF
Locondo 20190703@inno db_cluster
Ansibleではじめるサーバー・ネットワークの自動化(2018/07/05)
Ansible とネットワーク自動化の概要(SmartCS と Ansible の連携による自動化の可能性を体験!)
Ansibleではじめるサーバー・ネットワークの自動化(2018/08/22)
Ansible 2.8 アップデート情報 -機能追加と注意点-
What is an Ansible?
ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)
インフラ自動構築エンジン "Ansible"の勘所を1日でつかむ ~基礎入門編~
Cell/B.E. プログラミング事始め
ACI + Ansible
Ansible2.0と実用例
Ansible2とOpenStackの関係
Hinemosによる初期構築~障害検知自動復旧システムの実現について
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ansible 2.10 と Collection
モバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組み
Zマイスターとの新たな価値探求 z/OS
Ansible2.9 ネットワーク対応のアップデート #ansiblejp
Intalio Cloud Workshop
Locondo 20190703@inno db_cluster
Ad

More from akira6592 (20)

PDF
新人研修資料 向き合うエンジニア
PDF
Ansible 実践ガイド第3版 ネットワーク担当としてのふりかえり #インフラエンジニアBooks
PDF
Ansible でお世話になっている機能と拡張
PDF
自動化の下ごしらえ
PDF
向き合うエンジニア 2020年度版
PDF
はじめてAnsibleのバグ修正に協力してみた
PDF
CML-Personal (VIRL2)のインストールと基本機能
PDF
BGP Unnumbered で遊んでみた
PDF
自動化ツール Ansible に触れてみよう(技術インターン)
PDF
技術ブログを書こう
PDF
私たちはRESTCONFでネットワーク自動化的に何が嬉しくなるのか考えてみた
PDF
はじめた自動化をどう広めるか 書籍「Fearless Change」からのヒント
PPTX
はじめどころを探る自動化アセスメント(JANOG44 ここからはじめよう、運用自動化)
PPTX
向き合うエンジニア
PDF
ネットワークコンフィグ分析ツール Batfish との付き合い方
PDF
Ansibleではじめるサーバー・ネットワークの自動化(2019/04版)
PDF
Ansibleではじめるサーバー・ネットワークの自動化(2019/02版)
PDF
「自動化の行き着く先は?」をうけて
PDF
Ansibleでネットワーク機器の状態確認を自動化してみよう
PDF
Ansibleではじめるサーバー・ネットワークの自動化 (Ansible2.7情報つき)2018/10/12
新人研修資料 向き合うエンジニア
Ansible 実践ガイド第3版 ネットワーク担当としてのふりかえり #インフラエンジニアBooks
Ansible でお世話になっている機能と拡張
自動化の下ごしらえ
向き合うエンジニア 2020年度版
はじめてAnsibleのバグ修正に協力してみた
CML-Personal (VIRL2)のインストールと基本機能
BGP Unnumbered で遊んでみた
自動化ツール Ansible に触れてみよう(技術インターン)
技術ブログを書こう
私たちはRESTCONFでネットワーク自動化的に何が嬉しくなるのか考えてみた
はじめた自動化をどう広めるか 書籍「Fearless Change」からのヒント
はじめどころを探る自動化アセスメント(JANOG44 ここからはじめよう、運用自動化)
向き合うエンジニア
ネットワークコンフィグ分析ツール Batfish との付き合い方
Ansibleではじめるサーバー・ネットワークの自動化(2019/04版)
Ansibleではじめるサーバー・ネットワークの自動化(2019/02版)
「自動化の行き着く先は?」をうけて
Ansibleでネットワーク機器の状態確認を自動化してみよう
Ansibleではじめるサーバー・ネットワークの自動化 (Ansible2.7情報つき)2018/10/12

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