はじめに
Ansible にはネットワークモジュールが多数用意されていて、ネットワーク機器に接続してコマンドを実行できます。
では、機器に接続できない環境で投入コンフィグを準備するにはどのようにすればよいでしょうか。
それには template
モジュールが利用できます。
ネットワーク機器そのもとは直接関係なく汎用的なものなので、テンプレートの書き方次第で Ansible が対応していないネットワーク機器のコンフィグも生成できます。
この記事では、コンフィグテンプレートと、(YAMLではなくあえて)CSVファイルに定義したパラメータを利用して、簡単なコンフィグファイルを生成する方法をご紹介します。
- 動作確認環境
- Ansible 2.9.3
read_csv
モジュールがある Ansible 2.8.0 以降ならおそらく動きます
- Ansible 2.9.3
準備するもの
├─ 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 などでコンフィグを生成していて、他の方法を探している場合に参考になればと思います。