Ansibleによる運用自動化について

$Date: 2021/04/09 05:08:08 $


概要

「Ansible」とは、米国Red Hat社が開発するオープンソースの構成管理ツールです。

ヤマハでは、ヤマハネットワーク機器(※対象機種は後述)をAnsibleで制御するためのモジュールをAnsible Galaxyにて公開しています。

Ansibleを活用することにより、コンフィグバックアップのような定型的な作業を自動化したり、CIツールと連携してイベントドリブンで設定変更したりすることができます。

本ドキュメントでは、ヤマハから公開しているAnsibleモジュールの使い方について説明します。


用語の定義

コレクション (Collection)

モジュールやプラグインなどを含むAnsibleコンテンツ配布形式

プレイブック (Playbook)

ユーザーが実行したい処理を記述するYAML形式のファイル

モジュール (Module)

プレイブックの中で利用できる処理ユニット

インベントリー (Inventory)

操作対象機器のIPアドレスやホスト名(FQDN)を記述するファイル

コントロールノード

Ansibleを実行する端末

ターゲットノード

操作対象の機器


対応機種とファームウェアリビジョン

以下の機種およびファームウェアで、ヤマハAnsiblモジュールに対応しています。

Ansible Collection 機種 ファームウェア
rtx vRX Rev.19.00.01以降
RTX5000 Rev.14.00.08以降
RTX3500 Rev.14.00.08以降
RTX830 Rev.15.02.01以降
NVR510 Rev.15.01.02以降
NVR700W Rev.15.00.02以降
RTX1210 Rev.14.01.05以降
FWX120 Rev.11.03.02以降
NVR500 Rev.11.00.06以降

使用方法

Ansibleのインストール方法からヤマハAnsibleモジュールを用いてヤマハネットワーク機器を操作するまでの流れを説明します。

説明で使用する構成は以下の通りです。

種別 ソフトウェア/ルーター バージョン
コントロールノード OS Ubuntu Desktop 20.04 LTS
Ansible 2.10.0
Python 3.8.2
ターゲットノード RTX1210 Rev.14.01.36

Ansibleのインストール

Ansibleのインストール手順はOSや環境によって異なります。

公式ドキュメントなどを参考に、 AnisbleをインストールするPC(以下、コントロールノード)の環境に合わせて適切な方法でインストールしてください。

Ansibleネットワークモジュールでは、デフォルトでPython SSHクライアントライブラリの「paramiko」が必要になるため併せてインストールしてください。

インストール時は、コントロールノードがインターネットに接続できる状態であることを確認してください。

Collectionのインストール

ヤマハのAnsibleモジュールはAnsible Galaxyでコレクションとして配布されています。

コントロールノードでAnsible Galaxyコマンドを実行してコレクションをインストールしてください。

  1. ansible-galaxy collection installコマンドで「rtx」コレクションをインストールします。
      $ ansible-galaxy collection install yamaha_network.rtx
    

インベントリの作成

ターゲットホストを指定するために「inventory」ファイルを作成します。

テキストエディタで「inventory」ファイルを作成し、以下の内容を入力してください。

プレイブックの作成

ターゲットホストの処理内容を指定するためのプレイブックをYAML形式で作成します。

ここでは、CollectionのREADME.mdに記載されているSample Playbookを使用します。

テキストエディタで「rtx.yml」ファイルを作成し、Sample Playbookの内容をコピー&ペーストしてください。

rtx_commandモジュールは、show系コマンドなど実行系コマンドを実行するためのモジュールです。

rtx_configモジュールは、設定系コマンドを実行するためのモジュールです。

RTX1210の設定

コントロールノードはSSHでターゲットノードに接続するため、ターゲットノードでSSHサーバー機能を有効にする必要があります。

以下の手順でRTX1210の設定を行ってください。

