YAMAHAの公式Ansibleモジュールが公開されたので試してみる

10 min read読了の目安(約9100字

念願のAnsibleモジュール

先日Twitterでついに念願のヤマハのansibleモジュールが公開されたよう。

https://twitter.com/yamaha_sn/status/1376454701516906498?s=20

ヤマハ公式のドキュメント
ヤマハのansible github

というわけで自宅の環境で早速試してみることとする。

環境

  • コントロールノード

                                    ..,
                        ....,,:;+ccllll
          ...,,+:;  cllllllllllllllllll   wlinux2@hogehoge 
    ,cclllllllllll  lllllllllllllllllll   ------------------------------ 
    llllllllllllll  lllllllllllllllllll   OS: Pengwin on Windows 10 x86_64 
    llllllllllllll  lllllllllllllllllll   Kernel: 4.19.104-microsoft-standard 
    llllllllllllll  lllllllllllllllllll   Uptime: 11 days, 10 hours, 39 mins 
    llllllllllllll  lllllllllllllllllll   Packages: 926 (dpkg), 9 (brew) 
    llllllllllllll  lllllllllllllllllll   Shell: bash 5.1.4 
                                          Resolution: 3840x2160 
    llllllllllllll  lllllllllllllllllll   WM: X410 
    llllllllllllll  lllllllllllllllllll   Terminal: vscode 
    llllllllllllll  lllllllllllllllllll   CPU: AMD Ryzen 7 3700X (16) @ 3.593GHz 
    llllllllllllll  lllllllllllllllllll   Memory: 1654MiB / 25606MiB 
    llllllllllllll  lllllllllllllllllll
    
  • ターゲットノード
    FWX120 Rev.11.03.27 (Fri Apr 20 08:57:10 2018)

  • ディレクトリ

    とりあえず実験なのでトップディレクトリでやっているが、roleを使って出来るようにとりあえずこんな感じでおいてある。
    追加変数の都合でこのような形を取ってある。

    tree
    .
    ├── ansible.cfg
    ├── backup
    ├── group_vars
    │   ├── all.yml
    │   ├── vault.yml
    │   └── yamaha.yml
    ├── inventories
    │   ├── inventory
    ├── roles
    │   └── yamaha
    │       └── tasks
    │           ├── main.yml
    │           └── network_backup.yml
    ├── template
    │   └── yamaha
    │       └── 192.168.x.x_config.2021-03-30@13:14:23
    ├── network_backup.yml
    └── fwx120.yml
    

事前準備

まずAnsibleのインストールやら、ansible-galaxy でコレクションをいれたりparamikoをインストールなどはしておく。
また対象機器が古いく、opensshが新しい物だと(自分の環境だとOpenSSH_8.4p1 Debian-5, OpenSSL 1.1.1j 16 Feb 2021)ヤマハ機器へのSSHが出来ないので、.ssh/configでSSH接続の設定を入れておく。

config
Host FWX120
        HostName 192.168.x.x
        User ANSIBLE-USER
        KexAlgorithms +diffie-hellman-group1-sha1
        Ciphers +3des-cbc,aes128-cbc,aes192-cbc,aes256-cbc,

そのほかにターゲットノード側にSSHのユーザやパスワードなど設定をしておく。

config表示

接続確認まで出来たら公式にあるサンプルを元に実行してみる。
公式のそのままだと動かなかったり、インデントがいまいちで怒られたりするので手を入れている。

fwx120.yml
---
- hosts: FWX120
  vars_files:
    - group_vars/yamaha.yml
  collections:
    - yamaha_network.rtx
  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をplaybook内に書いているが/group_vars/yamaha.ymlに記載するようにしている。
また


  collections:
    - yamaha_network.rtx

で指定しているためモジュールはFQCN表記でなくても動くと思うが一応フルパスで書くことが推奨なのでフルパスで。

yamaha.yml
ansible_network_os: yamaha_network.rtx.rtx
ansible_user: ansible
ansible_ssh_pass: {{SSH PASS}}
ansible_become: true
ansible_become_password: {{BECOME PASS}}

あとは実行するだけ。

$ ansible-playbook -i inventories/inventory fwx120.yml
PLAY [FWX120] ************************************************************************

TASK [Gathering Facts] ***************************************************************
ok: [192.168.1.x]

TASK [get configuration] *************************************************************
ok: [192.168.1.x]

TASK [debug] *************************************************************************
ok: [192.168.1.x] => {
    "msg": [
        "description 1 yamaha",
        "login password *",
        "administrator password *",
        "login user ansible *",
        "security class 1 on off on",
        "console character ascii",
        "console columns 200",
        "console lines infinity",
        "console prompt FWX120",
        "ip route default gateway 192.168.1.1",
        
        (( 中略 ))
        
        "sshd service on",
        "sshd host 192.168.1.1-192.168.1.254",
        "sshd host key generate *",
        "statistics cpu on",
        "statistics memory on",
        "statistics traffic on",
        "statistics flow on",
        "statistics route on",
        "statistics nat on",
        "statistics filter on"
    ]
}

TASK [set description] ***************************************************************
ok: [192.168.1.x]

PLAY RECAP ***************************************************************************
192.168.1.x               : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ひとまずconfigは表示できているようできちんと動いていることがわかった。

バックアップ取得

コンフィグの表示は出来たようなので次はバックアップ取得するplaybookを書いてみる。
例によって公式にある物をベースに手を入れた物。

network_backup.yml
---
- hosts: FWX120
  vars_files:
    - group_vars/yamaha.yml
  collections:
    - yamaha_network.rtx
  connection: network_cli
 
  tasks:
    - name: get configuration
      yamaha_network.rtx.rtx_config:
        backup: yes
        backup_options:
          dir_path: ./template/yamaha/

backupのオプションで保存場所を変更している。
今回は/templateの中で機器ごとにconfigを吐き出せるようにしてみた。
バックアップファイルを元にconfig投入できるようになれば人間の手からルータを完全に手放すことが出来る。
晴れてIaCの完成というわけ。

で、実行してみる。

network_backup.yml

$ ansible-playbook -i inventories/inventory network_backup.yml 

PLAY [FWX120] ************************************************************************

TASK [Gathering Facts] ***************************************************************
ok: [192.168.1.x]

TASK [get configuration] *************************************************************
changed: [192.168.1.x]

PLAY RECAP ***************************************************************************
192.168.1.x                : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

成功したようだ、きちんとファイルが作成されているかチェックする。

$ ls template/yamaha/
192.168.1.x_config.2021-03-30@13:14:23

というわけで想定通りの場所にコンフィグを吐き出すことが出来た。

$ tail /template/yamaha/hoge_config.2021-03-30
sshd service on
sshd host 192.168.1.1-192.168.1.254
sshd host key generate *
statistics cpu on
statistics memory on
statistics traffic on
statistics flow on
statistics route on
statistics nat on
statistics filter on

中身も先ほど確認した物ができているようだ。

role化

roleで実行するように試してみる。

management_network
---
- name: Manage Network setting
  hosts: YAMAHA
  vars_files:
    - group_vars/yamaha.yml
    - group_vars/all.yml
    - group_vars/vault.yml
  connection: network_cli
  become: true

  roles:
    - { role: yamaha, tags: manage }
roles/yamaha/tasks/main.yml
---
- include_tasks: roles/yamaha/tasks/fwx120.yml
- include_tasks: roles/yamaha/tasks/network_backup.yml
roles/yamaha/tasks/fwx120.yml
---
- 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
roles/yamaha/tasks/network_backup.yml
---
- name: get configuration
  yamaha_network.rtx.rtx_config:
    backup: yes
    backup_options:
      dir_path: ../../../template/yamaha/fwx120

実行してみると・・・・・・

$ ansible-playbook  -i inventories/inventory management_network.yml 

PLAY [Manage Network setting] ********************************************************

TASK [Gathering Facts] ***************************************************************
ok: [192.168.1.x]

TASK [yamaha : include_tasks] ********************************************************
included: /roles/yamaha/tasks/fwx120.yml for 192.168.1.x

TASK [yamaha : get configuration] ****************************************************
ok: [192.168.1.x]

TASK [yamaha : debug] ****************************************************************
config省略

TASK [yamaha : set description] ******************************************************
ok: [192.168.1.x]

TASK [yamaha : include_tasks] ********************************************************
included: /roles/yamaha/tasks/network_backup.yml for 192.168.1.x

TASK [yamaha : get configuration] ****************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: PermissionError: [Errno 13] Permission denied: b'../../../template'
fatal: [192.168.1.x]: FAILED! => {"msg": "Unexpected failure during module execution.", "stdout": ""}

PLAY RECAP ***************************************************************************
192.168.1.x                : ok=6    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   

permission error で止まってしまう・・・・・・
権限緩くしてもダメだし今回は諦めよう
おそらく書き出しするときのユーザがダメなんだろうと思うけどansible_become_userつけてもうまくいかないしうーん、誰か教えてください

現状

とりあえずrole化以外コンフィグの取得と保存は出来た。
次はconfigを元に設定追加が出来るかを試したい。
この記事に追加する予定。
いつになるかはわかりません。