てくなべ (tekunabe)

ansible / network automation / 学習メモ

書籍「[改訂第3版]Jenkins実践入門」を購入しました

本日5/24に、Jenkins実践入門の第3版が発売されましたので購入してきました。

gihyo.jp

まだ読んでいませんが、大きな特徴は Jenkins 2系に対応していることだと思います。
特に Jenkins 2.0 から正式に搭載された Pipeline については「第10章 Pipelineの設定」という章でで20ページ余りを割いて紹介されています。なお、Scripted Pipeline ではなく、2017年2月にGAとなったDeclarative Pipeline の解説となっています。

参考
www.kaizenprogrammer.com


少々おおざっぱではありますが、前の版(2015年6月発売)との見出しレベルの差分をとりました。
比較しやすくするため、表記ゆれは調整しています。
正確な見出しは以下のページをご参照のうえ、比較してください。


【見出し差分】

追加/変更 第2版 追加/変更 第3版
変更 Windows Server 2012にインストールする 変更 Windows Server 2016にインストールする
追加 Dockerにインストールする
変更 Jenkinsをインストールせずにクラウドで使えるDEV@cloud by CloudBees 変更 Jenkins in the Cloud
変更 JDK/Ant/Mavenを自動的にインストールする 変更 JDK/Ant/Maven/Gitを自動的にインストールする
追加 Jenkins1系から2系へのアップデート
変更 SubversionからJenkinsのビルドをトリガーする 変更 GitからJenkinsビルドをトリガーする
変更 Subversionにプロジェクトデータを登録する 変更 GitHubにプロジェクトデータを登録する
変更 trunk,branches,tagsとは 変更 git-flow/GitHub Flow
追加 Column 単体テストフレームワーク
追加 Column カバレッジ測定ツール
追加 Column 静的コード解析ツール
変更 ビルドパイプラインの設定 変更 パラメータを指定してビルドする
変更 Build Pipeline Pluginのインストールと設定 変更 パラメータビルドとは
変更 ビルドパイプラインの設定 変更 パラメータビルドの設定
変更 ビルドパイプラインの実行 変更 上流ジョブのパラメータを下流ジョブに引継ぐ
追加 ビルドの手動実行
追加 ビルドの昇格
追加 Workflow Plugin
追加 Slackに通知する
追加 ChatOps/Hubot
追加 Pipelineの設定
追加 Jenkins Pipelineとは
追加 Jenkinsを設定するときの問題点
追加 Jenkins Pipelineによるコードによる設定
追加 Jenkins Pipelineの構文
追加 Pipelineを実行する
追加 Pipelineのインストールとジョブ作成
追加 Pipelineを実行する
追加 Pipelineの高度な設定をする
追加 Snippet GeneratorによるPipelineスクリプトの自動生成
追加 Pipelineの中で定義済みのジョブを呼び出す
追加 Pipelineを利用した並列処理
追加 SCMからPipelineスクリプトを読み込む
追加 Multibranch Pipelineでビルドする
追加 Shared Libraryでコードを共有する
追加 Column Blue Ocean
変更 分散ソースコード管理システムとの連携 変更 さまざまなソースコード管理システムと連携する
追加 Subversionとの連携
追加 Team Foundation Version Controlとの連携
変更 Mercurialと連携させる 変更 おすすめプラグイン「URL SCM plugin」
追加 Gitと連携させる
追加 Column おすすめプラグイン「URL SCM Plugin」
変更 マスターとスレーブとは 変更 マスターとビルドエージェントとは
変更 マスターとスレーブの4つの設定方法 変更 マスターとビルドエージェントの設定方法
変更 スレーブサーバとしてWindowsを利用する 変更 ビルドエージェントとしてWindowsを利用する
変更 スレーブサーバとしてLinuxMac OSを利用する 変更 ビルドエージェントとしてLinuxmacOSを利用する
変更 おすすめプラグイン「Jenkins MSBuild Plugin」 変更 Column おすすめプラグインMSBuild Plugin」
追加 ビルドエージェントとしてDockerコンテナを利用する
追加 Column コンテナとは? ~Docker
追加 ビルドの実行環境を制御する
追加 Column おすすめプラグイン「TextFinder Plugin」
変更 パッケージリポジトリによるパッケージ管理 変更 パッケージリポジトリと連携する
追加 Tracと連携させる
追加 Backlogと連携させる
追加 コンテナ仮想化 ~Docker
変更 安定して利用するための5つの運用管理 変更 安定して利用するための6つの運用管理
変更 Backup Pluginでバックアップする 変更 ThinBackup Pluginでバックアップする
追加 Jenkinsのエキスパートになる ~Jenkins認定試験

 

ここ最近、Jenkins の書籍は出版されていなかったので、買うのを控えていた方はこの機会に検討されてみてはいかがでしょうか。