ユーザー名やパスワードは「rtx.yml」で指定したパラメーターと一致させてください。

  1. administrator passwordコマンドで管理パスワードの設定を行います。管理者権限が必要な操作を行う場合に必要です。
    # administrator password become_password
  2. login user コマンドで名前ありユーザを登録します。SSH ではログイン時のユーザ名の入力が必須となるため、事前に必ず名前ありユーザを登録しなければなりません。
    # login user username password
  3. sshd host key generate コマンドで SSH サーバーのホスト鍵を生成します。このコマンドによって DSA または RSA の公開鍵、および秘密鍵のペアが生成されます。ただし機種によってはこのコマンドの処理に数十秒ほど時間がかかる場合があります。
    # sshd host key generate
  4. sshd service コマンドで SSH サーバー機能を有効にします。
    # sshd service on
  5. 最後にコントロールノードからターゲットノードにSSH接続できることを確認してください。接続できない場合は暗号アルゴリズムの設定等を見直してください。

実行

最後にプレイブックを実行します。

コマンド実行時は、ディレクトリ構成とファイル配置に注意してください。

この例では「inventory」ファイルと「rtx.yml」ファイルをカレントディレクトリに配置しています。

  1. ansible-playbookコマンドでプレイブック「rtx.yml」を実行します。
    $ ansible-playbook -i inventory rtx.yml
    
    PLAY [RTX1210] *****************************************************************************************************************************
    
    TASK [Gathering Facts] *********************************************************************************************************************
    ok: [192.168.100.1]
    
    TASK [get configuration] *******************************************************************************************************************
    ok: [192.168.100.1]
    
    TASK [set description] *********************************************************************************************************************
    changed: [192.168.100.1]
    
    PLAY RECAP *********************************************************************************************************************************
    192.168.100.1              : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    
    

実行例

Ansibleの実行例を紹介します。

実行例で使用されている backup オプションや save_when オプションなど詳細については、GitHubで公開されている README.md を参照してください。

シナリオ1: 3台のルーターのコンフィグのバックアップを定期的に取得する

RTX1210, RTX830, NVR510のコンフィグファイルを毎日 8:00 にバックアップします。

この例ではAnsibleのcronモジュールを使用してcrontabを設定することで定期実行していますが、JenkinsなどのCIツールと連携して運用することも可能です。

構成とサンプルファイルは以下のとおりです。

  1. 「inventory」ファイルを作成します。
    RTX1210, RTX830, NVR510それぞれのホスト名、IPアドレス、ユーザー名、パスワード、管理パスワードを登録します。
    [routers:children]
    RTX1210
    RTX830
    NVR510
    
    [RTX1210]
    rtx1210 ansible_host=192.168.100.1 ansible_user=username1 ansible_password=password1 ansible_become_password=become_password1
    
    [RTX830]
    rtx830 ansible_host=192.168.100.2 ansible_user=username2 ansible_password=password2 ansible_become_password=become_password2
    
    [NVR510]
    nvr510 ansible_host=192.168.100.3 ansible_user=username3 ansible_password=password3 ansible_become_password=become_password3
    
  2. cronで自動実行するプレイブック「backup_config.yml」を作成します。
    backupオプションを使用することで、ターゲットノードのコンフィグを保存することができます。
    ---
    - hosts: routers
      collections:
        - yamaha_network.rtx
      connection: network_cli
      gather_facts: false
    
      tasks:
      - name: get configuration
        rtx_config:
          backup: yes
    
      vars:
        ansible_network_os: yamaha_network.rtx.rtx
        ansible_user: username
        ansible_ssh_pass: password
        ansible_become: true
        ansible_become_password: become_password
    
    
  3. crontabを設定するプレイブック「set_crontab.yml」を作成します。
    jobの実行パスはお使いの環境に合わせて指定してください。
    ---
    - hosts: localhost
      gather_facts: false
    
      tasks:
        - name: set crontab
          cron:
            name: backup_config
            minute: "0"
            hour: "8"
            job: "/usr/bin/ansible-playbook -i /YOUR_INVENTORY_PATH/inventory /YOUR_YAML_PATH/backup_config.yml"
    
  4. RTX1210, RTX830, NVR510のそれぞれでIPアドレスとSSHサーバー設定を行います。
    以下の例はRTX1210の設定例です。設定後、コントロールノードからRTX1210, RTX830, NVR510それぞれにSSH接続できることを確認してください。
    # ip lan1 address 192.168.100.1/24
    # administrator password become_password1
    # login user username1 password1
    # sshd host key generate
    # sshd service on
    
  5. コントロールノードでプレイブックを実行してスケジュールを設定します。
    この例では毎日8時にコンフィグがバックアップされます。
    $ ansible-playbook set_crontab.yml
    
    PLAY [localhost] ***************************************************************************************************************************
    
    TASK [set crontab] *************************************************************************************************************************
    changed: [localhost]
    
    PLAY RECAP *********************************************************************************************************************************
    localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    
    $ crontab -l
    
    #Ansible: backup_config
    0 8 * * * /usr/bin/ansible-playbook -i /YOUR_INVENTORY_PATH/inventory /YOUR_YAML_PATH/backup_config.yml
    
    (スケジュール実行後)
    
    $ ls
    backup  backup_config.yml  inventory  set_crontab.yml
    
    $ ls backup/
    nvr510_config.2020-07-07@08:00:32  rtx1210_config.2020-07-07@08:00:30  rtx830_config.2020-07-07@08:00:31
    

