BIG-IP Virtual Editionを使ってみる。（その４：Ansibleによる初期設定）

# はじめに
前回は`Ansible`を使って`BIG-IP`のライセンスアクティベートの`Playbook`を作成したため、今回はその他初期設定を行う`Playbook`を作成してみたいと思います。

今回も前回と同様、「[F5自動化の取り組みとAnsiblex BIG-IP Playbookユースケースのご紹介](https://redhat.lookbookhq.com/automates-tokyo-2020/ansible-f5-webinar-1)」を参考に進めていきます。

- 【前】[BIG-IP Virtual Editionを使ってみる。（その３：Ansibleによるライセンスアクティベート）](https://qiita.com/sakai00kou/items/753a0e402d244f80e135)
- 【次】[BIG-IP Virtual Editionを使ってみる。（その５：Ansibleによる負荷分散設定）](https://qiita.com/sakai00kou/items/769470f9489838815579)

# BIG-IPの初期設定
`BIG-IP`のGUI管理画面から初期設定を行う場合、ライセンスのアクティベート以外に少なくともマネジメントポートに関連する設定を設定する必要があります。

また、マネジメントポート以外のポートにはデフォルトでは何も設定されていないため、使用ポートに対してIPアドレスも割り振るようにしてみようと思います。

尚、今回の`Playbook`作成は、前回作成した`Playbook`に追加する形で作成するため、前回と異なる部分のみ説明していきます。

前回と同様の箇所は前回の記事を参照ください。

# Ansible Playbookの作成
初期設定用として新しくロールを作成します。

|ロール名|説明|
|:--|:--|
|setup_bigip-initconf|BIG-IPの初期設定を行うロール|

## ロールの作成
前回と同様、`ansible-galaxy`のコマンドで`Playbook`雛形を作成します。

```shell:ansible-galaxyコマンドでのロール雛形作成
cd roles/
ansible-galaxy init setup_bigip-initconf
```

## tasksの作成
「[F5自動化の取り組みとAnsiblex BIG-IP Playbookユースケースのご紹介](https://redhat.lookbookhq.com/automates-tokyo-2020/ansible-f5-webinar-1)」の「**BIG-IP初期セットアップ**」で設定している内容をすべて設定していきます。

また、DHCPでアドレスが変わってしまうと都合が悪いので、追加で、マネジメントポートのDHCPを無効化してマネジメントポート用デフォルトルートも設定しておきます。

各`tasks`に定義している`notify`の処理は、この後作成しますが、`tasks`で何か設定が変更された場合にコンフィグを`save`するようにします。

```yml:roles/setup_bigip-initconf/tasks/main.yml
---
# tasks file for setup_bigip-initconf
- name: BIG-IP ManagementポートのDHCP無効化とGUIセットアップ無効化
  bigip_sys_global:
    gui_setup: "no"
    mgmt_dhcp: "no"
    state: "present"
    provider: "{{ bigip_provider }}"
  delegate_to: "{{ bigip_delegate_to }}"
  notify: save_config

- name: BIG-IP Managementポートのルーティング設定
  bigip_management_route:
    name: "{{ item.name }}"
    description: "{{ item.description }}"
    gateway: "{{ item.gateway }}"
    network: "{{ item.network }}"
    state: "present"
    provider: "{{ bigip_provider }}"
  delegate_to: "{{ bigip_delegate_to }}"
  notify: save_config
  loop: "{{ bigip_management_route }}"

- name: BIG-IP ホスト名の設定
  bigip_hostname:
    hostname: "{{ bigip_fqdn }}"
    provider: "{{ bigip_provider }}"
  delegate_to: "{{ bigip_delegate_to }}"
  notify: save_config

- name: BIG-IP インタフェースVLANの作成
  bigip_vlan:
    untagged_interface: "{{ item.untagged_interface }}"
    name: "{{ item.name }}"
    tag: "{{ item.tag }}"
    state: "present"
    provider: "{{ bigip_provider }}"
  delegate_to: "{{ bigip_delegate_to }}"
  notify: save_config
  loop: "{{ bigip_interface }}"

- name: BIG-IP Self IPの作成
  bigip_selfip:
    name: "{{ item.name }}"
    address: "{{ item.address }}"
    netmask: "{{ item.netmask }}"
    vlan: "{{ item.vlan }}"
    state: "present"
    provider: "{{ bigip_provider }}"
  delegate_to: "{{ bigip_delegate_to }}"
  notify: save_config
  loop: "{{ bigip_selfip }}"

- name: BIG-IP DNSの設定
  bigip_device_dns:
    name_servers: "{{ item.name_servers }}"
    state: "present"
    provider: "{{ bigip_provider }}"
  delegate_to: "{{ bigip_delegate_to }}"
  notify: save_config
  loop: "{{ bigip_dns }}"

- name: BIG-IP NTPの設定
  bigip_device_ntp:
    ntp_servers: "{{ item.ntp_servers }}"
    timezone: "{{ item.timezone }}"
    state: "present"
    provider: "{{ bigip_provider }}"
  delegate_to: "{{ bigip_delegate_to }}"
  notify: save_config
  loop: "{{ bigip_ntp }}"
```

## コンフィグ保存用handlerの作成
上述の通り、`tasks`の定義で何かしら変更が加わった場合にコンフィグを`save`する処理を加えます。

`tasks`の定義ではすべての定義に`notify`でコンフィグを`save`する処理を加えていますが、`tasks`の中の処理で複数の設定が変更された場合でも、一度だけしか実行されない仕組みとなっているため、`tasks`の回数分コンフィグの`save`が行われるわけではありません。

```yml:roles/setup_bigip-initconf/handlers/main.yml
---
# handlers file for setup_bigip-initconf
- name: save_config
  bigip_config:
    save: "yes"
    provider: "{{ bigip_provider }}"
  delegate_to: "{{ bigip_delegate_to }}"
```

## グループ変数の作成
前回作成したグループ変数に今回使用する変数を追記します。

各種設定は環境に合わせて修正して下さい。

```yml:group_vars/bigip.yml
---
# BIG-IP SSHログイン設定
ansible_ssh_user: root
ansible_ssh_pass: [CLIパスワード]

# BIG-IP GUIログイン設定
bigip_user: admin
bigip_password: [GUIパスワード]
bigip_delegate_to: localhost

# Provider設定
bigip_provider:
  server: "{{ bigip_server }}"
  user: "{{ bigip_user }}"
  password: "{{ bigip_password }}"
  server_port: 443
  validate_certs: no

# Managementポートのルーティング設定
bigip_management_route:
  - { name: "default", description: "Default Route", gateway: "192.168.242.1", network: "0.0.0.0/0" }

# インタフェース設定
bigip_interface:
  - { untagged_interface: "1.1", name: "external", tag: "10" }
  - { untagged_interface: "1.2", name: "internal", tag: "20" }

# DNS設定
bigip_dns:
  - { name_servers: ["8.8.8.8", "8.8.4.4"] }

# NTP設定
bigip_ntp:
  - { ntp_servers: ["ntp.nict.jp", "time.google.com"], timezone: "Asia/Tokyo" }
```

## ホスト変数の作成
グループ変数と同様、前回のホスト変数に追記します。

尚、`BIG-IP`のホスト名設定はFQDNで指定する必要があるので、`bigip_fqdn`の変数にFQDNでホスト名を指定してください。

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

bigip_selfip:
  - { name: "10.1.0.1", address: "10.1.0.1", netmask: "255.255.255.0", vlan: "external" }
  - { name: "10.2.0.1", address: "10.2.0.1", netmask: "255.255.255.0", vlan: "internal" }
```

## グループごとのロール実行ファイルの作成
今回作成した`setup_bigip-initconf`ロールを追記します。

```yml:bigip.yml
---
- hosts: bigip
  gather_facts: no
  roles:
    - setup_bigip-license
    - setup_bigip-initconf
```

## 全体のロール実行ファイルの作成
前回のファイルの内容と同じになるので割愛。

# Playbookの依存関係設定
「グループごとのロール実行ファイルの作成」で、`setup_bigip-license`と`setup_bigip-initconf`のロールを指定しましたが、`Playbook`を実行する場合、記載した順番に実行されるわけではなく、順不同で実行されます。

そのため、別のロールの後に実行しなければいけないような処理がある場合、失敗する場合があります。

そのような場合、`dependencies`で各ロールの依存関係を指定することで、想定通りの順番で実行されるため、今回は`dependencies`の設定を行って、先に`setup_bigip-license`が実行されるように設定します。

## metaの作成
`Ansible`の[ベストプラクティス](https://docs.ansible.com/ansible/2.9_ja/user_guide/playbooks_best_practices.html)構成の場合、各ロールディレクトリの配下にある`meta`ディレクトリの中に内容を記載します。

`ansible-galaxy init`コマンドでロールの雛形を作成した場合、`meta`配下の`main.yml`には色々とコメント等記載されておりますが、内容を削除して新たに作成しても、編集して使用しても良いです。

今回は雛形をそのまま使用し、最後の`dependencies: []`の箇所をコメントアウトした上で、新たに今回の`dependencies`設定を加えることにします。

```yml:roles/setup_bigip-initconf/meta/main.yml
(略)
#dependencies: []    ←コメントアウトする。
  # List your role dependencies here, one per line. Be sure to remove the '[]' above,
  # if you add dependencies to this list.

dependencies:
  - setup_bigip-license
```

# Ansibleの実行
作成したロールを実行していきます。

`site.yml`を実行すれば、前回から変更を加えた`bigip.yml`が読み込まれるため、実行コマンドは前回と同じコマンドで問題ありません。

実行した結果、`failed`や`unreachable`が出力されなければ成功です。

```shell:Playbookの実行
ansible-playbook -i hosts-all site.yml
```

# おわりに
今回は初期セットアップで行う基本的な設定を`Ansible`の`Playbook`にまとめました。

次回は負荷分散用の設定を行ってみようと思います。