てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] VyOS モジュール利用のことはじめ

はじめに

Ansible は VyOS にも対応していて、設定の変更や、各種 show コマンドの実行による情報取得ができます。

この記事では、VyOS モジュールを利用するためのインベントリファイルの作成、認証情報の定義などの準備と、簡単な show コマンドを実行するサンプルをご紹介します。


  • 動作確認環境
    • Ansilbe 2.9.6
    • VyOS Vagrant Box higebu/vyos
      • 手軽に試せる Box を用意いただきありがとうございます。

【目次】


■ VyOS モジュールの基本

具体的なサンプルを紹介する前に、少しだけ VyOS モジュールの基本的なことを紹介します。

モジュールの例

Ansible 2.9 現在、15個の VyOS 用のモジュールがあります(非推奨除く)。

いくつか概要を紹介します。

モジュール名 概要 備考
vyos_command 主に show 系のコマンドを実行
vyos_config configure 後に設定するコマンドを実行
vyos_interfaces 基本的なインターフェース設定(有効/無効、descriptionなど ) Ansible 2.9 で追加。以前のバージョンでは、vyos_interface が利用可
vyos_l3_interfaces L3レベルのインターフェース設定(IPアドレスなど) Ansible 2.9 で追加。以前のバージョンでは、vyos_l3_interface が利用可
vyos_user ユーザーの作成、削除など

各モジュールの説明ページには、オプションの説明や使用例が掲載されています。

今回は、show version コマンドを実行するため、vyos_command モジュールを利用します。

接続・認証情報の指定方法

各 VyOS モジュール共通で定義が必要な、接続や認証情報については、各モジュールの説明ページに掲載されていません。

これらの情報は、以下の VyOS Platform Options というページに掲載されています。

docs.ansible.com

利用例はこの記事のあとでも紹介します。


■ 想定構成

以下の構成、を想定します。

  • Ansible から VyOS の機器へは SSH 接続可能
  • VyOS の機器の IP アドレスは 10.0.0.254


■ 各種ファイルの作成

今回は、以下のような構成で、ファイル、ディレクトリを作成します。

.
├── group_vars    # グループ変数定義ファイル格納ディレクトリ
│   └── vyos.yml  # vyos グループ変数定義ファイル
├── inventory.ini # インベントリファイル
└── show.yml      # show コマンド実行 Playook

インベントリファイルの作成

まずは、接続先の情報を記載するインベントリファイルを作成します。

  • inventory.ini
[vyos]
vyos1 ansible_host=10.0.0.254

意味は以下のとおりです。

  • vyos グループがある
  • vyos グループ内に、ホスト vyos1 が定義されている(Ansibleが扱う便宜上の名前)
  • ホスト vyos1 に接続するための IP アドレスは 10.0.0.254
    • もし、Ansible が vyos1 を名前解決できる場合は、ansible_host の指定不要

なお、デフォルトでは SSH 接続にポート 22/TCP を利用します。もし、環境の都合でそれ以外のポートで VyOS に接続する場合は、ansible_port 変数で指定します。

[vyos]
vyos1 ansible_host=10.0.0.254 ansible_port=2222

変数定義ファイル

次に、vyos グループ共通で利用する変数を定義するファイルを作成します。

group_vars/グループ名.yml というパスで定義しておくと、そのグループに所属するホスト共通のグループ変数になります。vyos グループの変数であれば、group_vars/vyos.yml というファイルに名にします。

内容は、接続の方式や、認証情報を定義します。

  • group_vars/vyos.yml
---
ansible_network_os: vyos          # ネットワークOS
ansible_connection: network_cli   # 接続方式
ansible_user: test_user           # ユーザー名
ansible_password: test_passwrod   # パスワード

各変数について説明します。

変数名 概要 備考
ansible_network_os Ansible が、どのネットワークOSを対象とするか認識するための指定。VyOS が対象であれば vyos  ansible_network_os で指定する値の一覧はこちら
ansible_connection 接続方式の指定。Ansible が内部でSSH でログインして CLI 操作するタイプは network_cli ネットワークOSと接続方式の対応表はこちら
ansible_user VyOS にログインするユーザー名
ansible_password VyOS にログインするパスワード

なお、この記事では、説明を簡単にするために ansible_password に平文を指定していますが、実際に利用する場合は、ansible-vaultや、Ansible Tower の Credential 機能などで暗号化を検討してください。

また、パスワード認証ではなく、公開鍵暗号方式で認証する場合は、ansible_password 変数の代わりに、ansible_private_key_file 変数で秘密鍵ファイルのパスを指定します。

ansible_private_key_file: ~/.ssh/id_rsa 

Playbook

次は、実際の処理内容を定義する Playbook を作成します。

---
- hosts: vyos            # 対象を指定(実際は vyos1 1台)
  gather_facts: false

  tasks:
    - name: show version   # (1) show version を実行するタスク
      vyos_command:
        commands:
          - show version
      register: result_version  # コマンド実行結果を変数に保存
    
    - name: debug version   # (2) show version の結果を表示するタスク
      debug:
        msg: "{{ result_version.stdout_lines[0] }}"