シナリオ2: IPv6でアクセスしてSYSLOGレベルを変更する

RTX1210にIPv6でアクセスし、syslog info off コマンドと syslog debug on コマンドを設定します。

構成とサンプルファイルは以下のとおりです。

  1. 「inventory」ファイルを作成します。
    この例ではIPv6グローバルアドレスを使用していますが、「fe80::1111:22ff:fe33:4444%NETWORK_IF」のようにリンクローカルアドレス指定も可能です。
    [RTX1210]
    2001::1
    
  2. SYSLOGの設定を行うプレイブック「set_syslog_debug.yml」を作成します。
    save_whenオプションを使用することで、設定前と設定後のコンフィグに差分がある場合のみRTX1210で保存処理が実行されます。
    ---
    - hosts: RTX1210
      collections:
        - yamaha_network.rtx
      connection: network_cli
      gather_facts: false
    
      tasks:
      - name: set syslog level
        rtx_config:
          save_when: changed
          lines:
            - syslog info off
            - syslog debug on
    
      vars:
        ansible_network_os: yamaha_network.rtx.rtx
        ansible_become: true
        ansible_user: username
        ansible_password: password
        ansible_become_password: become_password
    
  3. RTX1210でIPv6の設定を行います。RTX1210のLAN1のIPv6アドレスを 2001:DB8::1/64 に設定し、2001:DB8::/64 のプレフィックスをRAで広告します。
    コントロールノード側では、IPv6アドレスを有効にしてRAからIPv6アドレスを自動設定します。
    また、RTX1210にSSHサーバー設定を行います。設定後、コントロールノードからRTX1210にSSH接続できることを確認してください。
    # ipv6 lan1 address 2001:DB8::1/64
    # ipv6 prefix 1 2001:DB8::/64
    # ipv6 lan1 rtadv send 1
    # administrator password become_password
    # login user username password
    # sshd host key generate
    # sshd service on
    
  4. コントロールノードでプレイブックを実行して、RTX1210のSYSLOGレベルを変更します。
    $ ansible-playbook -i inventory set_syslog_debug.yml
    
    PLAY [RTX1210] *****************************************************************************************************************************
    
    TASK [set syslog level] ********************************************************************************************************************
    changed: [2001:DB8::1]
    
    PLAY RECAP *********************************************************************************************************************************
    2001:DB8::1                    : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    
    

コマンド