Training Course for Ansible Automation Platform
This project is maintained by ericzji
Read this in other languages: 
 English,  
 日本語.
BIG-IPで設定のロールバックを実行するためのさまざまなモジュールの使用方法を説明します。
テキストエディアで新しいファイル bigip-error-handling.yml を作成します。
[student1@ansible ~]$ nano bigip-error-handling.yml
vimとnanoがコントールノードで利用できます。もしくは RDP で接続して Visual Studio と Atom を利用することも可能です。
以下の play 定義を bigip-error-handling.yml に追加してください:
---
- name: BIG-IP SETUP
  hosts: lb
  connection: local
  gather_facts: no
--- はこのファイルが YAML であることを示します。hosts: lb はこのプレイブックが lb グループのみで実行されることを示しています。 本演習では、BIG-IP機器は1つだけですが、もし複数台が設定されている場合には同時に設定されます。connection: local は Playbook がローカル実行されることを示します。gather_facts: no Fact 情報の収集を無効にします。この演習では Playbook の中で Fact 情報を利用しません。プロバイダ値を設定するために set_fact を含む tasks を追加します。
---
- name: BIG-IP SETUP
  hosts: lb
  connection: local
  gather_facts: no
  tasks:
  - name: Setup provider
    set_fact:
      provider:
        server: "{{private_ip}}"
        user: "{{ansible_user}}"
        password: "{{ansible_ssh_pass}}"
        server_port: "8443"
        validate_certs: "no"
次に、block 句とタスクを追加します。タスク演習 1.2 - F5 BIG-IPへノードを追加 で実行した bigip_node です。
---
- name: BIG-IP SETUP
  hosts: lb
  connection: local
  gather_facts: no
  tasks:
  - name: Setup provider
    set_fact:
      provider:
        server: "{{private_ip}}"
        user: "{{ansible_user}}"
        password: "{{ansible_ssh_pass}}"
        server_port: "8443"
        validate_certs: "no"
  - name: Setup and graceful rollback BIG-IP configuration
    block:
      - name: CREATE NODES
        bigip_node:
          provider: "{{provider}}"
          host: "{{hostvars[item].ansible_host}}"
          name: "{{hostvars[item].inventory_hostname}}"
        loop: "{{ groups['webservers'] }}"
次に、 演習 1.3 - プールの追加 で利用されたbigip_pool のタスクを追加します。
---
- name: BIG-IP SETUP
  hosts: lb
  connection: local
  gather_facts: no
  tasks:
  - name: Setup provider
    set_fact:
      provider:
        server: "{{private_ip}}"
        user: "{{ansible_user}}"
        password: "{{ansible_ssh_pass}}"
        server_port: "8443"
        validate_certs: "no"
  - name: Setup and graceful rollback BIG-IP configuration
    block:
      - name: CREATE NODES
        bigip_node:
          provider: "{{provider}}"
          host: "{{hostvars[item].ansible_host}}"
          name: "{{hostvars[item].inventory_hostname}}"
        loop: "{{ groups['webservers'] }}"
      - name: CREATE POOL
        bigip_pool:
          provider: "{{provider}}"
          name: "http_pool"
          lb_method: "round-robin"
          monitors: "/Common/http"
          monitor_type: "and_list"
次タスクでは 演習 1.4 - メンバーをプールへ追加 で説明した bigip_pool_member を使用します。
---
- name: BIG-IP SETUP
  hosts: lb
  connection: local
  gather_facts: no
  tasks:
  - name: Setup provider
    set_fact:
      provider:
        server: "{{private_ip}}"
        user: "{{ansible_user}}"
        password: "{{ansible_ssh_pass}}"
        server_port: "8443"
        validate_certs: "no"
  - name: Setup and graceful rollback BIG-IP configuration
    block:
      - name: CREATE NODES
        bigip_node:
          provider: "{{provider}}"
          host: "{{hostvars[item].ansible_host}}"
          name: "{{hostvars[item].inventory_hostname}}"
        loop: "{{ groups['webservers'] }}"
      - name: CREATE POOL
        bigip_pool:
          provider: "{{provider}}"
          name: "http_pool"
          lb_method: "round-robin"
          monitors: "/Common/http"
          monitor_type: "and_list"
      - name: ADD POOL MEMBERS
        bigip_pool_member:
          provider: "{{provider}}"
          state: "present"
          name: "{{hostvars[item].inventory_hostname}}"
          host: "{{hostvars[item].ansible_host}}"
          port: "80"
          pool: "http_pool"
        loop: "{{ groups['webservers'] }}"
