ヤマハ公式Ansibleモジュールでヤマハルータを操作する。（その１：モジュールのインストール）

# はじめに
先日、[ヤマハ](https://network.yamaha.com/)が[Ansible Galaxy](https://galaxy.ansible.com/)でヤマハのネットワーク機器を`Ansible`で制御するためのモジュールを公開しました。

- [Ansibleによる運用自動化について](http://www.rtpro.yamaha.co.jp/RT/docs/ansible/index.html)

これはさっそく使ってみなければと思い、試してみた結果を書き記します。

# ヤマハ公式モジュール
以下の**Ansible Galaxy**と**GitHub**のページにヤマハモジュールがあります。

- [Ansible Galaxyヤマハコレクションページ](https://galaxy.ansible.com/yamaha_network/rtx)
- [GitHubリポジトリ](https://github.com/yamaha-network)

`Ansible`の2.10以降の構成は今までの2.9以前のバージョンと構成が大きく異なり、ヤマハモジュールは2.10以降を前提に作成されているようなので、2.9以前では動作しません。

`dnf`や`apt`などOS標準のパッケージ管理ツールで`Ansible`をインストールする場合、インストールされるバージョンは2021年4月現在、2.9が最新となるため、ヤマハ公式モジュールを使用する場合、`pip`で最新バージョンの`Ansible`をインストールする必要があります。

# Ansibleインストール
今回は`CentOS 8.3`の最小構成のマシンに`Ansible`をインストールしてみます。

既に`Ansible`がインストールされているマシンにインストールする場合などは一度インストール済みの`Ansible`を削除して実行してください。

`pip`をアップグレード後、`pip`コマンドで`Ansible`をインストールすれば最新版がインストールできるはずです。

また、`paramiko`モジュールも必要となるため、一緒にインストールしておきます。

尚、全てroot権限で実行すること。

```shell:Ansibleのインストール
dnf install python3
pip3 install --upgrade pip
pip3 install ansible
pip3 install paramiko
```

`ansible --version`コマンドを実行し、以下のように2.10以上のバージョンが表示されれば問題ありません。

```shell:Ansibleバージョン確認
ansible 2.10.7
  config file = None
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.6/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.6.8 (default, Aug 24 2020, 17:57:11) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]
```

# ヤマハ公式モジュールのインストール
**Ansible Galaxy**のコレクションで配布されているモジュールをインストールします。

```shell:ヤマハ公式モジュールのインストール
ansible-galaxy collection install yamaha_network.rtx
```

### 2021/4/9追記
`yamaha_network.rtx`で利用する`ansible.netcommon`のバージョンが低いと差分比較処理がうまく動かないようなので、`ansible.netcommon`も更新しておきます。
※ちなみに私の場合、インストール済みだった`1.5.0`では想定通りの動きになりませんでした。

```shell:ansible.netcommon`コレクションのインストール
ansible-galaxy collection install ansible.netcommon
```

```shell:ansible.netcommon`コレクションインストール後の確認
ansible-galaxy collection list ansible.netcommon
```

```shell:コマンド結果
# /root/.ansible/collections/ansible_collections
Collection        Version
----------------- -------
ansible.netcommon 2.0.1

# /usr/local/lib/python3.6/site-packages/ansible_collections
Collection        Version
----------------- -------
ansible.netcommon 1.5.0
```

# 事前ssh接続
Playbookを実行する前に対象のヤマハ機器にsshで接続できるか確認しておきます。

フィンガープリントが表示された場合はyesで受け入れておきましょう。

```shell:ssh接続
ssh -l [一般ユーザ名] [IPアドレス]
```

# Ansible実行準備
[ヤマハ公式ページ](http://www.rtpro.yamaha.co.jp/RT/docs/ansible/index.html)を参考にインベントリファイルとPlaybookを作成します。

## インベントリファイルの作成
私が持っているヤマハ機器は「**NVR500**」のため、参考例から書き換えておきます。

```yml:インベントリファイルの作成（inventory）
[NVR500]
192.168.100.1
```

## Playbookの作成
ホスト名のみ書き換えていますが、公式の例そのままコピペ。

`ansible_become_password`は**Administrator**になる際のパスワードを入力します。

```yml:修正したPlaybook（rtx.yml）
---
- hosts: NVR500
  connection: network_cli

  tasks:
    - name: get configuration
      yamaha_network.rtx.rtx_command:
        commands:
        - show config
      register: result

    - name: debug
      debug:
        msg: "{{ result.stdout_lines[0] }}"

    - name: set description
      yamaha_network.rtx.rtx_config:
        lines:
          - description 1 yamaha

  vars:
    ansible_network_os: yamaha_network.rtx.rtx
    ansible_user: [一般ユーザ名]
    ansible_ssh_pass: [一般ユーザパスワード]
    ansible_become: true
    ansible_become_password: [Administratorパスワード]
```

# Playbookの実行
以下を実行し、実行結果でヤマハ機器のコンフィグが出力されれば成功です。

```shell:Playbookの実行
ansible-playbook -i inventory rtx.yml
```

# おわりに
ヤマハ機器を使っている企業は多いかと思うので、公式モジュールで自動化できるのはありがたいですね。

モジュール自体はまだ`Ansible`を介してコマンド実行するモジュールしかないため、設定を行う場合、**どこまで冪等性が保てるか**という問題はありますが、例で紹介されていたコンフィグバックアップ等、運用系の作業をコード化するのに有用だと感じます。

今までサーバに`Expect`入れて無理やりコンフィグ採取シェル等書いて作業していたことを考えると、ヤマハ機器へのログイン処理を考えなくて済むだけでもありがたい！

次回は公式モジュールで何をどこまでできるかを色々試してみたいと思います。