新しめのYAMAHA製ルータはAnsibleで設定を管理することができる。
手順に書いてある通り
- 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 address
と dhcp scope
の設定を含める
ip interface address ip_address/mask
でinterfaceのIPアドレスを指定することができる*3。ip 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