Exercise 1.4: Adding members to a pool on F5

Read this in other languages: uk English, japan 日本語.

Table of Contents

Objective

Demonstrate use of the BIG-IP pool member module to tie web server nodes into the load balancing pool http_pool created in the previous exercises.

Guide

Step 1:

Using VSCode create a new file called bigip-pool-members.yml by clicking the new file icone in the left pane.

picture of create file icon

Step 2:

Enter the following play definition into bigip-pool-members.yml:

---
- name: BIG-IP SETUP
  hosts: lb
  connection: local
  gather_facts: false

Do not exit the editor yet.

Step 3

Next, append the first task to above playbook. This task will use the bigip_pool_member module configure the two RHEL web servers as nodes on the BIG-IP F5 load balancer.

  tasks:
    - name: ADD POOL MEMBERS
      f5networks.f5_modules.bigip_pool_member:
        provider:
          server: "{{private_ip}}"
          user: "{{ansible_user}}"
          password: "{{ansible_password}}"
          server_port: 8443
          validate_certs: false
        state: "present"
        name: "{{hostvars[item].inventory_hostname}}"
        host: "{{hostvars[item].ansible_host}}"
        port: "80"
        pool: "http_pool"
      loop: "{{ groups['web'] }}"

Explanation of each line within the task:

Next we have module parameters

Save the file and exit out of editor.

Step 4

Run the playbook - Go back to the Terminal on VS Code server and execute the following:

[student1@ansible ~]$ ansible-navigator run bigip-pool-members.yml --mode stdout

Playbook Output

The output will look as follows.

[student1@ansible ~]$ ansible-navigator run bigip-pool-members.yml --mode stdout

PLAY [BIG-IP SETUP] ************************************************************

TASK [ADD POOL MEMBERS] ********************************************************
changed: [f5] => (item=node1)
changed: [f5] => (item=node2)

PLAY RECAP *********************************************************************
f5                         : ok=1    changed=1    unreachable=0    failed=0

Output parsing

Let’s use the bigip_device_info to collect the pool members on BIG-IP. JSON query is a powerful filter that can be used. Please go through before proceeding

[student1@ansible ~]$ nano display-pool-members.yml

Enter the following:

---
- name: "List pool members"
  hosts: lb
  gather_facts: false
  connection: local

  tasks:
    - name: Query BIG-IP facts
      f5networks.f5_modules.bigip_device_info:
        provider:
          server: "{{private_ip}}"
          user: "{{ansible_user}}"
          password: "{{ansible_password}}"
          server_port: 8443
          validate_certs: false
        gather_subset:
          - ltm-pools
      register: bigip_device_facts

    - name: "View complete output"
      debug: "msg={{bigip_device_facts}}"

    - name: "Show members belonging to pool"
      debug: "msg={{item}}"
      loop: "{{bigip_device_facts.ltm_pools | community.general.json_query(query_string)}}"
      vars:
        query_string: "[?name=='http_pool'].members[*].name[]"

Execute the playbook in the VS Code terminal

[student1@ansible ~]$ ansible-navigator run display-pool-members.yml --mode stdout

Output

[student1@ansible 1.4-add-pool-members]$ ansible-navigator run display-pool-members.yml --mode stdout

PLAY [List pool members] ******************************************************

TASK [Query BIG-IP facts] *****************************************************
changed: [f5]

TASK [View complete output] ***************************************************
ok: [f5] =>
  msg:
    changed: true
    ltm_pools:
    - allow_nat: 'yes'
      allow_snat: 'yes'
      client_ip_tos: pass-through
      client_link_qos: pass-through
      full_path: /Common/http_pool
      ignore_persisted_weight: 'no'
      lb_method: round-robin
      members:
      - address: 54.191.xx.xx
        connection_limit: 0
        dynamic_ratio: 1
        ephemeral: 'no'
        fqdn_autopopulate: 'no'
        full_path: /Common/node1:80
        inherit_profile: 'yes'
        logging: 'no'
        monitors: []
        name: node1:80
        partition: Common
        priority_group: 0
        rate_limit: 'no'
        ratio: 1
        state: disabled
      - address: 54.200.xx.xx
        connection_limit: 0
        dynamic_ratio: 1
        ephemeral: 'no'
        fqdn_autopopulate: 'no'
        full_path: /Common/node2:80
        inherit_profile: 'yes'
        logging: 'no'
        monitors: []
        name: node2:80
        partition: Common
        priority_group: 0
        rate_limit: 'no'
        ratio: 1
        state: disabled
      minimum_active_members: 0
      minimum_up_members: 0
      minimum_up_members_action: failover
      minimum_up_members_checking: 'no'
      monitors:
      - /Common/http
      name: http_pool
      priority_group_activation: 0
      queue_depth_limit: 0
      queue_on_connection_limit: 'no'
      queue_time_limit: 0
      reselect_tries: 0
      server_ip_tos: pass-through
      server_link_qos: pass-through
      service_down_action: none
      slow_ramp_time: 10

TASK [Show members belonging to pool] *****************************************
ok: [f5] => (item=node1:80) =>
  msg: node1:80
ok: [f5] => (item=node2:80) =>
  msg: node2:80

PLAY RECAP ********************************************************************
f5                         : ok=3    changed=1    unreachable=0    failed=0

Solution

The finished Ansible Playbook is provided here for an Answer key. Click here: bigip-pool-members.yml.

Verifying the Solution

Login to the F5 with your web browser to see what was configured. Grab the IP information for the F5 load balancer from the lab_inventory/hosts file, and type it in like so: https://X.X.X.X:8443/

Login information for the BIG-IP:

The pool will now show two members (node1 and node2). Click on Local Traffic-> then click on Pools. Click on http_pool to get more granular information. Click on the Members tab in the middle to list all the Members. f5members

You have finished this exercise. Click here to return to the lab guide