次に演習 1.5 - Virtual Server の追加で使用した bigip_virtual_server タスクを追加します。
---
- name: BIG-IP SETUP
  hosts: lb
  connection: local
  gather_facts: no
  tasks:
  - name: Setup provider
    set_fact:
      provider:
        server: "{{private_ip}}"
        user: "{{ansible_user}}"
        password: "{{ansible_ssh_pass}}"
        server_port: "8443"
        validate_certs: "no"
  - name: Setup and graceful rollback BIG-IP configuration
    block:
      - name: CREATE NODES
        bigip_node:
          provider: "{{provider}}"
          host: "{{hostvars[item].ansible_host}}"
          name: "{{hostvars[item].inventory_hostname}}"
        loop: "{{ groups['webservers'] }}"
      - name: CREATE POOL
        bigip_pool:
          provider: "{{provider}}"
          name: "http_pool"
          lb_method: "round-robin"
          monitors: "/Common/http"
          monitor_type: "and_list"
      - name: ADD POOL MEMBERS
        bigip_pool_member:
          provider: "{{provider}}"
          state: "present"
          name: "{{hostvars[item].inventory_hostname}}"
          host: "{{hostvars[item].ansible_host}}"
          port: "80"
          pool: "http_pool"
        loop: "{{ groups['webservers'] }}"
      - name: ADD VIRTUAL SERVER
        bigip_virtual_server:
          provider: "{{provider}}"
          name: "vip"
          destination: "{{private_ip}}"
          port: "443"
          enabled_vlans: "all"
          all_profiles: ['http','clientssl','oneconnect']
          pool: "http_pool"
          snat: "Automap1"
次に、rescue 句を追加します。rescue 句に配置されるタスクは、 演習 2.1 - コンフィグの削除 と同じです。ノードとプールを削除するとすべての構成が削除されるため、bigip_pool_member タスクを再入力する必要はありません。block 内のいずれかのタスクが失敗すると、rescue が順番に実行されます。VIP、プール、およびノードは適切に削除されます。
---
- name: BIG-IP SETUP
  hosts: lb
  connection: local
  gather_facts: no
  tasks:
  - name: Setup provider
    set_fact:
      provider:
        server: "{{private_ip}}"
        user: "{{ansible_user}}"
        password: "{{ansible_ssh_pass}}"
        server_port: "8443"
        validate_certs: "no"
  - name: Setup and graceful rollback BIG-IP configuration
    block:
      - name: CREATE NODES
        bigip_node:
          provider: "{{provider}}"
          host: "{{hostvars[item].ansible_host}}"
          name: "{{hostvars[item].inventory_hostname}}"
        loop: "{{ groups['webservers'] }}"
      - name: CREATE POOL
        bigip_pool:
          provider: "{{provider}}"
          name: "http_pool"
          lb_method: "round-robin"
          monitors: "/Common/http"
          monitor_type: "and_list"
      - name: ADD POOL MEMBERS
        bigip_pool_member:
          provider: "{{provider}}"
          state: "present"
          name: "{{hostvars[item].inventory_hostname}}"
          host: "{{hostvars[item].ansible_host}}"
          port: "80"
          pool: "http_pool"
        loop: "{{ groups['webservers'] }}"
      - name: ADD VIRTUAL SERVER
        bigip_virtual_server:
          provider: "{{provider}}"
          name: "vip"
          destination: "{{private_ip}}"
          port: "443"
          enabled_vlans: "all"
          all_profiles: ['http','clientssl','oneconnect']
          pool: "http_pool"
          snat: "Automap1"
    rescue:
      - name: DELETE VIRTUAL SERVER
        bigip_virtual_server:
          provider: "{{provider}}"
          name: "vip"
          state: absent
      - name: DELETE POOL
        bigip_pool:
          provider: "{{provider}}"
          name: "http_pool"
          state: absent
      - name: DELETE NODES
        bigip_node:
          provider: "{{provider}}"
          name: "{{hostvars[item].inventory_hostname}}"
          state: absent
        loop: "{{ groups['webservers'] }}"
