てくなべ (tekunabe)

ansible / network / automation

[Ansible] ネットワーク機器のコンフィグ生成ツールとしての Ansible

はじめに

Ansible にはネットワークモジュールが多数用意されていて、ネットワーク機器に接続してコマンドを実行できます。

では、機器に接続できない環境で投入コンフィグを準備するにはどのようにすればよいでしょうか。 それには template モジュールが利用できます。

ネットワーク機器そのもとは直接関係なく汎用的なものなので、テンプレートの書き方次第で Ansible が対応していないネットワーク機器のコンフィグも生成できます。

この記事では、コンフィグテンプレートと、(YAMLではなくあえて)CSVファイルに定義したパラメータを利用して、簡単なコンフィグファイルを生成する方法をご紹介します。


準備するもの

├─ configs               生成コンフィグを出力先ディレクトリ
├─ templates             コンフィグテンプレート格納ディレクトリ
│ └─ config_template.j2  コンフィグテンプレート
├─ params.csv            パラメーターCSVファイル
└─ gen_config.yml        Playbook

インベントリファイルは不要です。

CSV ファイル (params.csv

ホスト名と、VLAN、IPアドレスを定義する CSV ファイルです。1行目はヘッダーです。

hostname,vlan,address,mask
sw101,10,10.0.10.254,255.255.255.0
sw201,20,10.0.20.254,255.255.255.0

コンフィグテンプレート (templates/config_template.j2)

Ansible ではテンプレートエンジンとして Jinja2 を利用しているため Jinja2 形式で書きます。 ホスト名と vlan に IP アドレスを設定するだけの部分的なコンフィグのテンプレートです。

hostname {{ item.hostname }}

interface vlan{{ item.vlan }}
  ip address {{ item.address }} {{ item.mask }}

後述の Playbook の loop で呼び出されるため、具体的なパラメーターは item の中を指定します。

Playbook (gen_config.yml)

Playbook は以下の通りです。read_csv モジュールで、CSV ファイルの内容を読み取って変数化して、template モジュールでコンフィグファイルを生成します。 生成するコンフィグのファイル名には、CSV ファイルの hostname 列の値を利用します。

- hosts: localhost
  gather_facts: no
  connection: local

  tasks:
    - name: read csv
      read_csv:
        path: params.csv   # パラメーターCSVファイル
      register: params

    - name: generate config
      template:
        src: config_template.j2    # コンフィグテンプレートの指定
        dest: "configs/{{ item.hostname }}_config.txt"  # 出力先
      loop: "{{ params.list }}"   # CSVフィアルの行数分をループ(ヘッダー除く)


Playbook 実行

Playbook を実行します。

$ ansible-playbook -i localhost, gen_config.yml 

PLAY [localhost] *****************************************************************************************************

TASK [read csv] ******************************************************************************************************

ok: [localhost]

TASK [generate config] ***********************************************************************************************
changed: [localhost] => (item={'hostname': 'sw101', 'mask': '255.255.255.0', 'vlan': '10', 'address': '10.0.10.254'})
changed: [localhost] => (item={'hostname': 'sw201', 'mask': '255.255.255.0', 'vlan': '20', 'address': '10.0.20.254'})

PLAY RECAP ***********************************************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   


確認

生成されたファイルを確認します。

$ cat configs/sw101_config.txt 
hostname sw101

interface vlan10
  ip address 10.0.10.254 255.255.255.0
$ cat configs/sw201_config.txt 
hostname sw201

interface vlan20
  ip address 10.0.20.254 255.255.255.0

無事にホストごとにパラメータが異なるコンフィグが生成されました。


さいごに

ごく簡単な例でしたが、いろいろ応用はできるかと思います。 Excel のシートと VBA などでコンフィグを生成していて、他の方法を探している場合に参考になればと思います。