Ansible 2.7でRouterOSが対応になりました。

2018-10-07 10:23Blog

ansible logo

Ansible 2.7公式版に向けて開発が進んでいたRouterOSモジュールですが、ついにAnsible2.7の公開の更新にRouterOS対応が入りました。

はじめに

こちらのツイートで気が付きました。

Ansibleではnetwork_cliプラグインモジュールで実装されているようです。

このあたりの使用方法については公式のドキュメントを確認した方が良いと思います。

また、AnsibleでのRouterOSモジュールのドキュメントは以下になります。

実行してみた

あまり筆者もよくわかっていないのですが、Ansible2.7環境を用意して実行してみました。 今回、Pythonのインストールや、Ansible本体のインストール方法については割愛させていただきます。

まず、以下のようなプレイブックを作成してみました。(mikrotik.yml) 実行していることは以下の通りです。

  • Routerboardの情報の表示
  • Routerboardのhealthの表示
- hosts: all
  gather_facts: no
  connection: network_cli

  vars:
    ansible_network_os: routeros
  
  tasks:
  - name: run command on remote devices       
    routeros_command:         
      commands:          
      - /system routerboard print         
      - /system health print       
      register: result       

- name: stdout       
  debug:         
    msg: "{{ result.stdout_lines }}"

Ansibleは基本的に結果の出力を期待しないものなので、コマンドの実行結果を変数resultに格納するようにします。そして、その結果をdebugコマンドのmsgで出力してやる形になります。

ここではインベントリファイルを使用せず、直接IPアドレスを指定していますが、複数台のRouterOS機器に接続するのであれば、インベントリファイルを用意した方が良いと思います。 結果は以下の通りです。

$ ansible-playbook -i 192.168.1.3, mikrotik.yml -u admin -k 
SSH password:  PLAY [all] ********************************************************************************************************* 
TASK [run command on remote devices] ******************************************************************************* 
ok: [192.168.1.3] 
TASK [stdout] ****************************************************************************************************** 
ok: [192.168.1.3] => {
"msg": [
[
";;; Firmware upgraded successfully, please reboot for changes ",
"                    to take effect!",
"       routerboard: yes",
"             model: CRS317-1G-16S+",
"     serial-number: ************",
"     firmware-type: dx3230L",
"  factory-firmware: 6.41",
"  current-firmware: 6.43.1",
"  upgrade-firmware: 6.43.2"         ],
[             "temperature: 46C",
"  cpu-temperature: 38C",
"       psu1-state: ok",
"       psu2-state: ok",
"       fan1-speed: 2835RPM",
"       fan2-speed: 2985RPM"         ]     ] } 
PLAY RECAP ********************************************************************************************************* 
192.168.1.3              : ok=2    changed=0    unreachable=0    failed=0   

Ansibleの実行結果として、今回接続対象になったCRS317-1G-16S+の /system routerboard print 出力結果と、/system health printの結果が表示されているのが分かると思います。msgはresult.stdout_linesを対象にしているので、複数行になっているlist型のものを展開している形になります。 また、Firmwareのアップデートを促す出力も取得できているので、このあたりもうまく活用すると、再起動を促すキーにできたりするかもしれません。

さいごに

今回はコマンドの結果の出力だけを試しましたが、例えば、設置するRouterOS機器に共通で設定するパラメータなど(sntp clientとか)を、プレイブックとして作成しておき、配布するなど使用できればいいのではないかなと思います。

Ansibleのネットワークモジュールについては、下記に詳しい資料が見つかりましたので、参考にしてみてください。

追記(2019年4月8日):

Ansible 2.8からはRouterOSの基本情報が取得できるようになるそうです。

どうやら、allhardwareconfiginterfacesというカテゴリで取得できる範囲を限定できるようです。

# Collect all facts from the device
- routeros_facts:
    gather_subset: all

# Collect only the config and default facts
- routeros_facts:
    gather_subset:
      - config

# Do not collect hardware facts
- routeros_facts:
    gather_subset:
      - "!hardware"

モデルとかで切り替えとか出来るようになるので、管理もさらに便利になるかもですね。(いままのままだとconfigを流し込むぐらいしか出来ないですし)