Ansible でBIG-IPを設定してみた

早速、AnsibleからBIG-IPを設定してみる実験をしてみました。まぁ、、、普通に動くんでしょうけど、やっぱり、実際に動かしてみるのが一番理解が深まります。

OSは適当なCentOSを用意して、yum install ansible でansibleをインストールします。以下、念のため、ansibleのバージョンです。

[daijik@centos-docker-test ~]$ ansible --version
ansible 1.9.4
configured module search path = None

 Ansibleでは管理対象とするサーバーは/etc/ansible/hostsに記述するので、以下のように、管理対象とするBIG-IPのホスト名(または管理用IPアドレス)を追加しておきます。

因みに、今回の実験ではBIG-IPの仮想アプライアンスKVM上で動かしてやってみました。サクサク動きますし、日頃からLinuxを使っている方にとっては、とても取っ付きやすいと思います。BIG-IPは期間限定の評価版などがあります。以下のURLから入手可能です。

https://f5.com/jp/products/trials/product-trials

「/etc/ansible/hosts」

# This is the default ansible 'hosts' file.
#
# It should live in /etc/ansible/hosts
#
#   - Comments begin with the '#' character
#   - Blank lines are ignored
#   - Groups of hosts are delimited by [header] elements
#   - You can enter hostnames or ip addresses
#   - A hostname/ip can be a member of multiple groups

# Ex 1: Ungrouped hosts, specify before any group headers.

green.example.com
blue.example.com
192.168.100.1
192.168.100.10

[bigip]
192.168.122.95

尚、Ansibleは管理対象とするサーバーへSSHログインを行います。その際、パスワードをつかったログインも可能ですが、本格的な自動化のためには、公開鍵をつかったSSHログインが出来るようにしておくのがベターでしょう。

 /etc/ansible/hostsファイルの編集が出来たら、pingモジュールを使って、疎通確認をしておきましょう。

pingモジュールでテスト」

[daijik@centos-docker-test ~]$ ansible bigip -m ping
192.168.122.95 | success >> {
"changed": false,
"ping": "pong"
}

うまく疎通出来ているようです。

この先の作業はplaybookを使います。 たとえば、上のコマンドをplaybookにすると以下のような感じになります。

pingのplaybook化」

---
- hosts: bigip #対象を指定。allは全ホスト
  remote_user: daijik #ここで特に指定しない場合、ansibleを実行したサーバと同じ
  tasks: #実行するtaskを以下に指定
   - name: pingしてみる #taskの名前
     ping:

そして、このplaybookを実行してみます。 

[daijik@centos-docker-test ~]$ ansible-playbook myplaybook.yml

PLAY [bigip] ******************************************************************

GATHERING FACTS ***************************************************************
ok: [192.168.122.95]

TASK: [pingしてみる] ******************************************************
ok: [192.168.122.95]

PLAY RECAP ********************************************************************
192.168.122.95 : ok=2 changed=0 unreachable=0 failed=0 

期待通り、BIG-IPとの疎通確認が出来ているようです。

さて、ここまで準備が出来れば、実際にBIG-IPに対して色々な命令が送れるはずです。色々な機能が実装されているようですが、今回は分かり易いユースケースとして、以下の内容を試してみます。

  1. 負荷分散対象とするサーバープールの設定
  2. 負荷分散アルゴリズムの設定
  3. 設定した内容の一括削除

他にもいくつか出来ることはありそうだけど、、、とりあえず、こんだけ。早速、1のシナリオを実現するための、playbookを作ります。

サーバープールの詳細ですが、以下のような内容にしてみようと思います。

  • ansible-poolという名前のサーバープールを作成する
  • その中に、3つのサーバーのIPアドレス:ポートを登録する(192.168.150.10:80、192.168.150.20:80、192.168.150.30:80)
  • 負荷分散のアルゴリズムは、least_connection_memberを設定する。TCPのコネクション数が少ないサーバーに転送する仕組みです。

負荷分散対象とするサーバープールの設定(my_bigip_create_pool.yml)

---
- hosts: bigip
  tasks:
  - name: プールを作成
    local_action: >
      bigip_pool
      server=192.168.122.95
      user=admin
      password=admin
      state=present
      name=ansible-pool
      lb_method=least_connection_member
      slow_ramp_time=120

  - name: プールメンバーを追加(1つ目)
    local_action: >
      bigip_pool
      server=192.168.122.95
      user=admin
      password=admin
      state=present
      name=ansible-pool
      host=192.168.150.10
      port=80

  - name: プールメンバーを追加(2つ目)
    local_action: >
      bigip_pool
      server=192.168.122.95
      user=admin
      password=admin
      state=present
      name=ansible-pool
      host=192.168.150.20
      port=80

  - name: プールメンバーを追加(3つ目)
    local_action: >
      bigip_pool
      server=192.168.122.95
      user=admin
      password=admin
      state=present
      name=ansible-pool
      host=192.168.150.30
      port=80

  

