BIG-IP Virtual Editionを使ってみる。（その６：Ansibleによる冗長化設定準備）

# はじめに
前回までで、1台構成の場合の負荷分散設定を`Ansible`で行ってみましたが、今回は`Ansible`で2台構成で冗長設定を行ってみようと思います。

- 【前】[BIG-IP Virtual Editionを使ってみる。（その５：Ansibleによる負荷分散設定）](https://qiita.com/sakai00kou/items/769470f9489838815579)
- 【次】[BIG-IP Virtual Editionを使ってみる。（その７：Ansibleによる冗長化設定）](https://qiita.com/sakai00kou/items/1de954a25bba8dc8a9f5)

# BIG-IPの冗長化設定
`BIG-IP LTM`で冗長設定を行う場合、以下の様な設定を行う必要があります。

1. Device Connectivityの設定
2. Trust Domainの設定
3. Device Groupの設定
4. HA Groupの設定
5. Traffic Groupの設定

上記のうち、1、4、5は冗長構成をとる機器全て、2～3はマスターとなる機器で設定を行います。

![BIG-IP_HA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/1fb8616e-61cd-646f-07b5-bea05d83b56c.png)

# 今回の構成
今回は以下の様なネットワーク構成の設定を行っていきます。

![BIG-IP_Address.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/5419138a-c5a7-ea9a-7fb6-5b9eaee590c2.png)

## 前準備：概要
今回は冗長化の設定を行うため、冗長化の設定を行う前に以下の前準備を行っておきます。

- 1台目のVLAN割り当て解除
- 2台目のBIG-IPの準備
- bigip_setup-initconfの修正
- 2台目用ホスト変数ファイルの作成
- HA通信用インタフェースの追加
- ノード設定ロールをマスター側機器のみで実行するように変更
- プール設定ロールをマスター側機器のみで実行するように変更
- バーチャルサーバ設定ロールをマスター側機器のみで実行するように変更

後ほど行う`BIG-IP`の`HA Group`設定を行うためには`Trunk`（リンクアグリゲーション）の設定を行う必要がありますが、すでにインタフェースにVLANが割り当てられていると、`Trunk`設定時に`VLAN`の割り当てができないため、前回の記事で`VLAN`をインタフェースに割り当てている場合は割り当てを外します。

また、[前回](https://qiita.com/sakai00kou/items/769470f9489838815579)作成した負荷分散用設定は、冗長化設定を行う場合、最終的にマスター側機器から同期される設定となるため、バックアップ側機器では設定しないようにロールを編集します。

## 前準備１：インタフェースとVLANの割り当て解除
インタフェース1.1に割り当てたVLAN名`external`とインタフェース1.2に割り当てたVLAN名`internal`の割り当てを解除するには`BIG-IP`から以下コマンドで解除できます。

```shell:インタフェースとVLANの割り当て解除コマンド
tmsh modify net vlan external interfaces delete { 1.1 }
tmsh modify net vlan internal interfaces delete { 1.2 }
```

## 前準備２：2台目のBIG-IPの準備
2台目用に仮想マシンのセットアップやライセンスなどを準備して作成しておきましょう。

また、マネジメントポートのIPアドレスですが、冗長化設定完了直後や`Device Group`のメンバーが存在しないような状況の場合、マネジメントポートのIPアドレスが大きいアドレスのホストが`Active`として選ばれるため、2号機には1号機よりも**小さい数**のIPアドレスを割り当てるのが良いと思います。

とはいえ、冗長化設定を行った後、`Device Group`の機器が同時に落ちたりすることも少ないと思いますので、特に気にしないようなら任意のアドレス設定で問題ありません。

## 前準備３：bigip_setup-initconfの修正
[以前](https://qiita.com/sakai00kou/items/92c73ee329d1cf63318a)の記事で設定を入れ忘れていたので、`bigip_setup-initconf`に`allow_service`の設定項目を追加しておきます。

`allow_service`の設定は、`Port Lockdown`という設定を行う定義となり、`BIG-IP`のセルフIPへの受信側アクセスを制御するセキュリティ設定となります。

独自に許可するプロトコルを設定することもできますが、全許可設定の`Allow All`、全拒否設定の`Allow None`（デフォルト）、一部通信のみ許可する`Allow Default`があります。

セルフIPは負荷分散用のアドレスとは異なり、`BIG-IP`自身のアドレスとなるため、通常はデフォルトの全拒否設定で問題ありませんが、後述する冗長化の制御用通信も拒否してしまうため、設定追加を行います。

尚、`Allow Default`設定の場合、以下の通信が許可されます。

「[K17333: Overview of port lockdown behavior (12.x - 16.x)](https://support.f5.com/csp/article/K17333)」

|許可プロトコル|ポート|サービス名|
|:--|:--|:--|
|IGMP|-|-|
|OSPF|-|-|
|PIM|-|-|
|TCP|4353|iQuery|
|UDP|4353|iQuery|
|TCP|443 |HTTPS|
|TCP|161 |SNMP|
|UDP|161 |SNMP|
|TCP|22  |SSH|
|TCP|53  |DNS|
|UDP|53  |DNS|
|UDP|520 |RIP|
|UDP|1026|network failover|

以下のロールの設定と、ホスト変数も修正しておきます。

```yml:roles/setup_bigip-initconf/tasks/main.yml
（抜粋）
- name: BIG-IP Self IPの作成
  bigip_selfip:
    name: "{{ item.name }}"
    address: "{{ item.address }}"
    netmask: "{{ item.netmask }}"
    vlan: "{{ item.vlan }}"
    allow_service: "{{ item.allow_service }}"    ←追加
    state: "present"
    provider: "{{ bigip_provider }}"
  delegate_to: "{{ bigip_delegate_to }}"
  notify: save_config
  loop: "{{ bigip_selfip }}"
```

```yml:host_vars/bigip01.yml
（抜粋）
bigip_selfip:
  - { name: "10.1.0.1", address: "10.1.0.1", netmask: "255.255.255.0", vlan: "external", allow_service: "none" }
  - { name: "10.2.0.1", address: "10.2.0.1", netmask: "255.255.255.0", vlan: "internal", allow_service: "none" }
```
## 前準備４：2台目用ホスト変数ファイルの作成
1台目のホスト変数ファイルを参考に2台目用のホスト変数ファイルを作成します。

```yml:host_vars/bigip02.yml
---
bigip_license: XXXXX-XXXXX-XXXXX-XXXXX-XXXXXXX
bigip_server: [BIG-IPのIPアドレス]
bigip_fqdn: bigip02.example.com

bigip_selfip:
  - { name: "10.1.0.2", address: "10.1.0.2", netmask: "255.255.255.0", vlan: "external", allow_service: "none" }
  - { name: "10.2.0.2", address: "10.2.0.2", netmask: "255.255.255.0", vlan: "internal", allow_service: "none" }
```

## 前準備５：HA通信用インタフェース追加
コンフィグ同期や冗長監視などで使用するHA通信用インタフェースをホスト変数ファイルの`bigip_selfip`の変数を指定した個所に追加しておきます。

HA通信用のインタフェースで、冗長制御用の通信をやり取りするので、HA通信用のセルフIPは`allow_service`をデフォルトにしておきます。

```yml:host_vars/bigip01.yml
（抜粋）
bigip_selfip:
  - { name: "10.1.0.1", address: "10.1.0.1", netmask: "255.255.255.0", vlan: "external", allow_service: "none" }
  - { name: "10.2.0.1", address: "10.2.0.1", netmask: "255.255.255.0", vlan: "internal", allow_service: "none" }
  - { name: "10.3.0.1", address: "10.3.0.1", netmask: "255.255.255.252", vlan: "ha", allow_service: "default" }
```

```yml:host_vars/bigip02.yml
（抜粋）
bigip_selfip:
  - { name: "10.1.0.2", address: "10.1.0.2", netmask: "255.255.255.0", vlan: "external", allow_service: "none" }
  - { name: "10.2.0.2", address: "10.2.0.2", netmask: "255.255.255.0", vlan: "internal", allow_service: "none" }
  - { name: "10.3.0.2", address: "10.3.0.2", netmask: "255.255.255.252", vlan: "ha", allow_service: "default" }
```

## 前準備６：負荷分散設定用ロールにフラグ追加
[前回](https://qiita.com/sakai00kou/items/769470f9489838815579)作成した`setup_bigip-node`、`setup_bigip-pool`、`setup_bigip-virtual-server`の`tasks`に以下の条件式を追加しておきます。

```yml:roles/setup_bigip-xxx/tasks/main.yml
（途中省略）
  when: ha_flag == "master"
```

以下`setup_bigip-node`に`ha_flag`を追加した場合の例なので、他のロールにも追加するようにして下さい。

```yml:roles/setup_bigip-node/tasks/main.yml
---
# tasks file for setup_bigip-node
- name: BIG-IP 負荷分散ノードの作成
  bigip_node:
    name: "{{ item.name }}"
    description: "{{ item.description }}"
    host: "{{ item.host }}"
    monitors: "{{ item.monitors }}"
    ratio: "{{ item.ratio }}"
    connection_limit: "{{ item.connection_limit }}"
    rate_limit: "{{ item.rate_limit }}"
    state: "present"
    provider: "{{ bigip_provider }}"
  delegate_to: "{{ bigip_delegate_to }}"
  when: ha_flag == "master"    ←追加
  notify: save_config
  loop: "{{ bigip_node }}"
```

後ほど変数を追加しますが、上記設定追加により、`ha_flag`が`master`の場合のみ処理が実行されるようになります。（いわゆるif文のような動作）

# おわりに
今回は、冗長設定を行う前の準備を行いました。

次回は冗長化設定を行うためのロール作成を行っていきます。