Ansibleというとサーバーの構成管理で利用される場面が多いのですが、ルーターやファイアウォール、ロードバランサーのようなネットワーク機器を構成管理するためにAnsibleを活用する企業も増えているようです。
Ansibleとは何ぞや?という基本的なところは皆さんご存知だと思いますし、そうでなくても他のサイトで十分に取り上げられているので解説はそちらに譲ります。
それでは早速ネットワーク機器をansibleで構成管理するための話に移りましょう。
タップできる目次
ディレクトリ構成
Ansibleで構成管理を始めるにあたって悩むのがディレクトリ構成です。
ディレクトリ構成の検討を適用に済ませると後になって面倒な事になるので自分の環境に合わせてよく考える必要があります。
まず基本的な環境として「Production(本番環境)」と「Staging(開発環境)」のふたつがあるとします。他にも環境がある場合はディレクトリを追加すれば良いでしょう。
説明を簡潔にするためにディレクトリ構成からStagingを取り除いたものを利用します。
ansible/ ├── ansible.cfg ├── inventories │ └── production │ ├── group_vars │ │ ├── all │ │ └── group01 │ │ └── auth.yml │ ├── host_vars │ │ └── host01 │ └── hosts └── playbooks ├── host01.yml └── roles └── group01 └── dir01 └── test ├── defaults ├── files ├── handlers ├── meta ├── tasks │ └── main.yml ├── templates └── vars
インベントリファイルを格納するディレクトリは「inventories」です。インベントリは環境によって切り替える必要があるので「production」を「inventories」の配下に配置しています。
更に「production」配下には「group_vars」と「host_vars」があります。ご存じの通り「group_vars」はグループ単位での設定を行い「host_vars」はホスト固有の設定を行います。
プレイブックは「playbooks」直下に配置します。ロールを格納する「roles」は「playbooks」の配下に配置します。
「roles」配下に「group01/dir01」がありますが実際にはネットワーク機器の種類別に分けます。わたしの好みですが「ベンダ名/OS(機種)」というディレクトリ構成にすると複数の機種が入り交じる場合にスッキリ整理できるのでお勧めです。
- juniper/srx
- junper/ssg
- fortinet/fortigate
- f5/bigip
- cisco/ios
「roles/group01/dir01」配下にある「test」は実際にはルーティング設定だとかインタフェース設定、その他諸々の機能別にディレクトリを分けると再利用しやすくなるでしょう。
パスワードの問題
ネットワーク機器はサーバーのように鍵認証でログインできるものが少ないので必然的にパスワード認証となるはずです。
パスワードのような秘密の情報をymlファイルに直接記述する事もできますが、セキュリティを考慮するのであれば(特にGitHubを利用する場合)暗号化した方が良いでしょう。
Ansibleで秘密情報を暗号化するためには「ansible-vault」コマンドが利用できます。
「ansible-vault encrypt <ファイル名>」でファイルを暗号化し「ansible-vault decryt <ファイル名>」でファイルを復号化します。
sshログインのためのユーザー名とパスワードを設定するファイルは次のような内容になります。
ansible_ssh_user: root ansible_ssh_pass: xxxxxxxx
ansible-playbook実行時にansible-vaultで暗号化したファイルを復号化する必要がある場合はコマンドラインで「–ask-vault-pass」オプションを付けます。
面倒な場合はansible.cfgに以下の項目を追加すれば良いでしょう。
[defaults] ask_vault_pass = True
また、ansible-playbook実行時に暗号化されたファイルへのパスをコマンドラインのオプションで指定できますが、わたしはinventories配下のgroup_varsあるいはhost_varsで設定しています。
ネットワーク機器は同じ機器であれば同じパスワードを使う事が多いかと思います。ですからインベントリファイルでグループ化しておいてgroup_vars配下に暗号化したファイルを配置し、個別に暗号化したパスワードファイルを読み込ませたい場合はhost_varsに配置すれば良いです。
簡単な例を示しましょう。インベントリファイルで以下のようにグループ分けしているとします。fw01,fw02,fw999はすべて「fw」グループに属します。
[fw] fw01 fw02 fw999
fw01とfw02が同じパスワードでfw999が異なるパスワードだとすると、次のように暗号化したファイルを配置できます。
├── inventories │ └── production │ ├── group_vars │ │ └── fw │ │ └── auth.yml │ ├── host_vars │ │ └── fw999 │ │ └── auth.yml │ └── hosts
まずgroup_vars/fw/auth.ymlがfw01とfw02、fw999で読み込まれます。fw999は更にhost_vars/fw999/auth.ymlを読み込み最初に読み込んだ情報が上書きされます。