Ansible 2層テンプレート
AOS-CX Ansibleプレイブックを実行する場合、 Jinja2-basedテンプレートファイルを使用してAOS-CXスイッチ構成を作成します。
目次
– TOC
概要
テンプレートファイルはプレイブックから呼び出されますで、ターゲットスイッチごとに完全なAOS-CX構成ファイルを構築します。テンプレートファイルのJinja2構文とインベントリファイルで定義された変数を組み合わせると、動的で複雑なスイッチ構成の構築がサポートされます。
複数のテンプレート・ファイルを使用して、スイッチの役割やその他の基準に基づいて構成を構築できます。プレイブックは、 config_template変数の値を使用して、インベントリファイル内のスイッチホストに割り当てられたテンプレートを選択します。変数は、ホストに直接割り当てることも、グループから継承することもできます。
テンプレートの構文
Jinja2構文は、変数の置換値、ループ、条件文の使用をサポートしています。
この章では、Jinja2ベースのテンプレートファイルの基本的なフォーマットについて説明します。サンプルテンプレートを変更したり、新しいテンプレートを構築するための参照として使用したりできます。
この導入例のcoreおよびaccessテンプレート・ファイルは、CX 8325-32Cコア・スイッチおよびすべての83xxシリーズCXモデルをアクセス・スイッチとして導入する場合に、変更なしで使用できます。
標準CLI文
標準のAOS-CXスイッチ設定ステートメントをテンプレートファイルに追加できます。コンフィギュレーション行は、ファイルに記述されているとおりにスイッチにコピーされます。AOS-CX構文に厳密に準拠する必要があり、完全で完全な構成ステートメントを使用することがベストプラクティスです。構成ステートメントは、ファイル内の正しいコンテキストに配置する必要があります。AOS-CXのインデントには4つのスペースが使用されます。
次の例では、標準のAOS-CX CLI設定ステートメントをテンプレートファイルで使用しています。
profile l3-agg
router pim
enable
active-active
https-server vrf mgmt
単純変数の置換
テンプレートファイルは、構成文の静的な値の代わりに単一の変数値を置き換えることができます。変数の値はインベントリファイルに割り当てられます。テンプレートファイルで変数の値を使用するには、インベントリファイルの変数名を2つの中かっこ( {{variable_name}})で囲みます。
静的な値を変数に置き換えることで、同じテンプレートファイルを使用して、config文で異なる値を必要とする複数のスイッチを構成できます。変数を使用すると、ip addressなどの一意の値を適用できるだけでなく、同じテンプレートを異なる管理境界や地理的境界で使用することもできます。たとえば、timezone、SNMP情報、DNSサーバ、NTPサーバ、および場所に基づいて異なる値を持つその他の構成コンポーネントに対して、インベントリ変数を定義できます。
変数の数を増やすと、テンプレートファイルの柔軟性が向上します。各管理者は、変数の数を増やして柔軟性を高める際に、在庫ファイルとテンプレートファイルの複雑さのバランスを取る必要があります。
変数の値は、インベントリファイルのホストに直接割り当てることも、親グループから継承することもできます。次のAOS-CX設定文の例では、テンプレートファイル内で単純な変数の置き換えを使用しています。
hostname {{hostname}}
clock timezone {{timezone}}
interface lag {{vsx_isl_lagid}}
no shutdown
description VSX-ISL-LAG
no routing
vlan trunk native 1 tag
vlan trunk allowed all
lacp mode active
| 注: |
|---|
| テンプレートがインベントリファイルで定義されていない変数名を参照している場合、プレイブックエラーが発生します。 |
値リストでの###反復
インベントリ変数に値のリストが割り当てられている場合、テンプレートファイルはforループを使用してリストの各メンバーを反復処理し、複数のAOS-CX構成行を生成できます。
単純なリストに対する反復は、1つの修正値を含む複数のコンフィギュレーション行を生成する場合に役立ちます。たとえば、複数のAOS-CX設定ステートメントを生成して、NTPまたはDNSサーバーのセットを定義します。ディクショナリを繰り返すことで、VLANインターフェイスのセットを作成するなど、より複雑な設定が可能になります。各インターフェイスでは、VLAN ID、ip address、アクティブなゲートウェイ割り当てなど、設定を構築するために一連の追加情報が必要になります。
簡単なリストと辞書ベースのイテレーションの例を以下に示します。
例1:単純なリストでの反復
このサンプルインベントリファイルでは、次のようにDNS serversの単純なコンマ区切りのリストをDC-RSVグループレベルで定義しています。
dns_servers: [10.2.120.98、10.2.120.99]
プレイブックは、このリストを繰り返すテンプレートファイルを呼び出し、次の構文を使用して適切なAOS-CX構成を生成します。
p{% for server in dns_servers %}
ip dns server-address {{server}} vrf mgmt
{% endfor %} p
上記の例では、 forステートメントは一度に1つのリストメンバをdns_servers変数から読み取り、ローカルのserver変数に割り当てます。server変数値は、forループの開始と終了の間にあるAOS-CX構成ステートメントを完了するために使用されます。この際、各繰り返しで変数名が割り当てられた値に置き換えられます。このプロセスは、すべてのリストメンバが読み取られ、各設定行がスイッチ設定ファイルに書き込まれるまで繰り返されます。この例では、10.2.120.98の最初のリスト値がserver変数に割り当てられ、ループから最初の設定行が生成されます。10.2.120.99の2番目のリスト値が読み取られ、別の構成行が生成された後、追加のリストメンバーが存在しないため、forループは完了します。
上記のforループから、次のAOS-CX構成ラインが生成されます。
ip dns server-address10.2.120.98 vrf mgmt
ip dns server-address10.2.120.99 vrf mgmt
例2:ディクショナリでの反復
サンプルインベントリファイルは、RSVDC-CORE1-1ホストレベルでディクショナリを定義し、VLAN interface values(DC-RSV > core > RSVDC-CORE1-1)を割り当てます。次の例では、host_vlansディクショナリに2つのエントリがあり、各エントリにはid、name、ip_addressなどのVLANインターフェイスの定義に必要な関連付けられた変数値のリストが含まれています。
host_vlan:
- id: 101
name: PROD-WEB
ip_address: 10.12.101.2
active_gateway_mac: 02:00:0a:01:65:01
active_gateway_ip: 10.12.101.1
- id: 102
name: PROD-DB
ip_address: 10.12.102.2
active_gateway_mac: 02:00:0a:01:65:01
active_gateway_ip: 10.12.102.1
このプレイブックでは、テンプレートファイルを呼び出してhost_vlansディクショナリを反復し、次の構文を使用して適切なAOS-CX VLANインターフェイス設定を生成します。
{% for vlan in host_vlans %}
interface vlan {{vlan.id}}
description {{vlan.name}}
ip mtu 9198
ip address {{vlan.ip_address}}/{{vlan.mask | default('24', true)}}
active-gateway ip mac {{vlan.active_gateway_mac}}
active-gateway ip {{vlan.active_gateway_ip}}
ip ospf 1 area {{ospf_area}}
ip igmp enable
ip pim-sparse enable
{% endfor %}
上記の例では、 forステートメントはhost_vlans配列からディクショナリメンバを一度に1つずつ読み取ります。各配列エントリは、変数のセットとして読み取られ、ローカルのvlan変数に割り当てられます。個々のサブ変数の値は、親変数(vlan)とサブ変数名のいずれか(id、name、ip_addressなど)をドット区切り文字で連結して参照します。たとえば、 vlan.nameは、 vlan変数に読み込まれた現在のディクショナリエントリのVLAN名の値を参照します。
このメソッドは、複数の変数値が単一の論理AOS-CX構成領域に関連付けられている複雑な構成の書き込みをサポートします。
最初の辞書エントリが読み込まれると、次の変数値が割り当てられます。
- vlan.id: 101
- vlan.name: PROD-WEB
- vlan.ip_address: 10.12.101.2
- vlan.active_gateway_mac: 02:00:0a:01:65:01
- vlan.active_gateway_ip: 10.12.101.1
| 注: |
|---|
| forループには追加のロジックが含まれています。vlan.mask変数が定義されていない場合、デフォルト値の24が置き換えられます。また、 DC-RSVグループレベルで割り当てられたすべてのホストの0.0.0.0の継承値であるospf_area変数への参照も含まれます。 |
forループの例を使用して、テンプレートによって次のAOS-CX構成が生成されます。
interface vlan 101
description PROD-WEB
ip mtu 9198
ip address 10.12.101.2/24
active-gateway ip mac 02:00:0a:01:65:01
active-gateway ip 10.12.101.1
ip ospf 1 area0.0.0.0
ip igmp enable
ip pim-sparse enable
interface vlan 102
description prod-DB
ip mtu 9198
ip address 10.12.102.2/24
active-gateway ip mac 02:00:0a:01:65:01
active-gateway ip 10.12.102.1
ip ospf 1 area0.0.0.0
ip igmp enable
ip pim-sparse enable
条件文
Jinja2では、条件付きif/then/elseステートメントの評価をサポートしており、設定ステートメントの生成時に使用できます。
次の例には、2つの条件文が含まれています。1つ目の条件文は、最初の条件文の中にネストされています。
{% if vsx_keepalive_int is defined %}
interface {{vsx_keepalive_int}}
no shutdown
description VSX KA
{% if vsx_role == 'primary' %}
ip address {{vsx_keepalive_ip_primary}}/31
{% else %}
ip address {{vsx_keepalive_ip_secondary}}/31
{% endif %}
{% endif %}
上の例では、条件文{% if vsx_keepalive_int is defined %}は、設定が生成される現在のホストに対してvsx_keepalive_int変数が定義されているかどうかをチェックします。そうでない場合、上記のスタンザ全体は無視され、スイッチに対するVSXキープアライブインターフェイス設定は生成されません。変数が定義されている場合、変数の代入を使用して設定が生成されます。
2番目の条件付き評価は、VSXペア内のスイッチの役割に基づいて、VSXキープアライブインターフェイスに正しいip addressを割り当てるように設計されています。プライマリとセカンダリのキープアライブip addressの両方がインベントリファイルに定義されています。プレイブックで処理されている現在のスイッチがプライマリスイッチである場合は、vsx_keepalive_ip_primary変数の値が割り当てられます。スイッチがプライマリでない場合、変数vsx_keepalive_ip_secondaryの値が割り当てられます。