Ansible でネットワーク機器のコマンド結果をパースしてくれるフィルタープラグイン「ansible_helpers」を試してみた

f:id:akira6592:20170521163508p:plain

■ はじめに

Ansible はCisco IOS や、Juniper JUNOSなど様々なネットワーク機器に対応するモジュールがあります。 show系のコマンドを実行して結果を取得することもできますが、取得した結果を良い感じにパースしてくれるフィルタープラグイン 「ansible_helpers」を見つけたので試してみます。

作者はnetmikoの作者でもある Kirk Byers (@ktbyers) さんです。

▼本プラグインを知るきっかけとなったツイート

 

■ 仕組み

google/textfsm というネットワーク機器のコマンドの結果をパースする python ライブラリと、 そのテンプレート集(networktocode/ntc-templates )を組み合わせているようです。

 

■ インストー

ktbyers/ansible_helpers にインストール手順が記載されていますので、その手順を参考にインストールします。

 

■ その1: show ip int brief で試す

まず、サンプルにあるように、Cisco IOSshow ip int brief コマンドを試してみます。

playbook

以下の playbook を用意します。

---
- name: parse sample
  hosts: cisco
  gather_facts: no
  connection: local


  vars:
    cli:   # 接続情報を辞書で定義(認証情報はインベントリファイルから取得)
      host:     "{{ inventory_hostname }}"    # ホスト対象ホスト
      username: "{{ ansible_user }}"          # ログインユーザー
      password: "{{ ansible_password }}"      # ログインパスワード

    platform: cisco_ios           # 対象機器プラットフォームの定義
    command: show ip int brief    # 実行コマンドの定義


  tasks:
    - ios_command:
        provider: "{{ cli }}"
        commands: "{{ command }}"
      register: output

    - name: parse output
      debug:
        msg: "{{ output | net_textfsm_parse(platform, command) }}"  # フィルター使用箇所

実行結果

以下のようにパースしてくれました。

[root@controller ~]# ansible-playbook cat_int.yml

PLAY [parse sample] ***************************

TASK [ios_command] *************************************************************
ok: [192.168.1.254]

TASK [parse output] ************************************************************
ok: [192.168.1.254] => {
    "msg": [
        {
            "intf": "GigabitEthernet1",
            "ipaddr": "10.0.0.51",
            "proto": "up",
            "status": "up"
        },
        {
            "intf": "GigabitEthernet2",
            "ipaddr": "10.0.2.1",
            "proto": "up",
            "status": "up"
        },
        {
            "intf": "GigabitEthernet3",
            "ipaddr": "unassigned",
            "proto": "up",
            "status": "up"
        },
        {
            "intf": "GigabitEthernet4",
            "ipaddr": "10.0.4.1",
            "proto": "up",
            "status": "up"
        }
    ]
}

PLAY RECAP *********************************************************************
192.168.1.254             : ok=2    changed=0    unreachable=0    failed=0

(参考) 実際のコマンド実行結果

ネットワーク機器自身でのコマンド実行結果は以下の通りです。

csr1#show ip int brief
Interface              IP-Address      OK? Method Status                Protocol
GigabitEthernet1       10.0.0.51       YES NVRAM  up                    up
GigabitEthernet2       10.0.2.1        YES NVRAM  up                    up
GigabitEthernet3       unassigned      YES NVRAM  up                    up
GigabitEthernet4       10.0.4.1        YES NVRAM  up                    up
csr1#

 

■ その2: show ip route編 で試す

続けて、例にはない show ip route も試してみます。

playbook

以下の playbook を用意します。(command の定義以外は先ほどと同じです)

---
- name: parse sample
  hosts: cisco
  gather_facts: no
  connection: local


  vars:
    cli:   # 接続情報を辞書で定義(認証情報はインベントリファイルから取得)
      host:     "{{ inventory_hostname }}"    # ホスト対象ホスト
      username: "{{ ansible_user }}"          # ログインユーザー
      password: "{{ ansible_password }}"      # ログインパスワード

    platform: cisco_ios           # 対象機器プラットフォームの定義
    command: show ip route        # 実行コマンドの定義


  tasks:
    - ios_command:
        provider: "{{ cli }}"
        commands: "{{ command }}"
      register: output

    - name: parse output
      debug:
        msg: "{{ output | net_textfsm_parse(platform, command) }}"  # フィルター使用箇所

実行結果

以下のようにパースしてくれました。

[root@controller ~]# ansible-playbook cat_route.yml

PLAY [parse sample] ***************************

TASK [ios_command] *************************************************************

ok: [192.168.1.254]

