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

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