各タスクについて説明します。

(1) show version を実行するタスク

vyos_command モジュール を利用して、show version コマンドを実行するタスクです。

実行するコマンドは、commands オプションにリスト形式で指定します。リスト形式なので、複数commandの指定もできます。

コマンド実行結果は、register ディレクティブを利用して、変数 result_version に格納します。

(2) show version の結果を表示するタスク

debug モジュール を利用して、コマンド実行結果を画面に表示するタスクです。

コマンド実行結果は、前のタスクで、変数 result_version に格納したので、result_version を利用します。

実際は、result_version には付加情報が含まれています。コマンド実行結果そのものは、result_version.stdoutresult_version.stdout_lines の中にあります。

上記 Playbook で指定している result_version.stdout_lines[0] の意味は以下のとおりです。

  • stdout_lines には、コマンド実行結果が1行1要素のリストとして格納される
    • 一方 stdout には、改行コードを含めてそのまま格納される
  • stdout_lines[0][0] は、vyos_command モジュールの commadns の1番目に指定したコマンド(ここでは show version)の結果が格納される
    • もし、2番目にも show コマンドを指定した場合は、stdout_lines[1] に格納される


■ 実行

いよいよ Playbook の実行です。

Playbook の実行は、ansible-playbook コマンドを利用します。

-i オプションで、作成したインベントリファイル inventory.ini を指定します。

そのあとに、作成した Playbook show.yml を指定します(実際は順番は関係ないですが)。

$ ansible-playbook -i inventory.ini show.yml 

PLAY [vyos] ******************************************************************************************************

TASK [show version] **********************************************************************************************
ok: [vyos1]

TASK [debug version] *********************************************************************************************
ok: [vyos1] => {
    "msg": [
        "Version:      VyOS 1.1.7",
        "Description:  VyOS 1.1.7 (helium)",
        "Copyright:    2016 VyOS maintainers and contributors",
        "Built by:     maintainers@vyos.net",
        "Built on:     Wed Feb 17 09:57:31 UTC 2016",
        "Build ID:     1602170957-4459750",
        "System type:  x86 64-bit",
        "Boot via:     image",
        "Hypervisor:   KVM",
        "HW model:     VirtualBox",
        "HW S/N:       0",
        "HW UUID:      1CF07A22-373F-4D2D-B66A-BDA33E71AA02",
        "Uptime:       04:45:02 up  3:48,  2 users,  load average: 0.00, 0.01, 0.05"
    ]
}

PLAY RECAP *******************************************************************************************************
vyos1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

無事に show version コマンドの結果が表示されました。


■ [少し応用編] コマンド実行結果をファイルに出力する

少しだけ応用した Playbook の紹介です。先程は コマンド実行結果を画面に表示する Playbook でした。今度は、画面ではなくファイルに出力してみます。コマンドを show configuration に差し替えれば、コンフィグのバックアップとしても利用できす。

Playbook 作成

---
- hosts: vyos
  gather_facts: false

  tasks:
    - name: show version
      vyos_command:
        commands:
          - show version
      register: result_version
    
    - name: save to file
      copy:
        content: "{{ result_version.stdout[0] }}"
        dest: "show_version.log"

先程の Playbook と異なる点は、2個目タスクで copy モジュールを利用している点です。

content オプションで、ファイルの元ネタ、つまりコマンド実行結果を含む変数を指定します。ファイルには、改行コード含めて出力するため、stdout_lines[0] ではなく stdout[0] と指定します。

dest オプションで、出力先のファイル名を指定します。ちょっとした工夫として、ファイル名の頭にインベントリ名(今回は vyos1)を付加します。

Playbook 実行

$ ansible-playbook -i inventory.ini show_to_file.yml 

PLAY [vyos] *******************************************************************************************************

TASK [show version] ***********************************************************************************************
ok: [vyos1]

TASK [save to file] ***********************************************************************************************
changed: [vyos1]

PLAY RECAP ********************************************************************************************************
vyos1                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

確認

出力されたファイルの内容を確認します。

$ cat vyos1_show_version.log 
Version:      VyOS 1.1.7
Description:  VyOS 1.1.7 (helium)
Copyright:    2016 VyOS maintainers and contributors
Built by:     maintainers@vyos.net
Built on:     Wed Feb 17 09:57:31 UTC 2016
Build ID:     1602170957-4459750
System type:  x86 64-bit
Boot via:     image
Hypervisor:   KVM
HW model:     VirtualBox
HW S/N:       0
HW UUID:      1CF07A22-373F-4D2D-B66A-BDA33E71AA02
Uptime:       05:03:19 up  4:06,  2 users,  load average: 0.00, 0.01, 0.05

無事に出力されました。


■ おわりに

Ansible で VyOS を操作するための取っ掛かりになりそうな情報をまとめました。 今後、VyOS を対象にして、もう少し的をしぼった内容があれば、また投稿しようと思います。

参考

book.mynavi.jp