TASK [parse output] ************************************************************
ok: [192.168.1.254] => {
    "msg": [
        {
            "distance": "",
            "mask": "/24",
            "metric": "",
            "network": "10.0.2.0",
            "nexthopif": "GigabitEthernet2",
            "nexthopip": "",
            "protocol": "C",
            "type": "",
            "uptime": ""
        },
        {
            "distance": "",
            "mask": "/32",
            "metric": "",
            "network": "10.0.2.1",
            "nexthopif": "GigabitEthernet2",
            "nexthopip": "",
            "protocol": "L",
            "type": "",
            "uptime": ""
        },
        {
            "distance": "110",
            "mask": "/24",
            "metric": "2",
            "network": "10.0.3.0",
            "nexthopif": "GigabitEthernet2",
            "nexthopip": "10.0.2.2",
            "protocol": "O",
            "type": "",
            "uptime": "00:37:41"
        },
        {
            "distance": "",
            "mask": "/24",
            "metric": "",
            "network": "10.0.4.0",
            "nexthopif": "GigabitEthernet4",
            "nexthopip": "",
            "protocol": "C",
            "type": "",
            "uptime": ""
        },
        {
            "distance": "",
            "mask": "/32",
            "metric": "",
            "network": "10.0.4.1",
            "nexthopif": "GigabitEthernet4",
            "nexthopip": "",
            "protocol": "L",
            "type": "",
            "uptime": ""
        },
        {
            "distance": "110",
            "mask": "/32",
            "metric": "3",
            "network": "10.10.10.10",
            "nexthopif": "GigabitEthernet2",
            "nexthopip": "10.0.2.2",
            "protocol": "O",
            "type": "",
            "uptime": "00:37:41"
        }
    ]
}

PLAY RECAP *********************************************************************
192.168.1.254             : ok=2    changed=0    unreachable=0    failed=0

(参考) 実際のコマンド実行結果

ネットワーク機器自身でのコマンド実行結果は以下の通りです。

csr1#sh ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       a - application route
       + - replicated route, % - next hop override, p - overrides from PfR

Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 6 subnets, 2 masks
C        10.0.2.0/24 is directly connected, GigabitEthernet2
L        10.0.2.1/32 is directly connected, GigabitEthernet2
O        10.0.3.0/24 [110/2] via 10.0.2.2, 00:33:38, GigabitEthernet2
C        10.0.4.0/24 is directly connected, GigabitEthernet4
L        10.0.4.1/32 is directly connected, GigabitEthernet4
O        10.10.10.10/32 [110/3] via 10.0.2.2, 00:33:38, GigabitEthernet2

csr1#

■ まとめ

パース処理のキモとなる Pythonライブラリである TextFSM 自身は以前からもありましたが、 Python のプログラム内ではなく、Ansible と連携して使いたいという時には、 この ansible_helpers が便利なのではないでしょうか。

また、TextFSMのテンプレート集には、 Cisco IOSだけでも 30 以上あります。パース処理は自力で作るとなかなか大変ですので、ここにあるものを参考にするのも良いのではないでしょうか。