さぁ!実行してみましょう!するとエラーが出ます。。。

とりあえず動かしてみる(失敗する編)

[daijik@centos-docker-test ~]$ ansible-playbook my_bigip_create_pool.yml

PLAY [bigip] ******************************************************************

GATHERING FACTS ***************************************************************
ok: [192.168.122.95]

TASK: [Collect BIG-IP facts] **************************************************
failed: [192.168.122.95 -> 127.0.0.1] => {"failed": true}
msg: the python suds and bigsuds modules is required

FATAL: all hosts have already failed -- aborting

PLAY RECAP ********************************************************************
to retry, use: --limit @/home/daijik/mybigip.retry

192.168.122.95 : ok=1 changed=0 unreachable=0 failed=1

 エラーメッセージが出ていますね。bigsuds というモジュールが必要だ、と言われています。実は bigsuds というモジュールはF5のDevCentralというコミュニティに公開されているモジュールでして、以下のサイトから入手が可能となっています。(もしかすると、DevCentralへのユーザー登録は必要かもしれません。タダです)

bigsudsのダウンロード

https://devcentral.f5.com/articles/getting-started-with-bigsuds-ndasha-new-python-library-for-icontrol 

bigsudsのインストール

# sudo python setup.py install

bigsudsのインストールが完了したら、もう一度、試してみます。その前に、一度、BIG-IPの管理コンソールにログインをして、現在の状態を確認しておきましょう。

 

Screenshot from 2016-03-30 16-37-52

 この画面は「サーバープールの一覧」を表示させています。一つ、作成済みの状態ですが、今回のテストとは関係ありませんので無視してください。この状態を初期状態とします。

 さて、現在の状態も確認できたので、もう一度、ansibleでplaybookを実行します。

[daijik@centos-docker-test ~]$ ansible-playbook my_bigip_create_pool.yml

PLAY [bigip] ******************************************************************

GATHERING FACTS ***************************************************************
ok: [192.168.122.95]

TASK: [プールを作成] ****************************************************
changed: [192.168.122.95 -> 127.0.0.1]

TASK: [プールメンバーを追加(1つ目)] *************************
changed: [192.168.122.95 -> 127.0.0.1]

TASK: [プールメンバーを追加(2つ目)] *************************
changed: [192.168.122.95 -> 127.0.0.1]

TASK: [プールメンバーを追加(3つ目)] *************************
changed: [192.168.122.95 -> 127.0.0.1]

PLAY RECAP ********************************************************************
192.168.122.95 : ok=5 changed=4 unreachable=0 failed=0

今度はエラーとならず、正常に実行できました。BIG-IPの管理コンソールでも見てみましょう。

Screenshot from 2016-03-30 16-38-21

 

「ansible-pool」というものが作成されています。プール名をクリックすると詳細が見られます。

Screenshot from 2016-03-30 16-38-41

期待通り、3つのサーバーが登録されています。負荷分散のアルゴリズムもLeast Connectionになっています。期待通り、AnsibleからBIG-IPへ、設定をいれることが出来たようです。

一度、Playbookの作り方さえ覚えてしまえば、OSやミドルウェアの設定だけではなく、ネットワークの設定まで宣言的に出来て、自動化することができるので、インフラ/アプリケーションの運用担当者にとっては、かなり楽になるツールなんじゃないか、と期待できます。Ansibleは使い方が簡単なのも良いですね。

さて、最後に、今回作成したサーバープールはお掃除しておきましょう。

サーバープールの削除(my_bigip_delete_pool.yml)

---
- hosts: bigip
  tasks:
  - name: プールを削除
    local_action: >
      bigip_pool
      server=192.168.122.95
      user=admin
      password=admin
      state=absent
      name=ansible-pool

 そして、実行。

[daijik@centos-docker-test ~]$ ansible-playbook my_bigip_delete_pool.yml 

PLAY [bigip] ****************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [192.168.122.95]

TASK: [プールを削除] **************************************************** 
changed: [192.168.122.95 -> 127.0.0.1]

PLAY RECAP ******************************************************************** 
192.168.122.95             : ok=2    changed=1    unreachable=0    failed=0   

 最後に確認。

Screenshot from 2016-03-30 16-37-52

元の状態に戻りました。

 

まとめ 

  • 想定どおり、BIG-IP LTMのオブジェクトの構成管理が出来ることが確認できた。
  • ただし、操作できる対象は、VIPやプールやプールメンバーといった「よく使うオブジェクトのよく使うパラメータだけ」という印象。あまり細かいところまでは手を出そうと思わないほうが良いだろう。
  • 現状では、Interface / VLAN のようなシステムレベルでの設定や、ライセンス関連の操作は行うことが出来無い(モジュールとして用意されていない)ので、このあたりもマニュアルで対処する必要がありそう。

 

  • まぁ、予想通りの結果でした(^^)v