あんパン

こしあん派

YAMAHAルータの設定をAnsibleで管理する

新しめのYAMAHA製ルータはAnsibleで設定を管理することができる。

www.rtpro.yamaha.co.jp

手順に書いてある通り

  • SSH用のユーザを用意する
  • SSH機能を有効にする
  • Ansibleのコードを書いて適用する

の順序で適用できる。

素朴な構成であればサンプルと同じ形で実現可能だけれど、複数環境や複数拠点のconfigを共通化したいとなると階層化して管理したくなる。実際、自分は自宅と実家でRTX830を運用していてやや困った。なので、具体的にどのような構成にしたのかを記しておく。ほとんどAnsibleの話なのでAnsibleに慣れている人にはいまさらな話題だと思う*1

ディレクトリ構成とinventories

サンプルだと各ファイルをフラットに配置しているけど、環境や拠点が複数ある場合はもうすこし複雑な構成をとりたくなるはず。自分はAnsible公式ドキュメントのベストプラクティス*2に則ってディレクトリ構成を組むことにした。

$ tree
.
├── inventories
│   └── test
│       ├── group_vars
│       │   ├── network_noop.yml
│       │   └── network_test.yml
│       ├── hosts.yml
│       └── host_vars
│           └── hostname.yml.example
├── README.md
├── roles
│   ├── router
│   │   └── tasks
│   │       ├── general.yml
│   │       ├── lan.yml
│   │       ├── main.yml
│   │       ├── ntp.yml
│   │       └── upstream.yml
│   └── save_configuration
│       └── tasks
│           └── main.yml
└── router.yml

inventories/ 以下に環境ごとのディレクトリを用意し、 hosts.yml にホストの情報と拠点の情報を書いておく。hosts.yml の中身は以下のような雰囲気。

---
# roles
router:
  hosts:
    router_test:
      ansible_host: 192.168.0.1
      ansible_network_os: yamaha_network.rtx.rtx
    router_noop:
      ansible_host: 192.168.16.1
      ansible_network_os: yamaha_network.rtx.rtx
 
# network groups
network_test:
  hosts:
    router_test:

network_noop:
  hosts:
    router_noop:

こうすることで、どの環境のどの拠点に対して構成を適用するかを選択できる。たとえば test 環境の network_test 拠点に対して適用するのであれば以下のコマンドを発行する。

$ ansible-playbook -i ./inventories/test/hosts.yml router.yml --limit network_test --ask-vault-pass

なお router.yml はこういう調子。

- hosts: router
  connection: network_cli
  roles:
    - router
    - save_configuration

VLANのIDやIPの範囲、DHCPのスコープ範囲などは group_vars 以下に書いておくと良い。 host_vars/HOSTNAME.yml にはルータへの接続情報を書く。

---
ansible_user: SSH_USER
ansible_ssh_pass: SSH_PASSWORD
ansible_become: true
ansible_become_password: ADMINISTRATOR_PASSWORD

接続情報は暗号化して保存する

接続情報を平文で置くのはかなり抵抗がある。Ansibleには変数ファイルを暗号化する機能があるのでこれを利用する。host_vars/HOSTNAME.yml を丸ごと暗号化するには

$ ansible-vault encrypt host_vars/HOSTNAME.yml

を実行すれば良い。 ansible-playbook コマンドの実行時に --ask-vault-pass オプションを付けることで復号しつつ適用することができる。

ルータ初期化時の手順に ip lan1 addressdhcp scope の設定を含める

ip interface address ip_address/mask でinterfaceのIPアドレスを指定することができる*3ip lan1 address 192.168.0.1/24 のような要領。

YAMAHAルータはコマンドを実行すると逐次挙動が変化するので、SSHにIPv4を利用して接続していた場合 ip lan1 address でlan1のIPアドレスを変更するとその後の設定を適用できなくなる。 こればかりはどうしようもないので、SSHユーザを準備するなどの初期化時の手順内でlan1のIPアドレス設定とDHCPの設定を行うようにした。

Web UIから設定すれば同時に変更することができるし、コンソールケーブルで接続して設定するでも良い。自分はコンソールケーブルを用意して接続している。


素朴に1台だけ管理するならconfigファイルを持っておいて適用すれば良いけれど、拠点が複数あったり他の機材をAnsibleで管理している場合は便利そうなので検討しても良さそう。

*1:自分は普段Ansibleを使っておらずmitamaeかTerraformかCDKという感じなので公式ドキュメントを読み込みながら検討した

*2:https://docs.ansible.com/ansible/2.8/user_guide/playbooks_best_practices.html#alternative-directory-layout

*3:http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/ip/ip_interface_address.html