最後に always を追加してrunning config を保存します。
---
- name: BIG-IP SETUP
  hosts: lb
  connection: local
  gather_facts: no
  tasks:
  - name: Setup provider
    set_fact:
      provider:
        server: "{{private_ip}}"
        user: "{{ansible_user}}"
        password: "{{ansible_ssh_pass}}"
        server_port: "8443"
        validate_certs: "no"
  - name: Setup and graceful rollback BIG-IP configuration
    block:
      - name: CREATE NODES
        bigip_node:
          provider: "{{provider}}"
          host: "{{hostvars[item].ansible_host}}"
          name: "{{hostvars[item].inventory_hostname}}"
        loop: "{{ groups['webservers'] }}"
      - name: CREATE POOL
        bigip_pool:
          provider: "{{provider}}"
          name: "http_pool"
          lb_method: "round-robin"
          monitors: "/Common/http"
          monitor_type: "and_list"
      - name: ADD POOL MEMBERS
        bigip_pool_member:
          provider: "{{provider}}"
          state: "present"
          name: "{{hostvars[item].inventory_hostname}}"
          host: "{{hostvars[item].ansible_host}}"
          port: "80"
          pool: "http_pool"
        loop: "{{ groups['webservers'] }}"
      - name: ADD VIRTUAL SERVER
        bigip_virtual_server:
          provider: "{{provider}}"
          name: "vip"
          destination: "{{private_ip}}"
          port: "443"
          enabled_vlans: "all"
          all_profiles: ['http','clientssl','oneconnect']
          pool: "http_pool"
          snat: "Automap1"
    rescue:
      - name: DELETE VIRTUAL SERVER
        bigip_virtual_server:
          provider: "{{provider}}"
          name: "vip"
          state: absent
      - name: DELETE POOL
        bigip_pool:
          provider: "{{provider}}"
          name: "http_pool"
          state: absent
      - name: DELETE NODES
        bigip_node:
          provider: "{{provider}}"
          name: "{{hostvars[item].inventory_hostname}}"
          state: absent
        loop: "{{ groups['webservers'] }}"
    always:
      - name: SAVE RUNNING CONFIGURATION
        bigip_config:
          provider: "{{provider}}"
          save: yes
上記の Playbook では、仮想サーバー、プール、ノードの構成を試みますが、snat値が Automap1 として提供されているため、仮想サーバーの追加は失敗し、rescue が実行されます。
Playbook の実行 - コマンドラインへ戻ったら以下のコマンドでPlaybookを実行してください:
[student1@ansible ~]$ ansible-playbook bigip-error-handling.yml
[student1@ansible ~]$ ansible-playbook bigip-error-handling.yml
[student1@ansible ~]$ ansible-playbook bigip-error-handling.yml
PLAY [BIG-IP SETUP] ****************************************************************************************************
TASK [Setup provider] **************************************************************************************************
ok: [f5]
TASK [CREATE NODES] *****************************************************************************************************
changed: [f5] => (item=host1)
changed: [f5] => (item=host2)
TASK [CREATE POOL] *******************************************************************************************************
changed: [f5]
TASK [ADD POOL MEMBERS] **************************************************************************************************************************
changed: [f5] => (item=host1)
changed: [f5] => (item=host2)
TASK [ADD VIRTUAL SERVER] ***************************************************************************************************************************
fatal: [f5]: FAILED! => {"changed": false, "msg": "0107163f:3: Pool (/Common/Automap1) of type (snatpool) doesn't exist."}
TASK [DELETE VIRTUAL SERVER] **************************************************************************************************************************
ok: [f5]
TASK [DELETE POOL] **************************************************************************************************************************
changed: [f5]
TASK [DELETE NODES] **************************************************************************************************************************
changed: [f5] => (item=host1)
changed: [f5] => (item=host2)
TASK [SAVE RUNNING CONFIGURATION] ***************************************************************************************************************************
changed: [f5]
PLAY RECAP *****************************************************************************************************************
f5                         : ok=8    changed=6    unreachable=0    failed=1
完成したPlaybookのサンプルは bigip-error-handling.yml から参照できます。
本演習は終了です。 Click here to return to the lab guide