ネットワークプログラマビリティ勉強会(#npstudy) #12 参加メモ

2017/04/21 にIIJさんで行われたネットワークプログラマビリティ勉強会 #12に行ってきました。ちょっとしたことですがメモを記録しておきます。


オープンソースコンテナネットワークプラグインContiv

感想

  • GUIがついていることに驚きました。

ネットワークエンジニアがニューラルネットワークやってみた

メモ

感想

  • 資料の中でも出てきましたが、ネットワーク的にはこの手の技術で障害予測ができると良いなと思いました。すでに事例があるかもしれません。

Microsoft Technology for ネットワークプログラマ

メモ

  • Bash on Windows の anniversary update で bash -c "ifconfig"のような形で直接bash側のコマンドを呼び出せる
    • 管理者権限なしで ping も打てるようになった
  • Visual Studio Code はクロスプラットフォーム対応の多機能エディタ
  • Power BI は ExcelAccess の間のようなツール
    • ログを取り込んで分析してきれいなダッシュボードで見せるといったことができる
    • ある程度のことは無料でできる。Office 365 のライセンスで、より高度な機能が利用できる

感想

  • Visual Studio Code は私もよく使っています。
  • Atomと比較すると拡張(パッケージ)は少ないですが、デフォルトである程度のことができて、軽いという印象があります。
  • Power BI はダッシュボードが魅力的に見えました。

Ansible for Network Engineer

メモ

  • Ansible の基礎、ARISTAの機器へのコンフィグ投入例、Ansibleハッカソンレポート
  • Ansible は、Chef/Puppetとは異なりエージェントレス
  • Playbookと呼ばれる設定構成ファイルをYAMLで記述する
  • Playbookはサッカーで例えると監督のようなもの(指示出し)
  • ARISTAの機器向けには、eos_commandeos_config などのモジュールが標準である
  • 2017/02/09 - 11 に沖縄オープンラボでAnsibleハッカソンが行われた
    • 失敗談やトラブルの共有は貴重なナレッジとなる
    • ansible-vault はパスワードを暗号化したい時に有効

感想

  • 私もAnsibleをネットワーク機器向けに使えるか色々試しているのですが、まだまだ情報が少ないので、このように発表してくださる方がいらっしゃって助かります。

「自動化と画面」を考えてみました

メモ

感想

  • 作りたいものがあるとき、機能を絞って簡単に試して捨てれるもの、かつ自分でも理解できるレベルのもの、といったポリシーが紹介されていたのが印象に残りました。

タブレットPCでルータを設定してみた with 二次元バーコードリーダ

メモ

  • コマンド類を二次元バーコード化して印刷した紙の手順をリーダで読んでOSPFを設定するデモ動画

感想

  • 発想力に脱帽です。「紙」の可能性の広がりを感じます。

全体を通して

今回初参加だったのですが、思ったよりもテーマが広くて自分にも身近に感じる内容がありました。 人気があって、参加枠に入るのが難しいのですが、次回もぜひ参加したいと思います。

会場提供や、運営、発表をしてくださった皆様、ありがとうございました。

オライリー「Infrastructure as Code」で印象に残ったポイント

先日、オライリー「Infrastructure as Code」の日本語版が発売されました。 www.oreilly.co.jp

副題にある通り「原則とプラクティス」をメインに書かれていて、特定のツールに依存しない内容になっています。 特に1章「課題と原則」は何度も読み直したくなる内容でした。(さらに言うと"1.2.1 Infrastructure as Code の目標" は壁に貼っておきたいような内容)

全体としては 「 予防より復旧 」が重要という印象をうけました。

一通り読んでみましたので、個人的に印象に残ったポイントをまとめます。

1. 大きな変更より小さな変更を日常的にする

  • 小さな変更のほうが失敗したときに問題を特定しやすく、戻しやすい。
  • 小さな変更のほうが確実に改善でき、モチベーションも保たれる。

2. システムを絶えず変更し、改良しているチームの方が大小の障害に対処できる力を持っている

  • "1.6 アンチフラジャイル:「堅牢」を超えて" からの引用。
  • 人体と同じように負荷、変更を避けると弱くなる。負荷、変更によって強化される。

3. 正しい設計は継続的に変化していく

  • "15.1 発展的なアーキテクチャ" からの引用。
  • 完全で「最終的な」設計にたどり着くことはない

4. 高速フィードバック

  • 誤りは早く検出、フィードバックさせることが品質を向上させる。
  • そのためにはモニタリングが重要。

5. 従来のインフラからマイグレーション時の注意点

  • 従来のパターンを当てはめようとすると、かえって複雑になる可能性があるため、今までの概念を破る必要がある。

6. おまけ:初めて聞いた言葉

「構成ドリフト」

  • 設定差異のこと。差異があること自体は悪くないが、管理できていなくてはならない。管理できていない差異はオートメーション恐怖症を生み出す。

スノーフレークサーバー」

  • 他と異なるサーバーのこと。なぜ異なるのか分からなかったり、再構築できない状態は問題である。

「システム疲労

  • 時間の経過でインフラが壊れていくこと。要因としては、脆弱性、ストレージの残容量など。

「フェニックス交換」

  • ブルー - グリーン 交換の進化形で、Immutable Infrastructure の基礎。

Infrastructure as Code の考え方を知るにとても良い本だと感じました。

Ansible でネットワーク機器を操作したい時に参考になりそうな日本語情報

はじめに

構成管理ツールのAnsible はCisco IOS、NX-OS、Juniper JUNOS、ARISTA、VyOS、等々のネットワーク機器に対応したモジュールもあります。

 参考:Network Modules一覧

しかし、比較的最近対応したためか、サーバー系のモジュールと比較すると情報が少ないです。特に日本語の情報が少ないです。 そこで、私が参考にさせていただいたページや、私がQiitaに書いてきたものも含め、日本語のページをまとめておきます。 Ansible 2.1 以降を利用した記事を中心にしています。

全般

ARISTA+α

Juniper JUNOS 系

Cisco IOS

Cisco NX-OS系

Fortigate (FortiOS)系

PaloAlto(PAN-OS)系

F5 系

アンテナを張っているモジュールに偏りがあるので、ほかにもまだ日本語情報があるかもしれません。 もし良い情報があれば、@akira6592 までご連絡いただければ幸いです。

ブログ始めました

はじめまして、akira6592 と申します。 ITエンジニアをしています。技術ネタを中心に書いていく予定です。 特にインフラ、ネットワーク、自動化に興味があります。 よろしくお願いいたします。