てくなべ (tekunabe)

ansible / network automation / 学習メモ

トップエスイーセミナー「Infrastructure as Code によるITインフラの継続的改善」に参加してきました

■ はじめに

2018/12/07 に開催された、トップエスイーセミナー「Infrastructure as Code によるITインフラの継続的改善」に参加してきました。

トップエスイーセミナーとは

社会人エンジニア向けにソフトウェア工学の教育を提供しているトップエスイーが開催するセミナー

です。(引用元: https://www.topse.jp/ja/seminar.html#ci)

今回は Asnible ユーザー会の Slack の #study という勉強会情報のチャンネル内で本セミナーを知りました。

書籍「Infrastructure as Code」や「インフラCI実践ガイド」で、この分野を学びましたが、より深く知ったり、実際に手を動かして見たいと思って参加しました。 また、基本的にはサーバーインフラを対象とした内容ですが、ネットワークにも応用できるのでは、という思いもありました。


■ 講義パート

講義パートでは、IaC が求められる背景や IaC の概念について学習しました。

印象に残ったのは、たびたび「不確実性」といキーワードが出てきた点です。私も今年は不確実性という言葉を意識し始めました。書籍「エンジニアリング組織論への招待」で、エンジニアリングの目的を「不確実性を削減すること」と定義していることが印象残っていたためです。本セミナーの参考図書にも本書が挙げられていました。


■ 演習パート

演習パートでは、用意された環境(PC含む)を利用して、自動化単品の仕組みからパイプラインの作成までを実際に操作しました。主に利用したのは Ansible と GitLab です。 まずは、Ansilbe でインフラ構築の自動化、テストの自動化を行いました。 その後、GitLab で一連のパイプラインを作成し、構成変更のコミットをするとテストや構築自動化が動くところまでを確認しました。


■ まとめ・感想

講義パートもしっかりしていたため、ただ単にツールの操作方法を覚えるだけでなく、背景や概念から入っていくことができました。

また、書籍「インフラCI実践ガイド」内の演習で前提とする環境が、少々ハードルが高かった(*1)ため試せずにいました。本セミナーでは、すべての環境が準備されていたので、とても助かりました。

*1: Docker だけで演習できる環境を試験的に作成されたそうです

www.topse.jp

[Ansible] null コールバックプラグインをためしてみた

はじめに:コールバックプラグインとは

Ansible には コールバックプラグインという仕組みがあり、たとえば json コールバックプラグインを利用すると、ansible-playbook 実行結果の表示は JSON に変更できます。

Ansible 2.5 から null コールバックプラグインが追加されました。 使い所はあまりないかも知れませんが、一応試してみます。(Ansible 2.7.1 で確認)

準備

  • Playbook: test.yml
- host: localhost
  gather_facts: no

  tasks:
    - name: debug
      debug: "Hello"
  • 設定ファイル: ansible.cfg
[defaults]
stdout_callback = null

設定ファイルの代わりに、環境変数 ANSIBLE_STDOUT_CALLBACK でも設定可能です。

export ANSIBLE_STDOUT_CALLBACK=null

設定方法の詳細は Ansible Configuration Settings をご参照ください。

実行1: 正常時

$ ansible-playbook -i localhost, nulltest.yml
$

本当に何も表示されませんでした。

なお、特にコールバックプラグインを指定しない場合は、以下のようなログになります。

$ ansible-playbook -i localhost, nulltest.yml

PLAY [localhost] *************************************************************************************

TASK [debug] *****************************************************************************************
ok: [localhost] => {
    "msg": "Hello"
}

PLAY RECAP *******************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0
$

実行2: YAMLシンタックスエラー

設定したのはあくまで標準出力に対するコールバックプラグインなので、エラーは通常通り出力されます。 YAMLシンタックスエラーの場合は以下のようになりました。

$ ansible-playbook -i localhost, nulltest.yml
ERROR! Syntax Error while loading YAML.
  expected <block end>, but found '?'

The error appears to have been in '/vagrant/nulltest.yml': line 7, column 5, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

      debug:
    msg: "Hello"
    ^ here

$ 

実行3: yum モジュールでのエラー

今度は yum モジュールの name オプションで、存在しないパッケージ名をした場合です。 以下のように、微妙な出力となりました。

$ ansible-playbook -i localhost, nulltest.yml
        to retry, use: --limit @/vagrant/nulltest.c
$

※補足 retry_files_enabled をデフォルトのまま (True) にしているため、エラーが発生したホストに対するリトライファイルが生成されます。

まとめ

標準出力にnull コールバックプラグインを利用すると、正常時は何も表示さないことが確認できました。 何らかの出力を抑制したい場合、シェルレベルで抑制してもよいですが、Ansible の場合はこんな選択肢もあるとだけ覚えておくことにします。

[Batfish] allinone イメージの Jupyter Notebook から自前のコンフィグディレクトリを利用可能にする方法



これは Batfish Advent Calendar 2018 の8日目の記事です。



■ はじめに

ネットワークコンフィグ分析ツール Batfish には公式 Docker イメージが2つあります。

  • イメージ1: batfish/batfish
    • batfish 本体の イメージ
  • イメージ2: batfish/allinone
    • batfish 本体と Python ライブラリ、かんたんにお試しできる Jupyter Notebook やサンプルコンフィグ入りイメージ

オールインワンな batfish/allinone は便利ですが、公式のコンテナ起動手順例ではデフォルトではあらかじめ用意されたサンプルコンフィグしか利用できません。もちろん Jupyter Notebook 経由でアップロードや、新規作成もできますが、少々手間に感じます。

そこで、本記事では batfish/allinone の環境の Jupyter Notebook から自前のコンフィグディレクトリを利用可能にする方法を説明します。

■ 公式のコンテナ起動手順例では、用意されたコンフィグのみ利用可能

公式のコンテナ起動手順例は以下のとおりです。

docker run -p 8888:8888 batfish/allinone

この手順で起動した Notebook では、以下のようなディレクトリ構造が見えます。

notebooks ディレクトリあらかじめ用意されたサンプルコンフィグファイルが格納されたディレクトリです。

f:id:akira6592:20181208185848p:plain
公式手順例ではサンプルコンフィグのみ

■ /notebooks ディレクトリ配下にマウントすると、自前コンフィグ利用可能になる

Notebook に表示されるディレクトリは、コンテナ側の /notebooks です。 そのため、Notebook 上で、自前コンフィグがある別のディレクトリをマウントするには、/notebooks ディレクトリ配下にマウントすれば良いことになります。

例えば、自前コンフィグがあるディレクトリが mynetworks であれば、以下のコマンドでコンテナを起動します。

docker run -p 8888:8888 -v $(pwd)/mynetworks:/notebooks/mynetworks batfish/allinone

この手順で起動した Notebook では、以下のようなディレクトリ構造が見えます。

f:id:akira6592:20181208185941p:plain
自前コンフィグディレクトリ mynetworks をマウントして利用可能に

mynetworks ディレクトリが自前コンフィグのディレクトリです。

もし、batfish/allinone イメージにもともとある、.ipynb ファイルや networks ディレクトリなどさえも不要の場合は、以下のようにします。

docker run -p 8888:8888 -v $(pwd)/mynetworks:/notebooks batfish/allinone

■ まとめ

  • batfish/allinone イメージの Jupyter Notebook は、コンテナ側の /notebooks ディレクトリを表示する
  • -v $(pwd)/mynetworks:/notebooks/mynetworks のようにマウントすると自前コンフィグも Notebook から利用できるようになる

参考

tekunabe.hatenablog.jp

ネットワークエンジニアがはじめてプルリクを出した話(Ansible)



これは DevLOVE Advent Calendar 2018 の 6日目の記事です。



はじめに

DevLOVE のコンセプトは以前は以下の2つでした。

  • 開発の楽しさを発見しよう。広げよう。
  • 開発の現場を前進させよう。

今年は 3つめが追加されました。

  • 自分から越境しよう。

越境とは何なのか、様々な解釈があると思いますが、私としては「何かの意思をもって小さな一歩を踏み出すこと」と考えています。

この記事では私にとって小さな一歩だった、はじめてプルリクエストを出してみたときの話を書きたい思います。


OSSに貢献してみたいけれど

私は、Ansible という OSS の構成管理(自動化)ツールに触ることがあります。OSS に関しては、これまでは利用のみで貢献(コントリビュート)したことがありませんでした。貢献してみたいなと思いつつも、感じていた壁としては以下の 3点です。

  1. GitHub 上のやりとりが英語であること
  2. GitHub の操作そのものが不慣れなこと
  3. コード修正に対する不安感


考え方を変える・協力を得る

前述の3つの壁については、以下のように考え方を変えたり、同僚の協力を得たりしました。

  • 1.の英語については、とある人から「GitHub 上のやりとりで、英語ネイティブの人はそんなにいないよ。」と聞きました。実際のところはどうか分かりませんが、そうなのかもと言い聞かせてチャレンジすることにしました。
  • 2.の GitHub の操作ついては、同僚に練習用のリポジトリを用意してもらって、やりとりを練習しました。Ansible の固有のプロセスについては、The Ansible Development Process というページも参考にしました。
  • 3.については、公式ドキュメントの修正だけでもよいか、と考えを切り替えました。


はじめてのプルリク

公式ドキュメントの簡単な修正から始めてみました。最初は、net_get というモジュール(機能)の説明ページにある、サンプルコード(Playbook)の一行だけです。

本当に一行だけです。

github.com

果たしてマージされるのだろうかと心配でした。ですが、「Ansibleに貢献してみよう」という資料の通り、ドキュメント修正に対するマージは比較的早かったです。 修正ファイルの diff を確認すれば説明不要レベルの修正内容だったので、不安だった英語も何とかなったのだと思います。

説明の書きっぷりについては、他のドキュメント修正のプルリクを参考にしました。

※ 補足 Ansible は、Python のコードに書かれている定型のコメントからドキュメントを生成する仕組みになっています。


マージされてうれしい

マージされたときはとてもうれしかったです。また、Contributor というラベル?が付いたのもうれしかったです。

f:id:akira6592:20181204182428p:plain
Contributor...!

なんとなく雰囲気がつかめたので、ドキュメントの誤りを見つけ次第プルリクを出していきました。簡単な修正だったので、ほとんどはすぐにマージしてもらえました。

ただし、「fix transport option default value of f5 modules docs #44343」というプルリクについては、少し長引いているうちに、needs_rebaseneeds_version タグが付いてしまいました。

f:id:akira6592:20181204182720p:plain
needs_rebase、needs_version タグが付いてしまう

不慣れだった私は「ちょっと通常の状態じゃなくなったぽいぞ・・」と思い、何もできずにそのままにしてしまいました。としばらくすると、別の方が別のプルリクで、私の修正分を良い感じに取り込んでくれました。OSS の優しい世界に触れた気がします。


まとめ

OSSへの貢献への壁はずっと感じてたのですが、ちょっとしたことから始めるのでも全然OKと思いました。 今後もできることから少しずつ進めていきたいと思います。

今回私がやったことは、開発者の方にとっては息をするような簡単なことかと思いますが、ちょっと勇気がいることでした。 逆に「自分では簡単にできても、他の人には難しいこと」というのはある気がします。周りを見渡して、それに気付けるような人でありたいとも思いました。

[Batfish] 重複したインターフェースのIPアドレスを検出する(IOS/Junos混在編)



これは Batfish Advent Calendar 2018 の6日目の記事です。



ネットワーク機器のコンフィグ解析ツール Batfish には、重複したインターフェースのIPアドレスを検出する機能があります。

以前は、Cisco IOS のコンフィグを対象に試しました。 tekunabe.hatenablog.jp

今回は、Cisco IOS と Juniper Junos の両コンフィグを対象に試してみます。

以下に、試した Junipter Notebook を貼り付けます。

gist.github.com

コンフィグファイルの読み込みによって事前に検出できるため、クリティカルな問題が起こらないように実機投入前のチェックに利用できるのではないでしょうか。

関連エントリ

tekunabe.hatenablog.jp

[Batfish] ネットワーク名とスナップショット名の関係



これは Batfish Advent Calendar 2018 の2日目の記事です。



■ はじめに

ネットワークコンフィグ解析ツール Batfish は、ネットワーク機器のコンフィグファイルなどを読み込んで、 ACL や経路などの妥当性をチェックできます。

読み込みの際に、ネットワーク名とスナップショット名という単位が利用されます。1つのネットワークに対して、複数のスナップショットを作成できるという関係です。

f:id:akira6592:20181124150050p:plain

一つのネットワーク、一つのスナップショットだけを解析する場合は、あまり意識しなくても良いかもしれませんが、2つのスナップショット間の差分を検出したい等の場合は意識する必要があります。(例:ACLを変更する前後のスナップショットで差分を検出するsearchFilters

この記事では、ネットワーク名のスナップショット名の関係についてもう少し詳しくご紹介します。

なお、Batfish の概要については以下の記事を参照してください。 https://tekunabe.hatenablog.jp/entry/2018/10/25/batfish

※ docker イメージ batfish/allinone のイメージID 1aa82919f0ae を利用して動作確認しています。


■ 「ネットワーク」は論理的なグループ名

ネットワークとは、ルーターやリンク情報をまとめた論理的なグループです。

Batfish の Python クライアントである pybatfish では、bf_set_network にネットワーク名(任意)を指定します。


■ 「スナップショット」は一次的な状態の保存

スナップショットとは、以下の情報を読み込んで、一次的な状態として保存したものです。

pybatfish では、bf_init_snapshotに、上記の3情報をとまとめたディレクトリ(または ZIP ファイル)、スナップショット名(任意)を指定します。


■ 「ネットワーク」と「スナップショット」の関係をディレクトリ構造から探る

前述したように「ネットワーク」と「スナップショット」は、1つのネットワークに対して、複数のスナップショットを作成できるという関係です。

この関係は、pybatfish で、bf_set_network や、bf_init_snapshotを実行した時に Batfish 本体のコンテナ側に作成されるディレクトリやファイルから、詳細を探ることができます。

なお、コンテナ側に作成される各ディレクトリは、以下のようにホストにマウントしておくと、永続的に扱うことができます。

 docker run -it --privileged -v $(pwd)/data:/data -p 8888:8888 batfish/allinone

ネットワーク単位のディレクト

bf_set_network を実行すると、コンテナ側の /data/containers ディレクトリ配下に、ネットワーク単位のディレクトリが作成されます。 このネットワーク単位のディレクトリ名(ネットワークID)は、/data/containers/network_ids ディレクトリ配下の、 <ネットワーク名>.id というファイル名のテキストファイルの中に記載されています。

たとえば、ネットワーク名が example_network であれば、以下のようになります。

  • /data/containers/network_ids/example_network.id ファイル内に、ネットワークIDが記載される
  • /data/containers/<ネットワークID> ディレクトリがネットワーク単位のディレクト

スナップショット単位のディレクト

スナップショット単位のディレクトリは、ネットワーク単位のディレクトリの下に作成されます。

このスナップショット単位のディレクトリ名(スナップショットID)は、/data/containers/<ネットットワークID>/snapshot_ids ディレクトリ配下の、<スナップショット名>.id というファイル名のテキストファイルの中に記載されています。

たとえば、スナップショット名が example_spapshot1 であれば、以下のようになります。

  • /data/containers/<ネットワークID>/snapshot_ids/example_spapshot1.id ファイル内に、スナップショットIDが記載される
  • /data/containers/<ネットワークID>/snapshots/<スナップショットID> ディレクトリがスナップショット単位のディレクト

それぞれの関係まとめ

ネットワーク単位、スナップショット単位のディレクトリの関係をまとめると、以下のようになります。

f:id:akira6592:20181124150714p:plain

※以下の条件でスナップショットをとった例です。

  • ネットワーク名: example_network
  • スナップショット名: example_snapshot1、example_snapshot2


■ 名前を省略すると自動で名前がつけられる

リファレンスを見ると分かるように、bf_set_network のパラメーター name や、bf_init_snapshot のパラメーター name は必須ではありません。つまり、ネットワーク名やスナップショット名の指定は任意です。

たとえば、ネットワーク名の指定を省略して bf_set_network() のように実行すると、実行するたびに pcp5d5578e1-8289-4089-95ae-3ead1de3581epcp358f3dd4-e5db-452a-84f7-7d60ce62ad68 のようなネットワーク名が自動で付けられ、ネットワーク単位のディレクトリが作成されます。

スナップショット名も、省略して bf_init_snapshot("networks/example") のように実行すると、実行するたびに ss_d30ce36c-7829-4884-a7a3-575ccf0db272ss_22f03c3f-0cf3-41ff-90ef-8504baa445a4 のようなスナップショット名が自動で付けられ、スナップショット単位のディレクトリが作成されます。


■ まとめ

ネットワーク名とスナップショット名の関係を、ディレクトリ視点で確認してみました。 ディレクトリの構造を知っておくと、デバッグに役に立つかもしれませんので、何かのときに思い出していただければと思います。


参考

入門的なチュートリアル Notebook https://github.com/batfish/pybatfish/blob/master/jupyter_notebooks/Getting%20started%20with%20Batfish.ipynb

[Batfish/Ansible] Batfish と Ansible によるネットワークコンフィグ事前検証のウェビナーのまとめ



これは Batfish Advent Calendar 2018 の1日目の記事です。



先日、Ansible と Batfish を使ったネットワークコンフィグの事前検証についてのウェビナーがあり、Ansible 公式サイトに動画も公開されました。 この記事では、動画の内容のまとめと補足をしたいと思います。

なお、Batfish とは、ネットワークコンフィグの検証ツールです。概要については以下の記事を参照してください。

[Batfish] ネットワーク機器のコンフィグを読み込んでルーティングなどの様々な検証ができるツール「Batfish」の紹介 - てくなべ (tekunabe)


ソース

動画の内容の詳細については以下のソースを参照してください。

動画

www.ansible.com

スライド (PDF)

https://www.ansible.com/hubfs/2018_Content/Ansible-Intentionet-Webinar-Slides.pdf

デモ Playbook 一式

https://github.com/batfish/ansible-demo



以下、内容

■ Part I Network validation today

(P6) Batfish とは

  • 包括的なネットワーク検証ソリューション
  • Apache 2.0 License の OSS

(P7) なぜこのようなツールが必要か?

  • 自動化がスケールラビリティやスピードが得られる
  • しかし、ちょっとしたミスでも影響が大きい
  • そのため、ワークフローには自動化された効果的な変更の検証が重要

(P8) 効果的な変更の検証とは?

  • プロアクティブ
    • 事前、自動的な検証
  • 包括的
    • 商用環境スケール、すべての障害時経路の検証

(P9-) こんにちの検証方法の比較

テキスト解析

  • コンフィグのテキストをチェックする
  • 確認できる例
    • NTPサーバー、DNSサーバーなどが設定さているか
  • 事前検証可能か: ○
  • 包括的か: ×
    • ネットワークの振る舞いを検証できない

エミュレーション

  • VM などによるネットワーク環境のシミュレーション環境を準備して行うチェック
  • 確認できる例
    • BGPセッションが確率されているか、
    • テストクライアントが DNS サーバーに到達できるか
    • リンク障害時にどうなるか
  • 事前検証可能か: ○
  • 包括的か: ×
    • 商用環境スケールにならない、すべての障害経路はテストできない

Operational State Analysis

  • 実環境での確認
  • 確認できる例
    • BGPセッションが確率されているか
    • テストクライアントが DNS サーバーに到達できるか
    • traceroute は想定通りか
  • 事前検証可能か: ×
  • 包括的か: ×
    • すべての障害経路はテストできない

事前検証可能、かつ包括的な検証方法がなかっため、新しいアプローチが必要。

モデルベース検証

  • Batfish で可能なタイプの検証アプローチ
  • 確認できる例
    • サブネットAからBへのフローはあるか
    • すべてのクライアントが DNS サーバーに到達できるか
    • 特定のサービスを中断させるリンク障害はあるか
  • 事前検証可能か: ○
  • 包括的か: ○



■ Part II Comprehensive pre-commit validation with Batfish

(P16) Batfish とは?

内部処理

  • Cisco、Juniper、Arista、PaloAlto などの機器のコンフィグを読み込み
  • ベンダーニュートラルなコンフィグモデルを生成
  • ルーティングモデルを生成
  • ネットワークの振る舞いのモデルを生成

なにをテストできるか

    • すべての機器がパスワードで保護されていること
    • 通信不可能な箇所
    • 可用性を低下させる機器障害

(P18) Batfish Network Policies

Security

  • 通信できてはいけないトラフィックがないこと
  • 暗号化されていること

Reliability

  • 単一リンク障害で停止しないこと

Compliance

  • 機器へのアクセスが安全な通信のみに制限されていること
  • 未定義の設定がないこと

(P20) Batfish の活用方法

  • ネットワーク CI/CD パイプラインへの組み込み
  • シナリオテスト



■ Part III Demo of Ansible + Batfish

(P22-) デモシナリオ

  • シナリオ1
    • DC ファブリックに新たなリーフスイッチを追加する
  • シナリオ2

(P23) シナリオ1: リーフスイッチの追加

AS番号 65003 を利用するリーフスイッチ leaf-03 を追加する。

流れ

  1. ユーザーからの入力
    • リーフスイッチの名前
    • POD ID
    • BGP AS番号
  2. Jinja2 テンプレートによるコンフィグ生成
  3. git コミット
  4. Batfish による検証
    • NTPサーバーの設定、未定義の参照がないか、BGP設定が正しいかなど
  5. 検証結果を S3 に記録
  6. Slack へ通知

デモ

(詳細は動画の 20:35 頃からご覧ください)

最初の実行

意図的に、すでに利用されている AS番号(65002)を新しいリーフスイッチで利用しようとしたため、Badfish が FAIL という結果を返す。

実行コマンド
ansible-playbook -i playbooks/inventory playbooks/master.yml --tags "create, git, s3, slack"
実行する Playbook (playbooks/master.yml)

https://github.com/batfish/ansible-demo/blob/master/playbooks/master.yml

2回目の実行

AS 番号を修正(65003)して OK に。

シナリオ1 のまとめ

入力された AS 番号の間違いを Batfish で検出できた。

(P27) シナリオ2: サービスの有効化

シナリオ1 で追加したリーフスイッチ leaf-03 配下のホスト向けに、TCP/80 を許可するポリシーを追加する。 Provably safe ACL and firewall rule changes と同様の 検証。

流れ

  1. ユーザーからの入力 (シナリオ1と異なり、入力パラメータはコンフィグ生成ではなく、検証目的で利用される)
    • 対象の FW はどこか
    • 検証したいポリシー(送信元IP、宛先IP、宛先ポート)
  2. Jinja2 テンプレートによるコンフィグ生成
  3. git コミット
  4. Batfish による検証
    • シナリオ1と同様の検証に加えて、今回の変更固有の検証
      • すでに設定済みのポリシーでないこと
      • 仕様が満たされること
      • 既存のフローに意図しない影響がないこと
  5. 検証結果を S3 に記録
  6. Slack へ通知

デモ

(詳細は動画の 24:40 頃からご覧ください)

最初の実行

permit tcp any 10.1.5.0 0.0.0.63 eq 80 を追加した candidate config に対して、意図通りのポリシーになるかチェックするために以下のパラメーターを入力(最初の実行と同じ)

  • 送信元アドレス: 0.0.0.0/0
  • 宛先アドレス: 10.1.5.0/27
  • 宛先ポート: TCP/80
検証1: すでに設定済みのポリシーでないこと (OK)

f:id:akira6592:20181114155652p:plain

検証2: 要件が満たされること (OK)

f:id:akira6592:20181114155710p:plain

検証3: 既存のフローに意図しない影響がないこと (NG)

f:id:akira6592:20181114155736p:plain

入力した 10.1.5.0/27 に対して、candidate config の 10.1.5.0 0.0.0.63 (/26) の範囲が広すぎるため、エラーとなる。 例として、10.1.5.32 TCP/8010.1.5.0/27 の範囲外) へのフローが、意図せず 許可されることが示される。

検出の仕組み

ポイントは playbooks/validate_acl_change.yml の question3に対応するタスク

- name: "Checking: {{ question3 }}"
  batfish_searchfilters:
    name: "{{ bf_base_snapshot }}"
    reference_snapshot: "{{ bf_candidate_snapshot }}"
    network: "{{ bf_network }}"
    filters: "{{ filters }}"
    nodes: "{{ nodes }}"
    source_ips: "{{ source_ips }}"
    destination_ips: "{{ destination_ips }}"
    ip_protocols: "{{ ip_protocols }}"
    destination_ports: "{{ destination_ports }}"
    invert_search: yes
  register: answer3
  tags:
    - always

ACLエントリ追加前のコンフィグのスナップショットと、追加後の candidate config の違いを抽出しています。 抽出する条件は、ユーザーによって入力されたポリシー(送信元IP、宛先IPなど)の範囲外(invert_search: yes)です。 これにより、意図しないポリシー(今回の場合、広すぎるプレフィックスによる許可)検出できることになります。

なお、 batfish_searchfilters モジュールと、内部で呼び出されている [pybatfish](https://github.com/batfish/pybatfish) の主なパラメータの対応は以下の通りです。

項目 batfish_searchfilters pybatfish
検証スナップショット名 name pybatfish.client.commands.bf_get_answersnapshot
比較対象スナップショット名 reference_snapshot pybatfish.client.commands.bf_get_answerreference_snapshot
入力ポリシーの範囲外を検証するかどうか invert_search pybatfish.question.bfq.searchfiltersinvertSearch
宛先IPアドレス destination_ips pybatfish.datamodel.flow.HeaderConstraintsdstIps
実行コマンド
ansible-playbook -i playbooks/inventory playbooks/maste_acl.yml --tags "create, git, s3, slack"
実行する Playbook (playbooks/master_acl.yml)

https://github.com/batfish/ansible-demo/blob/master/playbooks/master_acl.yml

2回目の実行

ワイルドカードマスクを修正した condidate config permit tcp any 10.1.5.0 0.0.0.31 eq 80 に対して、意図通りのポリシーになるかチェックするために以下のパラメーターを入力(最初の実行と同じ)

  • 送信元アドレス: 0.0.0.0/0
  • 宛先アドレス: 10.1.5.0/27
  • 宛先ポート: TCP/80
(再)検証2: 仕様が満たされること (OK)

f:id:akira6592:20181114155710p:plain

(再)検証3 :既存のフローに意図しない影響がないこと (OK)

f:id:akira6592:20181114155813p:plain

正しくワイルドカードマスクに修正され、要件を満たし、意図しない影響もないため OK になった。

シナリオ2 のまとめ

部分的に正しいかったような、とても見つけにくいエラーを Batfish で検出できた。



■ (P30) まとめ

  • 自動化は効果的な検証なしではリスキー
  • Batfish は、包括的な事前検証が可能