Existing Ansible BIG-IP modules

Right around the time that I started at F5, I was at the pinnacle of my exposure to Ansible. So imagine my surprise when I saw BIG-IP modules in the Ansible core product! I immediately wanted to know which one of my colleagues I could go talk Ansible-fu with!

I cracked open the source code, found the names of contributors, made haste to the corporate phone book to look up where they sat, and...wait a second...

...no entries in the phone book?

...that curious look in colleagues eyes that says "I haven't the foggiest idea what you are talking about".

Then it hit me...the BIG-IP modules didn't originate at F5.

Upon further investigation, it became clear to me that, indeed, we had no skin in this game. These modules originated from two enterprising individuals who I found on DevCentral, and I would be remiss to exclude their valuable contributions to the Ansible+F5 cause, so in this post I want to highlight those contributions and bring others up-to-speed on current Ansible+BIG-IP functionality.

Credit where it is due

As far as I can tell from perusing Ansible's git logs, the existing BIG-IP modules in Ansible are the work of Matt Hite and Serge van Ginderachter. Both are DevCentral contributors, and have had a presence in the Ansible community from (at least) 2013 when their modules landed in the tool.

Among the modules that they had a hand in are

  • bigip_facts
  • bigip_node
  • bigip_pool
  • bigip_pool_member
  • bigip_monitor_http
  • bigip_monitor_tcp

Since that time, I've seen even more folks step up to the plate with Ansible modules that will be making their appearance in upcoming releases.

Well, I wanted to have a hand in this work too. I figured I had a perfect opportunity to help because,

  1. I had some background in Ansible
  2. I had access to unlimited BIG-IP technical resources

It was only a question of how to get involved.

And then, Matt posted this in a pull request (PR)...

Unfortunately I don't have GTM to smoke test this with. Can you solicit some testers on the mailing list?

And Serge followed with

So same here, not tested as no GTM gear, but an offline code review.

Bingo...I was in.

If there's one area that I figured I could have the greatest impact, it's the area of technical resources. There is BIG-IP stuff all over the place at F5, and I sit next to, or at least near, many of the people who have knowledge of the products; far more advanced knowledge than I do. Many of those same people hang out and contribute on DevCentral. Paired with my knowledge of Ansible, I figured I could help test BIG-IP related PRs to validate their functionality beyond what a code review offered.

So that's what I did (and what we're about to do).

Before you begin

If you were around for the earlier introductory article to Ansible that I posted a couple days ago, pull up a terminal to that machine. We need to install one more dependency that is common to all of the BIG-IP modules in Ansible;

bigsuds
.

pip install bigsuds

With that in place, you're ready to work with the Ansible modules.

Additionally, I am going to be using a very minimal inventory file that just includes a single BIG-IP. You will want to adjust yours for your environment, but here is mine.

[test]
big-ip01.internal


Note that the name above is available in my local DNS. If you only have an IP address to work with, you can just add that to your inventory file.

For example

[test]
192.168.10.2

Also note that I included a line called

[test]
. In Ansible this is referred to as a group. We will be revisiting this in the future as we begin orchestrating multiple BIG-IPs.

Let's dive in to some of Matt and Serge's BIG-IP modules!

bigip_facts

In Ansible, there is a pattern you often see over and over. This is the pattern of modules that provide information, and modules that change settings. For this tutorial I'll refer to them as,

  • reader
    modules
  • writer
    modules

Without exception,

reader
modules are suffixed with an
_facts
string. While
writer
modules, are not.

So, with that in mind...pop quiz!

  • If I asked you whether the
    bigip_pool
    module was a reader module or a writer module, you would say...writer!
  • If I asked you whether the
    bigip_pool_facts
    module was a reader module or a writer module, you would say...reader!

The bigip_facts module will return to you a number of facts about the BIG-IP in question. Let's take a look.
First, my playbook.

- name: Test bigip_facts
  hosts: test
  connection: local
 
  tasks:
      - name: Get all of the facts from my BIG-IP
        bigip_facts:
            server: "{{ inventory_hostname }}"
            user: "admin"
            password: "admin"
            include: "system_info"

And now, let's just run it to see what sort of output it generates.

ansible-playbook -i hosts site.yaml -vvvv

You should be presented with information resembling the following.

root@debian:~# ansible-playbook -i hosts site.yaml -vvvv
PLAY [Test bigip_facts] *******************************************************
TASK: [Get all of the facts from my BIG-IP] ***********************************
...
ok: [big-ip01.internal] => {"ansible_facts": {"system_info": {"base_mac_address": "8A:83:8B:B1:AE:F7",
"blade_temperature": [], "chassis_slot_information": [], "globally_unique_identifier": "8A:83:8B:B1:AE:F7",
"group_id": "DefaultGroup", "hardware_information": [{"model": "Common KVM processor", "name": "cpus",
"slot": 0, "type": "HARDWARE_BASE_BOARD", "versions": [{"name": "cache size", "value": "4096 KB"}, {"name":
"cores", "value": "2"}, {"name": "cpu MHz", "value": "2199.994"}]}],
...
"os_version": "#1 SMP Mon Aug 11 19:54:07 PDT 2014", "platform": "Z100", "product_category": "Virtual Edition",
"switch_board_part_revision": null, "switch_board_serial": null, "system_name": "Linux"}, "time": {"day": 28,
"hour": 22, "minute": 1, "month": 1, "second": 7, "year": 2016}, "time_zone": {"gmt_offset": -8,
"is_daylight_saving_time": false, "time_zone": "PST"}, "uptime": 854}}, "changed": false}
root@debian:~#

This module can output a lot of information that you can use in later tasks. Note that I just asked for the

system_info
facts, but there are a number of them that you can ask for, including

  • address_class
  • certificate
  • client_ssl_profile
  • device
  • device_group
  • interface
  • key
  • node
  • pool
  • rule
  • self_ip
  • software
  • system_info
  • traffic_group
  • trunk
  • virtual_address
  • virtual_server
  • vlan

You can include multiple types of facts by separating them with a comma. For example

- name: Test bigip_facts
  hosts: test
  connection: local
 
  tasks:
      - name: Get all of the facts from my BIG-IP
        bigip_facts:
            server: "{{ inventory_hostname }}"
            user: "admin"
            password: "admin"
            include: "system_info,software,self_ip"

Returns facts representing the

system_info
,
software
, and self IPs.

You can use the generated facts in later tasks by referencing their JSON keys. For example

- name: Test bigip_facts
  hosts: test
  connection: local
 
  tasks:
      - name: Get all of the facts from my BIG-IP
        bigip_facts:
            server: "{{ inventory_hostname }}"
            user: "admin"
            password: "admin"
            include: "system_info,software,self_ip"
 
      - name: Mention the Self IP
        debug:
            msg: "I have self IP {{ self_ip['/Common/net1'].address }}"
 
      - name: Mention the software
        debug:
            msg: "I have software version {{ software[0].version }}"

And the (truncated) output

...
TASK: [Mention the Self IP] ***************************************************
ok: [big-ip01.internal] => {
    "msg": "I have self IP 10.2.2.2"
}
 
TASK: [Mention the software] **************************************************
ok: [big-ip01.internal] => {
    "msg": "I have software version 11.6.0"
}
...

bigip_node

This module allows you to manipulate nodes in a BIG-IP. Nodes are logical objects on your BIG-IP that identify the IP address of a physical node on your network. In terms of what we can do with them with the existing BIG-IP modules, you can use this module to create nodes that you can later assign to pool members.

First, let's show you the playbook that I'm going to run.

- name: Node shenanigans
  hosts: test
  connection: local
 
  tasks:
      - name: Add a new node
        bigip_node:
            server: "{{ inventory_hostname }}"
            user: "admin"
            password: "admin"
            host: "10.2.1.1"
            name: "member1"

This is a simple example of creating a node in my BIG-IP. As is probably apparent if I am going to be working with pools, I would want to create many nodes. I'll hold off on that until a future example, but hopefully this clarifies the point of how to create the object that we can later assign to pool members.

Let's run it!

ansible-playbook -i hosts site.yaml

And the output we should expect to see looks like this

root@debian:~# ansible-playbook -i hosts site.yaml
 
PLAY [Node shenanigans] *******************************************************
 
TASK: [Add a new node] ********************************************************
changed: [big-ip01.internal]
 
PLAY RECAP ********************************************************************
big-ip01.internal      : ok=1    changed=1    unreachable=0    failed=0
 
root@debian:~#

Now, just to clarify what gets dropped where, and where these nodes can be used, let's first look at the Local Traffic > Nodes screen.

Now, let's navigate over to the pool screen and try to create a new pool. On the new pool creation screen, we have the option of specifying members of that pool. If we click on Node List, well, look at that. Our new node.

bigip_pool

This module allows you to create pools on your BIG-IPs. To these pools we can later add pool members. With this and the

bigip_pool_member
module, you can control the basic load balancing functionality of the BIG-IP.

First, just to prove that I have nothing up my BIG-IP sleeve, here's my current pool list.

And now, for my playbook

- name: Create a pool
  hosts: test
  connection: local
 
  tasks:
      - name: Create the pool1 pool
        bigip_pool:
            server: "{{ inventory_hostname }}"
            user: "admin"
            password: "admin"
            name: "pool1"

With a wave of my magic wand...

root@debian:~# ansible-playbook -i hosts site.yaml
 
PLAY [Create a pool] *******************************************************
 
TASK: [Create the pool1 pool] ***********************************
...
 
changed: [big-ip01.internal] => {"changed": true}
 
PLAY RECAP ********************************************************************
big-ip01.internal      : ok=1    changed=1    unreachable=0    failed=0
 
root@debian:~#

...and my pool list has been changed.

The bigip_pool module has a number of other options that let you adjust settings of the pool. They are all documented on the module's page.

bigip_pool_member

With the bigip_pool_member module, you can manipulate the members of any of the pools on your BIG-IP. This module, in particular, is a crucial part of a rolling upgrade strategy that you may undertake when upgrading software on members of the pool.

Consider the following scenario.

  1. Remove (or disable) the member from the pool
  2. Upgrade the member's software (you pick the software, but let's say Apache for example)
  3. Verify the software upgrade
  4. Add (or enable) the member back to the old pool, or, add the member to a new pool

This module can be used for steps 1 and 4. Let's have a look at my playbook.

- name: Pool member manipulation
  hosts: test
  connection: local
 
  tasks:
      - name: Drop members out of pool1
        bigip_pool_member:
            server: "{{ inventory_hostname }}"
            user: "admin"
            password: "admin"
            state: "absent"
            host: "{{ item }}"
            pool: "pool1"
            port: "22"
        with_items:
            - member1
            - member2
 
      - name: Intermediate processing
        debug:
            msg: "Upgrade some software"
 
      - name: More intermediate processing
        debug:
            msg: "Install some configuration"
 
      - name: Add member1 node back
        bigip_node:
            server: "{{ inventory_hostname }}"
            user: "admin"
            password: "admin"
            name: "{{ item }}"
            host: "10.2.1.1"
            state: "present"
        with_items:
            - member1
 
      - name: Add member2 node back
        bigip_node:
            server: "{{ inventory_hostname }}"
            user: "admin"
            password: "admin"
            name: "{{ item }}"
            host: "10.2.1.2"
            state: "present"
        with_items:
            - member2
 
      - name: Add member1 back to pool1
        bigip_pool_member:
            server: "{{ inventory_hostname }}"
            user: "admin"
            password: "admin"
            host: "{{ item }}"
            pool: "pool1"
            port: "22"
            state: "present"
        with_items:
            - member1
 
      - name: Add member2 to pool2
        bigip_pool_member:
            server: "{{ inventory_hostname }}"
            user: "admin"
            password: "admin"
            host: "{{ item }}"
            pool: "pool2"
            port: "22"
            state: "present"
        with_items:
            - member2

And before we run it, let's just take a peek at my current pools.

As well as the members of pool1

And the members of pool2

Now, let's have a go at running the playbook.

ansible-playbook -i hosts site2.yaml

After it runs, you should have output that resembles something like this.

root@debian:~# ansible-playbook -i hosts site.yaml
 
PLAY [Pool member manipulation] ***********************************************
 
TASK: [Drop members out of pool1] *********************************************
changed: [big-ip01.internal] => (item=member1)
ok: [big-ip01.internal] => (item=member2)
 
TASK: [Intermediate processing] ***********************************************
ok: [big-ip01.internal] => {
    "msg": "Upgrade some software"
}
 
TASK: [More intermediate processing] ******************************************
ok: [big-ip01.internal] => {
    "msg": "Install some configuration"
}
 
TASK: [Add member1 node back] *************************************************
changed: [big-ip01.internal] => (item=member1)
 
TASK: [Add member2 node back] *************************************************
ok: [big-ip01.internal] => (item=member2)
 
TASK: [Add member1 back to pool1] *********************************************
changed: [big-ip01.internal] => (item=member1)
 
TASK: [Add member2 to pool2] **************************************************
ok: [big-ip01.internal] => (item=member2)
 
PLAY RECAP ********************************************************************
big-ip01.internal      : ok=7    changed=3    unreachable=0    failed=0
 
root@debian:~#

And your pool members should be different, check out the screenshots below.

The pool list

Members in pool1

Members in pool2

To Summarize

BIG-IP would not have a presence in Ansible if it were not for Matt and Serge's initiative.

Based on the work they started, I'm happy to assist with testing and contributing new modules moving forward. In my entirely too biased opinion, Ansible fits in well with the tools and products I work on. Perhaps it will also fit in well with your workflow. If we've piqued your interest, then the Ansible mailing list is a great place to ask more Ansible related questions and further solidify your understanding.

If you liked this article and want to see more like it, rate it as such. Have comments? Questions? Something else? Leave a comment below!

References

Updated Jun 06, 2023
Version 2.0

14 Comments

"}},"component({\"componentId\":\"custom.widget.Consent_Blackbar\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[\"board:TechnicalArticles\",\"message:280332\"],\"name\":\"TkbMessagePage\",\"props\":{},\"url\":\"https://community.f5.com\"}}})":{"__typename":"ComponentRenderResult","html":"
"}},"component({\"componentId\":\"custom.widget.Tag_Manager_Helper\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[\"board:TechnicalArticles\",\"message:280332\"],\"name\":\"TkbMessagePage\",\"props\":{},\"url\":\"https://community.f5.com\"}}})":{"__typename":"ComponentRenderResult","html":" "}},"component({\"componentId\":\"custom.widget.Beta_Footer\"})":{"__typename":"Component","render({\"context\":{\"component\":{\"entities\":[],\"props\":{}},\"page\":{\"entities\":[\"board:TechnicalArticles\",\"message:280332\"],\"name\":\"TkbMessagePage\",\"props\":{},\"url\":\"https://community.f5.com\"}}})":{"__typename":"ComponentRenderResult","html":"
 
 
 
 
 

\"F5 ©2024 F5, Inc. All rights reserved.
Trademarks Policies Privacy California Privacy Do Not Sell My Personal Information
"}},"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/QueryHandler\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageCustomFields\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageCustomFields-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageRevision\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageRevision-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageReplyButton\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageReplyButton-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageAuthorBio\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageAuthorBio-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/guides/GuideBottomNavigation\"]})":[{"__ref":"CachedAsset:text:en_US-components/guides/GuideBottomNavigation-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserRank\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserRank-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserRegistrationDate\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserRegistrationDate-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTime\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTime-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/Pager/PagerLoadMorePreviousNextLinkable\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMorePreviousNextLinkable-1728320186000"}],"message({\"id\":\"message:280338\"})":{"__ref":"TkbReplyMessage:message:280338"},"message({\"id\":\"message:280339\"})":{"__ref":"TkbReplyMessage:message:280339"},"message({\"id\":\"message:280340\"})":{"__ref":"TkbReplyMessage:message:280340"},"message({\"id\":\"message:280341\"})":{"__ref":"TkbReplyMessage:message:280341"},"message({\"id\":\"message:280342\"})":{"__ref":"TkbReplyMessage:message:280342"},"message({\"id\":\"message:280333\"})":{"__ref":"TkbReplyMessage:message:280333"},"message({\"id\":\"message:280334\"})":{"__ref":"TkbReplyMessage:message:280334"},"message({\"id\":\"message:280335\"})":{"__ref":"TkbReplyMessage:message:280335"},"message({\"id\":\"message:280336\"})":{"__ref":"TkbReplyMessage:message:280336"},"message({\"id\":\"message:280337\"})":{"__ref":"TkbReplyMessage:message:280337"},"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"components/tags/TagView/TagViewChip\"]})":[{"__ref":"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1728320186000"}],"cachedText({\"lastModified\":\"1728320186000\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/ranks/UserRankLabel\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1728320186000"}]},"CachedAsset:pages-1733222330291":{"__typename":"CachedAsset","id":"pages-1733222330291","value":[{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"TkbViewAllArticlesPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId/all-articles/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"KhorosSignInPage","type":"USER","urlPath":"/kh-signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"IdeaPostPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"ResetPasswordPage","type":"USER","urlPath":"/resetpassword/:userId/:resetPasswordToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1733222330291,"localOverride":null,"page":{"id":"GroupHubPostPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"}],"localOverride":false},"CachedAsset:text:en_US-components/context/AppContext/AppContextProvider-0":{"__typename":"CachedAsset","id":"text:en_US-components/context/AppContext/AppContextProvider-0","value":{"noCommunity":"Cannot find community","noUser":"Cannot find current user","noNode":"Cannot find node with id {nodeId}","noMessage":"Cannot find message with id {messageId}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-0":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-0","value":{"title":"Loading..."},"localOverride":false},"User:user:-1":{"__typename":"User","id":"user:-1","uid":-1,"login":"Former Member","email":"","avatar":null,"rank":null,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":"ANONYMOUS","registrationTime":null,"confirmEmailStatus":false,"registrationAccessLevel":"VIEW","ssoRegistrationFields":[]},"ssoId":null,"profileSettings":{"__typename":"ProfileSettings","dateDisplayStyle":{"__typename":"InheritableStringSettingWithPossibleValues","key":"layout.friendly_dates_enabled","value":"false","localValue":"true","possibleValues":["true","false"]},"dateDisplayFormat":{"__typename":"InheritableStringSetting","key":"layout.format_pattern_date","value":"dd-MMM-yyyy","localValue":"MM-dd-yyyy"},"language":{"__typename":"InheritableStringSettingWithPossibleValues","key":"profile.language","value":"en-US","localValue":"en","possibleValues":["en-US"]}},"deleted":false,"repliesSortOrderSetting":{"__typename":"RepliesUserSortOrderSetting","sortOrder":{"__typename":"InheritableStringSettingWithPossibleValues","key":"config.user_replies_sort_order","value":"DEFAULT"}}},"Theme:customTheme1":{"__typename":"Theme","id":"customTheme1"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bi0zNC0xM2k0MzE3N0Q2NjFBRDg5NDAy\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bi0zNC0xM2k0MzE3N0Q2NjFBRDg5NDAy","mimeType":"image/png"},"Category:category:Articles":{"__typename":"Category","id":"category:Articles","entityType":"CATEGORY","displayId":"Articles","nodeType":"category","depth":1,"title":"Articles","shortTitle":"Articles","parent":{"__ref":"Category:category:top"},"categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:top":{"__typename":"Category","id":"category:top","displayId":"top","nodeType":"category","depth":0,"title":"Top","entityType":"CATEGORY","shortTitle":"Top"},"Tkb:board:TechnicalArticles":{"__typename":"Tkb","id":"board:TechnicalArticles","entityType":"TKB","displayId":"TechnicalArticles","nodeType":"board","depth":2,"conversationStyle":"TKB","title":"Technical Articles","description":"F5 SMEs share good practice.","avatar":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bi0zNC0xM2k0MzE3N0Q2NjFBRDg5NDAy\"}"},"profileSettings":{"__typename":"ProfileSettings","language":null},"parent":{"__ref":"Category:category:Articles"},"ancestors":{"__typename":"CoreNodeConnection","edges":[{"__typename":"CoreNodeEdge","node":{"__ref":"Community:community:zihoc95639"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:Articles"}}]},"userContext":{"__typename":"NodeUserContext","canAddAttachments":false,"canUpdateNode":false,"canPostMessages":false,"isSubscribed":false},"boardPolicies":{"__typename":"BoardPolicies","canPublishArticleOnCreate":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","args":[]}},"canReadNode":{"__typename":"PolicyResult","failureReason":null}},"shortTitle":"Technical Articles","isManualSortOrderAvailable":false,"tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"repliesSortOrderProperties":{"__typename":"RepliesSortOrderProperties","sortOrder":"PUBLISH_TIME"},"tagProperties":{"__typename":"TagNodeProperties","tagsEnabled":{"__typename":"PolicyResult","failureReason":null}},"requireTags":true,"tagType":"FREEFORM_AND_PRESET"},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/cmstNDAtSjVqcG5P\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/cmstNDAtSjVqcG5P","height":0,"width":0,"mimeType":"image/svg+xml"},"Rank:rank:40":{"__typename":"Rank","id":"rank:40","position":17,"name":"Altostratus","color":"CCCCCC","icon":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/cmstNDAtSjVqcG5P\"}"},"rankStyle":"FILLED"},"User:user:217977":{"__typename":"User","id":"user:217977","uid":217977,"login":"Tim_Rupp","deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-9.svg"},"rank":{"__ref":"Rank:rank:40"},"email":"","messagesCount":30,"biography":null,"topicsCount":9,"kudosReceivedCount":1,"kudosGivenCount":0,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2019-05-20T18:22:20.000-07:00","confirmEmailStatus":null,"registrationAccessLevel":null,"ssoRegistrationFields":[]},"followersCount":null,"solutionsCount":0,"ssoId":null},"TkbTopicMessage:message:280332":{"__typename":"TkbTopicMessage","uid":280332,"subject":"Existing Ansible BIG-IP modules","id":"message:280332","revisionNum":2,"author":{"__ref":"User:user:217977"},"depth":0,"hasGivenKudo":false,"helpful":null,"board":{"__ref":"Tkb:board:TechnicalArticles"},"conversation":{"__ref":"Conversation:conversation:280332"},"messagePolicies":{"__typename":"MessagePolicies","canPublishArticleOnEdit":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_edit_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_edit_workflow_action.accessDenied","args":[]}},"canModerateSpamMessage":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","key":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","args":[]}}},"contentWorkflow":{"__typename":"ContentWorkflow","state":"PUBLISH","scheduledPublishTime":null,"scheduledTimezone":null,"userContext":{"__typename":"MessageWorkflowContext","canSubmitForReview":null,"canEdit":false,"canRecall":null,"canSubmitForPublication":null,"canReturnToAuthor":null,"canPublish":null,"canReturnToReview":null,"canSchedule":null},"shortScheduledTimezone":null},"readOnly":false,"editFrozen":false,"moderationData":{"__ref":"ModerationData:moderation_data:280332"},"teaser":"","body":"

Right around the time that I started at F5, I was at the pinnacle of my exposure to Ansible. So imagine my surprise when I saw BIG-IP modules in the Ansible core product! I immediately wanted to know which one of my colleagues I could go talk Ansible-fu with!

\n\n

I cracked open the source code, found the names of contributors, made haste to the corporate phone book to look up where they sat, and...wait a second...

\n\n

...no entries in the phone book?

\n\n

...that curious look in colleagues eyes that says \"I haven't the foggiest idea what you are talking about\".

\n\n

Then it hit me...the BIG-IP modules didn't originate at F5.

\n\n

Upon further investigation, it became clear to me that, indeed, we had no skin in this game. These modules originated from two enterprising individuals who I found on DevCentral, and I would be remiss to exclude their valuable contributions to the Ansible+F5 cause, so in this post I want to highlight those contributions and bring others up-to-speed on current Ansible+BIG-IP functionality.

\n\n

Credit where it is due

\n\n

As far as I can tell from perusing Ansible's git logs, the existing BIG-IP modules in Ansible are the work of Matt Hite and Serge van Ginderachter. Both are DevCentral contributors, and have had a presence in the Ansible community from (at least) 2013 when their modules landed in the tool.

\n\n

Among the modules that they had a hand in are

\n\n\n\n

Since that time, I've seen even more folks step up to the plate with Ansible modules that will be making their appearance in upcoming releases.

\n\n

Well, I wanted to have a hand in this work too. I figured I had a perfect opportunity to help because,

\n\n
  1. I had some background in Ansible
  2. I had access to unlimited BIG-IP technical resources
\n\n

It was only a question of how to get involved.

\n\n

And then, Matt posted this in a pull request (PR)...

\n\n
\n

Unfortunately I don't have GTM to smoke test this with. Can you solicit some testers on the mailing list?

\n
\n\n

And Serge followed with

\n\n
\n

So same here, not tested as no GTM gear, but an offline code review.

\n
\n\n

Bingo...I was in.

\n\n

If there's one area that I figured I could have the greatest impact, it's the area of technical resources. There is BIG-IP stuff all over the place at F5, and I sit next to, or at least near, many of the people who have knowledge of the products; far more advanced knowledge than I do. Many of those same people hang out and contribute on DevCentral. Paired with my knowledge of Ansible, I figured I could help test BIG-IP related PRs to validate their functionality beyond what a code review offered.

\n\n

So that's what I did (and what we're about to do).

\n\n

Before you begin

\n\n

If you were around for the earlier introductory article to Ansible that I posted a couple days ago, pull up a terminal to that machine. We need to install one more dependency that is common to all of the BIG-IP modules in Ansible;

bigsuds
.

\n\n
\n
pip install bigsuds
\n\n

With that in place, you're ready to work with the Ansible modules.

\n\n

Additionally, I am going to be using a very minimal inventory file that just includes a single BIG-IP. You will want to adjust yours for your environment, but here is mine.

\n\n
\n
[test]
\n
big-ip01.internal
\n\n


Note that the name above is available in my local DNS. If you only have an IP address to work with, you can just add that to your inventory file.

\n\n

For example

\n\n
\n[test]\n192.168.10.2
\n\n

Also note that I included a line called

[test]
. In Ansible this is referred to as a group. We will be revisiting this in the future as we begin orchestrating multiple BIG-IPs.

\n\n

Let's dive in to some of Matt and Serge's BIG-IP modules!

\n\n

bigip_facts

\n\n

In Ansible, there is a pattern you often see over and over. This is the pattern of modules that provide information, and modules that change settings. For this tutorial I'll refer to them as,

\n\n\n\n

Without exception,

reader
modules are suffixed with an
_facts
string. While
writer
modules, are not.

\n\n

So, with that in mind...pop quiz!

\n\n\n\n

The bigip_facts module will return to you a number of facts about the BIG-IP in question. Let's take a look.
First, my playbook.

\n\n
\n- name: Test bigip_facts\n  hosts: test\n  connection: local\n \n  tasks:\n      - name: Get all of the facts from my BIG-IP\n        bigip_facts:\n            server: \"{{ inventory_hostname }}\"\n            user: \"admin\"\n            password: \"admin\"\n            include: \"system_info\"
\n\n

And now, let's just run it to see what sort of output it generates.

\n\n
\nansible-playbook -i hosts site.yaml -vvvv
\n\n

You should be presented with information resembling the following.

\n\n
\nroot@debian:~# ansible-playbook -i hosts site.yaml -vvvv\nPLAY [Test bigip_facts] *******************************************************\nTASK: [Get all of the facts from my BIG-IP] ***********************************\n...\nok: [big-ip01.internal] => {\"ansible_facts\": {\"system_info\": {\"base_mac_address\": \"8A:83:8B:B1:AE:F7\",\n\"blade_temperature\": [], \"chassis_slot_information\": [], \"globally_unique_identifier\": \"8A:83:8B:B1:AE:F7\",\n\"group_id\": \"DefaultGroup\", \"hardware_information\": [{\"model\": \"Common KVM processor\", \"name\": \"cpus\",\n\"slot\": 0, \"type\": \"HARDWARE_BASE_BOARD\", \"versions\": [{\"name\": \"cache size\", \"value\": \"4096 KB\"}, {\"name\":\n\"cores\", \"value\": \"2\"}, {\"name\": \"cpu MHz\", \"value\": \"2199.994\"}]}],\n...\n\"os_version\": \"#1 SMP Mon Aug 11 19:54:07 PDT 2014\", \"platform\": \"Z100\", \"product_category\": \"Virtual Edition\",\n\"switch_board_part_revision\": null, \"switch_board_serial\": null, \"system_name\": \"Linux\"}, \"time\": {\"day\": 28,\n\"hour\": 22, \"minute\": 1, \"month\": 1, \"second\": 7, \"year\": 2016}, \"time_zone\": {\"gmt_offset\": -8,\n\"is_daylight_saving_time\": false, \"time_zone\": \"PST\"}, \"uptime\": 854}}, \"changed\": false}\nroot@debian:~#
\n\n

This module can output a lot of information that you can use in later tasks. Note that I just asked for the

system_info
facts, but there are a number of them that you can ask for, including

\n\n\n\n

You can include multiple types of facts by separating them with a comma. For example

\n\n
\n- name: Test bigip_facts\n  hosts: test\n  connection: local\n \n  tasks:\n      - name: Get all of the facts from my BIG-IP\n        bigip_facts:\n            server: \"{{ inventory_hostname }}\"\n            user: \"admin\"\n            password: \"admin\"\n            include: \"system_info,software,self_ip\"
\n\n

Returns facts representing the

system_info
,
software
, and self IPs.

\n\n

You can use the generated facts in later tasks by referencing their JSON keys. For example

\n\n
\n- name: Test bigip_facts\n  hosts: test\n  connection: local\n \n  tasks:\n      - name: Get all of the facts from my BIG-IP\n        bigip_facts:\n            server: \"{{ inventory_hostname }}\"\n            user: \"admin\"\n            password: \"admin\"\n            include: \"system_info,software,self_ip\"\n \n      - name: Mention the Self IP\n        debug:\n            msg: \"I have self IP {{ self_ip['/Common/net1'].address }}\"\n \n      - name: Mention the software\n        debug:\n            msg: \"I have software version {{ software[0].version }}\"
\n\n

And the (truncated) output

\n\n
\n...\nTASK: [Mention the Self IP] ***************************************************\nok: [big-ip01.internal] => {\n    \"msg\": \"I have self IP 10.2.2.2\"\n}\n \nTASK: [Mention the software] **************************************************\nok: [big-ip01.internal] => {\n    \"msg\": \"I have software version 11.6.0\"\n}\n...
\n\n

bigip_node

\n\n

This module allows you to manipulate nodes in a BIG-IP. Nodes are logical objects on your BIG-IP that identify the IP address of a physical node on your network. In terms of what we can do with them with the existing BIG-IP modules, you can use this module to create nodes that you can later assign to pool members.

\n\n

First, let's show you the playbook that I'm going to run.

\n\n
\n- name: Node shenanigans\n  hosts: test\n  connection: local\n \n  tasks:\n      - name: Add a new node\n        bigip_node:\n            server: \"{{ inventory_hostname }}\"\n            user: \"admin\"\n            password: \"admin\"\n            host: \"10.2.1.1\"\n            name: \"member1\"
\n\n

This is a simple example of creating a node in my BIG-IP. As is probably apparent if I am going to be working with pools, I would want to create many nodes. I'll hold off on that until a future example, but hopefully this clarifies the point of how to create the object that we can later assign to pool members.

\n\n

Let's run it!

\n\n
\nansible-playbook -i hosts site.yaml
\n\n

And the output we should expect to see looks like this

\n\n
\nroot@debian:~# ansible-playbook -i hosts site.yaml\n \nPLAY [Node shenanigans] *******************************************************\n \nTASK: [Add a new node] ********************************************************\nchanged: [big-ip01.internal]\n \nPLAY RECAP ********************************************************************\nbig-ip01.internal      : ok=1    changed=1    unreachable=0    failed=0\n \nroot@debian:~#
\n\n

Now, just to clarify what gets dropped where, and where these nodes can be used, let's first look at the Local Traffic > Nodes screen.

\n\n

\n\n

Now, let's navigate over to the pool screen and try to create a new pool. On the new pool creation screen, we have the option of specifying members of that pool. If we click on Node List, well, look at that. Our new node.

\n\n

\n\n

bigip_pool

\n\n

This module allows you to create pools on your BIG-IPs. To these pools we can later add pool members. With this and the

bigip_pool_member
module, you can control the basic load balancing functionality of the BIG-IP.

\n\n

First, just to prove that I have nothing up my BIG-IP sleeve, here's my current pool list.

\n\n

\n\n

And now, for my playbook

\n\n
\n- name: Create a pool\n  hosts: test\n  connection: local\n \n  tasks:\n      - name: Create the pool1 pool\n        bigip_pool:\n            server: \"{{ inventory_hostname }}\"\n            user: \"admin\"\n            password: \"admin\"\n            name: \"pool1\"
\n\n

With a wave of my magic wand...

\n\n
\nroot@debian:~# ansible-playbook -i hosts site.yaml\n \nPLAY [Create a pool] *******************************************************\n \nTASK: [Create the pool1 pool] ***********************************\n...\n \nchanged: [big-ip01.internal] => {\"changed\": true}\n \nPLAY RECAP ********************************************************************\nbig-ip01.internal      : ok=1    changed=1    unreachable=0    failed=0\n \nroot@debian:~#
\n\n

...and my pool list has been changed.

\n\n

\n\n

The bigip_pool module has a number of other options that let you adjust settings of the pool. They are all documented on the module's page.

\n\n

bigip_pool_member

\n\n

With the bigip_pool_member module, you can manipulate the members of any of the pools on your BIG-IP. This module, in particular, is a crucial part of a rolling upgrade strategy that you may undertake when upgrading software on members of the pool.

\n\n

Consider the following scenario.

\n\n
  1. Remove (or disable) the member from the pool
  2. Upgrade the member's software (you pick the software, but let's say Apache for example)
  3. Verify the software upgrade
  4. Add (or enable) the member back to the old pool, or, add the member to a new pool
\n\n

This module can be used for steps 1 and 4. Let's have a look at my playbook.

\n\n
\n- name: Pool member manipulation\n  hosts: test\n  connection: local\n \n  tasks:\n      - name: Drop members out of pool1\n        bigip_pool_member:\n            server: \"{{ inventory_hostname }}\"\n            user: \"admin\"\n            password: \"admin\"\n            state: \"absent\"\n            host: \"{{ item }}\"\n            pool: \"pool1\"\n            port: \"22\"\n        with_items:\n            - member1\n            - member2\n \n      - name: Intermediate processing\n        debug:\n            msg: \"Upgrade some software\"\n \n      - name: More intermediate processing\n        debug:\n            msg: \"Install some configuration\"\n \n      - name: Add member1 node back\n        bigip_node:\n            server: \"{{ inventory_hostname }}\"\n            user: \"admin\"\n            password: \"admin\"\n            name: \"{{ item }}\"\n            host: \"10.2.1.1\"\n            state: \"present\"\n        with_items:\n            - member1\n \n      - name: Add member2 node back\n        bigip_node:\n            server: \"{{ inventory_hostname }}\"\n            user: \"admin\"\n            password: \"admin\"\n            name: \"{{ item }}\"\n            host: \"10.2.1.2\"\n            state: \"present\"\n        with_items:\n            - member2\n \n      - name: Add member1 back to pool1\n        bigip_pool_member:\n            server: \"{{ inventory_hostname }}\"\n            user: \"admin\"\n            password: \"admin\"\n            host: \"{{ item }}\"\n            pool: \"pool1\"\n            port: \"22\"\n            state: \"present\"\n        with_items:\n            - member1\n \n      - name: Add member2 to pool2\n        bigip_pool_member:\n            server: \"{{ inventory_hostname }}\"\n            user: \"admin\"\n            password: \"admin\"\n            host: \"{{ item }}\"\n            pool: \"pool2\"\n            port: \"22\"\n            state: \"present\"\n        with_items:\n            - member2
\n\n

And before we run it, let's just take a peek at my current pools.

\n\n

\n\n

As well as the members of pool1

\n\n

\n\n

And the members of pool2

\n\n

\n\n

Now, let's have a go at running the playbook.

\n\n
\nansible-playbook -i hosts site2.yaml
\n\n

After it runs, you should have output that resembles something like this.

\n\n
\nroot@debian:~# ansible-playbook -i hosts site.yaml\n \nPLAY [Pool member manipulation] ***********************************************\n \nTASK: [Drop members out of pool1] *********************************************\nchanged: [big-ip01.internal] => (item=member1)\nok: [big-ip01.internal] => (item=member2)\n \nTASK: [Intermediate processing] ***********************************************\nok: [big-ip01.internal] => {\n    \"msg\": \"Upgrade some software\"\n}\n \nTASK: [More intermediate processing] ******************************************\nok: [big-ip01.internal] => {\n    \"msg\": \"Install some configuration\"\n}\n \nTASK: [Add member1 node back] *************************************************\nchanged: [big-ip01.internal] => (item=member1)\n \nTASK: [Add member2 node back] *************************************************\nok: [big-ip01.internal] => (item=member2)\n \nTASK: [Add member1 back to pool1] *********************************************\nchanged: [big-ip01.internal] => (item=member1)\n \nTASK: [Add member2 to pool2] **************************************************\nok: [big-ip01.internal] => (item=member2)\n \nPLAY RECAP ********************************************************************\nbig-ip01.internal      : ok=7    changed=3    unreachable=0    failed=0\n \nroot@debian:~#
\n\n

And your pool members should be different, check out the screenshots below.

\n\n

The pool list

\n\n

\n\n

Members in pool1

\n\n

\n\n

Members in pool2

\n\n

\n\n

To Summarize

\n\n

BIG-IP would not have a presence in Ansible if it were not for Matt and Serge's initiative.

\n\n

Based on the work they started, I'm happy to assist with testing and contributing new modules moving forward. In my entirely too biased opinion, Ansible fits in well with the tools and products I work on. Perhaps it will also fit in well with your workflow. If we've piqued your interest, then the Ansible mailing list is a great place to ask more Ansible related questions and further solidify your understanding.

\n\n

If you liked this article and want to see more like it, rate it as such. Have comments? Questions? Something else? Leave a comment below!

\n\n

References

\n\n","body@stringLength":"26865","rawBody":"

Right around the time that I started at F5, I was at the pinnacle of my exposure to Ansible. So imagine my surprise when I saw BIG-IP modules in the Ansible core product! I immediately wanted to know which one of my colleagues I could go talk Ansible-fu with!

\n\n

I cracked open the source code, found the names of contributors, made haste to the corporate phone book to look up where they sat, and...wait a second...

\n\n

...no entries in the phone book?

\n\n

...that curious look in colleagues eyes that says \"I haven't the foggiest idea what you are talking about\".

\n\n

Then it hit me...the BIG-IP modules didn't originate at F5.

\n\n

Upon further investigation, it became clear to me that, indeed, we had no skin in this game. These modules originated from two enterprising individuals who I found on DevCentral, and I would be remiss to exclude their valuable contributions to the Ansible+F5 cause, so in this post I want to highlight those contributions and bring others up-to-speed on current Ansible+BIG-IP functionality.

\n\n

Credit where it is due

\n\n

As far as I can tell from perusing Ansible's git logs, the existing BIG-IP modules in Ansible are the work of Matt Hite and Serge van Ginderachter. Both are DevCentral contributors, and have had a presence in the Ansible community from (at least) 2013 when their modules landed in the tool.

\n\n

Among the modules that they had a hand in are

\n\n\n\n

Since that time, I've seen even more folks step up to the plate with Ansible modules that will be making their appearance in upcoming releases.

\n\n

Well, I wanted to have a hand in this work too. I figured I had a perfect opportunity to help because,

\n\n
  1. I had some background in Ansible
  2. I had access to unlimited BIG-IP technical resources
\n\n

It was only a question of how to get involved.

\n\n

And then, Matt posted this in a pull request (PR)...

\n\n
\n

Unfortunately I don't have GTM to smoke test this with. Can you solicit some testers on the mailing list?

\n
\n\n

And Serge followed with

\n\n
\n

So same here, not tested as no GTM gear, but an offline code review.

\n
\n\n

Bingo...I was in.

\n\n

If there's one area that I figured I could have the greatest impact, it's the area of technical resources. There is BIG-IP stuff all over the place at F5, and I sit next to, or at least near, many of the people who have knowledge of the products; far more advanced knowledge than I do. Many of those same people hang out and contribute on DevCentral. Paired with my knowledge of Ansible, I figured I could help test BIG-IP related PRs to validate their functionality beyond what a code review offered.

\n\n

So that's what I did (and what we're about to do).

\n\n

Before you begin

\n\n

If you were around for the earlier introductory article to Ansible that I posted a couple days ago, pull up a terminal to that machine. We need to install one more dependency that is common to all of the BIG-IP modules in Ansible; bigsuds.

\n\n
\npip install bigsuds
\n\n

With that in place, you're ready to work with the Ansible modules.

\n\n

Additionally, I am going to be using a very minimal inventory file that just includes a single BIG-IP. You will want to adjust yours for your environment, but here is mine.

\n\n
\n[test]\nbig-ip01.internal
\n\n


Note that the name above is available in my local DNS. If you only have an IP address to work with, you can just add that to your inventory file.

\n\n

For example

\n\n
\n[test]\n192.168.10.2
\n\n

Also note that I included a line called [test]. In Ansible this is referred to as a group. We will be revisiting this in the future as we begin orchestrating multiple BIG-IPs.

\n\n

Let's dive in to some of Matt and Serge's BIG-IP modules!

\n\n

bigip_facts

\n\n

In Ansible, there is a pattern you often see over and over. This is the pattern of modules that provide information, and modules that change settings. For this tutorial I'll refer to them as,

\n\n\n\n

Without exception, reader modules are suffixed with an _facts string. While writer modules, are not.

\n\n

So, with that in mind...pop quiz!

\n\n\n\n

The bigip_facts module will return to you a number of facts about the BIG-IP in question. Let's take a look.
First, my playbook.

\n\n
\n- name: Test bigip_facts\n  hosts: test\n  connection: local\n \n  tasks:\n      - name: Get all of the facts from my BIG-IP\n        bigip_facts:\n            server: \"{{ inventory_hostname }}\"\n            user: \"admin\"\n            password: \"admin\"\n            include: \"system_info\"
\n\n

And now, let's just run it to see what sort of output it generates.

\n\n
\nansible-playbook -i hosts site.yaml -vvvv
\n\n

You should be presented with information resembling the following.

\n\n
\nroot@debian:~# ansible-playbook -i hosts site.yaml -vvvv\nPLAY [Test bigip_facts] *******************************************************\nTASK: [Get all of the facts from my BIG-IP] ***********************************\n...\nok: [big-ip01.internal] => {\"ansible_facts\": {\"system_info\": {\"base_mac_address\": \"8A:83:8B:B1:AE:F7\",\n\"blade_temperature\": [], \"chassis_slot_information\": [], \"globally_unique_identifier\": \"8A:83:8B:B1:AE:F7\",\n\"group_id\": \"DefaultGroup\", \"hardware_information\": [{\"model\": \"Common KVM processor\", \"name\": \"cpus\",\n\"slot\": 0, \"type\": \"HARDWARE_BASE_BOARD\", \"versions\": [{\"name\": \"cache size\", \"value\": \"4096 KB\"}, {\"name\":\n\"cores\", \"value\": \"2\"}, {\"name\": \"cpu MHz\", \"value\": \"2199.994\"}]}],\n...\n\"os_version\": \"#1 SMP Mon Aug 11 19:54:07 PDT 2014\", \"platform\": \"Z100\", \"product_category\": \"Virtual Edition\",\n\"switch_board_part_revision\": null, \"switch_board_serial\": null, \"system_name\": \"Linux\"}, \"time\": {\"day\": 28,\n\"hour\": 22, \"minute\": 1, \"month\": 1, \"second\": 7, \"year\": 2016}, \"time_zone\": {\"gmt_offset\": -8,\n\"is_daylight_saving_time\": false, \"time_zone\": \"PST\"}, \"uptime\": 854}}, \"changed\": false}\nroot@debian:~#
\n\n

This module can output a lot of information that you can use in later tasks. Note that I just asked for the system_info facts, but there are a number of them that you can ask for, including

\n\n\n\n

You can include multiple types of facts by separating them with a comma. For example

\n\n
\n- name: Test bigip_facts\n  hosts: test\n  connection: local\n \n  tasks:\n      - name: Get all of the facts from my BIG-IP\n        bigip_facts:\n            server: \"{{ inventory_hostname }}\"\n            user: \"admin\"\n            password: \"admin\"\n            include: \"system_info,software,self_ip\"
\n\n

Returns facts representing the system_info, software, and self IPs.

\n\n

You can use the generated facts in later tasks by referencing their JSON keys. For example

\n\n
\n- name: Test bigip_facts\n  hosts: test\n  connection: local\n \n  tasks:\n      - name: Get all of the facts from my BIG-IP\n        bigip_facts:\n            server: \"{{ inventory_hostname }}\"\n            user: \"admin\"\n            password: \"admin\"\n            include: \"system_info,software,self_ip\"\n \n      - name: Mention the Self IP\n        debug:\n            msg: \"I have self IP {{ self_ip['/Common/net1'].address }}\"\n \n      - name: Mention the software\n        debug:\n            msg: \"I have software version {{ software[0].version }}\"
\n\n

And the (truncated) output

\n\n
\n...\nTASK: [Mention the Self IP] ***************************************************\nok: [big-ip01.internal] => {\n    \"msg\": \"I have self IP 10.2.2.2\"\n}\n \nTASK: [Mention the software] **************************************************\nok: [big-ip01.internal] => {\n    \"msg\": \"I have software version 11.6.0\"\n}\n...
\n\n

bigip_node

\n\n

This module allows you to manipulate nodes in a BIG-IP. Nodes are logical objects on your BIG-IP that identify the IP address of a physical node on your network. In terms of what we can do with them with the existing BIG-IP modules, you can use this module to create nodes that you can later assign to pool members.

\n\n

First, let's show you the playbook that I'm going to run.

\n\n
\n- name: Node shenanigans\n  hosts: test\n  connection: local\n \n  tasks:\n      - name: Add a new node\n        bigip_node:\n            server: \"{{ inventory_hostname }}\"\n            user: \"admin\"\n            password: \"admin\"\n            host: \"10.2.1.1\"\n            name: \"member1\"
\n\n

This is a simple example of creating a node in my BIG-IP. As is probably apparent if I am going to be working with pools, I would want to create many nodes. I'll hold off on that until a future example, but hopefully this clarifies the point of how to create the object that we can later assign to pool members.

\n\n

Let's run it!

\n\n
\nansible-playbook -i hosts site.yaml
\n\n

And the output we should expect to see looks like this

\n\n
\nroot@debian:~# ansible-playbook -i hosts site.yaml\n \nPLAY [Node shenanigans] *******************************************************\n \nTASK: [Add a new node] ********************************************************\nchanged: [big-ip01.internal]\n \nPLAY RECAP ********************************************************************\nbig-ip01.internal      : ok=1    changed=1    unreachable=0    failed=0\n \nroot@debian:~#
\n\n

Now, just to clarify what gets dropped where, and where these nodes can be used, let's first look at the Local Traffic > Nodes screen.

\n\n

\n\n

Now, let's navigate over to the pool screen and try to create a new pool. On the new pool creation screen, we have the option of specifying members of that pool. If we click on Node List, well, look at that. Our new node.

\n\n

\n\n

bigip_pool

\n\n

This module allows you to create pools on your BIG-IPs. To these pools we can later add pool members. With this and the bigip_pool_member module, you can control the basic load balancing functionality of the BIG-IP.

\n\n

First, just to prove that I have nothing up my BIG-IP sleeve, here's my current pool list.

\n\n

\n\n

And now, for my playbook

\n\n
\n- name: Create a pool\n  hosts: test\n  connection: local\n \n  tasks:\n      - name: Create the pool1 pool\n        bigip_pool:\n            server: \"{{ inventory_hostname }}\"\n            user: \"admin\"\n            password: \"admin\"\n            name: \"pool1\"
\n\n

With a wave of my magic wand...

\n\n
\nroot@debian:~# ansible-playbook -i hosts site.yaml\n \nPLAY [Create a pool] *******************************************************\n \nTASK: [Create the pool1 pool] ***********************************\n...\n \nchanged: [big-ip01.internal] => {\"changed\": true}\n \nPLAY RECAP ********************************************************************\nbig-ip01.internal      : ok=1    changed=1    unreachable=0    failed=0\n \nroot@debian:~#
\n\n

...and my pool list has been changed.

\n\n

\n\n

The bigip_pool module has a number of other options that let you adjust settings of the pool. They are all documented on the module's page.

\n\n

bigip_pool_member

\n\n

With the bigip_pool_member module, you can manipulate the members of any of the pools on your BIG-IP. This module, in particular, is a crucial part of a rolling upgrade strategy that you may undertake when upgrading software on members of the pool.

\n\n

Consider the following scenario.

\n\n
  1. Remove (or disable) the member from the pool
  2. Upgrade the member's software (you pick the software, but let's say Apache for example)
  3. Verify the software upgrade
  4. Add (or enable) the member back to the old pool, or, add the member to a new pool
\n\n

This module can be used for steps 1 and 4. Let's have a look at my playbook.

\n\n
\n- name: Pool member manipulation\n  hosts: test\n  connection: local\n \n  tasks:\n      - name: Drop members out of pool1\n        bigip_pool_member:\n            server: \"{{ inventory_hostname }}\"\n            user: \"admin\"\n            password: \"admin\"\n            state: \"absent\"\n            host: \"{{ item }}\"\n            pool: \"pool1\"\n            port: \"22\"\n        with_items:\n            - member1\n            - member2\n \n      - name: Intermediate processing\n        debug:\n            msg: \"Upgrade some software\"\n \n      - name: More intermediate processing\n        debug:\n            msg: \"Install some configuration\"\n \n      - name: Add member1 node back\n        bigip_node:\n            server: \"{{ inventory_hostname }}\"\n            user: \"admin\"\n            password: \"admin\"\n            name: \"{{ item }}\"\n            host: \"10.2.1.1\"\n            state: \"present\"\n        with_items:\n            - member1\n \n      - name: Add member2 node back\n        bigip_node:\n            server: \"{{ inventory_hostname }}\"\n            user: \"admin\"\n            password: \"admin\"\n            name: \"{{ item }}\"\n            host: \"10.2.1.2\"\n            state: \"present\"\n        with_items:\n            - member2\n \n      - name: Add member1 back to pool1\n        bigip_pool_member:\n            server: \"{{ inventory_hostname }}\"\n            user: \"admin\"\n            password: \"admin\"\n            host: \"{{ item }}\"\n            pool: \"pool1\"\n            port: \"22\"\n            state: \"present\"\n        with_items:\n            - member1\n \n      - name: Add member2 to pool2\n        bigip_pool_member:\n            server: \"{{ inventory_hostname }}\"\n            user: \"admin\"\n            password: \"admin\"\n            host: \"{{ item }}\"\n            pool: \"pool2\"\n            port: \"22\"\n            state: \"present\"\n        with_items:\n            - member2
\n\n

And before we run it, let's just take a peek at my current pools.

\n\n

\n\n

As well as the members of pool1

\n\n

\n\n

And the members of pool2

\n\n

\n\n

Now, let's have a go at running the playbook.

\n\n
\nansible-playbook -i hosts site2.yaml
\n\n

After it runs, you should have output that resembles something like this.

\n\n
\nroot@debian:~# ansible-playbook -i hosts site.yaml\n \nPLAY [Pool member manipulation] ***********************************************\n \nTASK: [Drop members out of pool1] *********************************************\nchanged: [big-ip01.internal] => (item=member1)\nok: [big-ip01.internal] => (item=member2)\n \nTASK: [Intermediate processing] ***********************************************\nok: [big-ip01.internal] => {\n    \"msg\": \"Upgrade some software\"\n}\n \nTASK: [More intermediate processing] ******************************************\nok: [big-ip01.internal] => {\n    \"msg\": \"Install some configuration\"\n}\n \nTASK: [Add member1 node back] *************************************************\nchanged: [big-ip01.internal] => (item=member1)\n \nTASK: [Add member2 node back] *************************************************\nok: [big-ip01.internal] => (item=member2)\n \nTASK: [Add member1 back to pool1] *********************************************\nchanged: [big-ip01.internal] => (item=member1)\n \nTASK: [Add member2 to pool2] **************************************************\nok: [big-ip01.internal] => (item=member2)\n \nPLAY RECAP ********************************************************************\nbig-ip01.internal      : ok=7    changed=3    unreachable=0    failed=0\n \nroot@debian:~#
\n\n

And your pool members should be different, check out the screenshots below.

\n\n

The pool list

\n\n

\n\n

Members in pool1

\n\n

\n\n

Members in pool2

\n\n

\n\n

To Summarize

\n\n

BIG-IP would not have a presence in Ansible if it were not for Matt and Serge's initiative.

\n\n

Based on the work they started, I'm happy to assist with testing and contributing new modules moving forward. In my entirely too biased opinion, Ansible fits in well with the tools and products I work on. Perhaps it will also fit in well with your workflow. If we've piqued your interest, then the Ansible mailing list is a great place to ask more Ansible related questions and further solidify your understanding.

\n\n

If you liked this article and want to see more like it, rate it as such. Have comments? Questions? Something else? Leave a comment below!

\n\n

References

\n\n","kudosSumWeight":0,"repliesCount":14,"postTime":"2016-01-29T06:00:00.000-08:00","images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjQuMTB8Mi4xfG98MjV8X05WX3wx","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItMTEyMDdpMTM1MDFBRjU3NjI4RDRFNg?revision=2\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjQuMTB8Mi4xfG98MjV8X05WX3wy","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItMTc3OWk1RDBFOEZFNDU2MzE5MTNB?revision=2\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjQuMTB8Mi4xfG98MjV8X05WX3wz","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItODcxMWk3NTFFMzdBRjc2MUNCOTI1?revision=2\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjQuMTB8Mi4xfG98MjV8X05WX3w0","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItMzA1OGkyRkY4RTRCNTA1QzAxOUYz?revision=2\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjQuMTB8Mi4xfG98MjV8X05WX3w1","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItOTkyOWlDNDg1ODNDMUYyOURCMzAz?revision=2\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjQuMTB8Mi4xfG98MjV8X05WX3w2","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItMTQ0NDRpM0YzRDEzMkM5NEMxOTI5OA?revision=2\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjQuMTB8Mi4xfG98MjV8X05WX3w3","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItMTEyMTBpRDgxM0RBOUFGQTYyRDhCOQ?revision=2\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjQuMTB8Mi4xfG98MjV8X05WX3w4","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItNjg0MGk1NjAyODZDRjIxRkE4RDI4?revision=2\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjQuMTB8Mi4xfG98MjV8X05WX3w5","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItNjU4OGlGRjJFMTEzQTU2NjQxQ0Yx?revision=2\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjQuMTB8Mi4xfG98MjV8X05WX3wxMA","node":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItNTI5MmkwMzMyNkU3NDhBQjk0RUFC?revision=2\"}"}}],"totalCount":10,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"attachments":{"__typename":"AttachmentConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"tags":{"__typename":"TagConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[{"__typename":"TagEdge","cursor":"MjQuMTB8Mi4xfG98MTB8X05WX3wx","node":{"__typename":"Tag","id":"tag:Ansible","text":"Ansible","time":"2022-11-28T02:35:02.758-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjQuMTB8Mi4xfG98MTB8X05WX3wy","node":{"__typename":"Tag","id":"tag:BIG-IP","text":"BIG-IP","time":"2022-01-24T02:29:45.031-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjQuMTB8Mi4xfG98MTB8X05WX3wz","node":{"__typename":"Tag","id":"tag:devops","text":"devops","time":"2011-10-19T17:50:55.000-07:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjQuMTB8Mi4xfG98MTB8X05WX3w0","node":{"__typename":"Tag","id":"tag:iControl","text":"iControl","time":"2022-01-24T02:29:45.068-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}}]},"timeToRead":10,"rawTeaser":"","introduction":"","currentRevision":{"__ref":"Revision:revision:280332_2"},"latestVersion":{"__typename":"FriendlyVersion","major":"2","minor":"0"},"metrics":{"__typename":"MessageMetrics","views":1496},"visibilityScope":"PUBLIC","canonicalUrl":null,"seoTitle":null,"seoDescription":null,"placeholder":false,"originalMessageForPlaceholder":null,"contributors":{"__typename":"UserConnection","edges":[]},"nonCoAuthorContributors":{"__typename":"UserConnection","edges":[]},"coAuthors":{"__typename":"UserConnection","edges":[]},"tkbMessagePolicies":{"__typename":"TkbMessagePolicies","canDoAuthoringActionsOnTkb":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.tkb.policy_can_do_authoring_action.accessDenied","key":"error.lithium.policies.tkb.policy_can_do_authoring_action.accessDenied","args":[]}}},"archivalData":null,"replies":{"__typename":"MessageConnection","edges":[{"__typename":"MessageEdge","cursor":"MjQuMTB8Mi4xfG98MTB8MTQ6MCwzOToxfDE","node":{"__ref":"TkbReplyMessage:message:280333"}},{"__typename":"MessageEdge","cursor":"MjQuMTB8Mi4xfG98MTB8MTQ6MCwzOToxfDI","node":{"__ref":"TkbReplyMessage:message:280334"}},{"__typename":"MessageEdge","cursor":"MjQuMTB8Mi4xfG98MTB8MTQ6MCwzOToxfDM","node":{"__ref":"TkbReplyMessage:message:280335"}},{"__typename":"MessageEdge","cursor":"MjQuMTB8Mi4xfG98MTB8MTQ6MCwzOToxfDQ","node":{"__ref":"TkbReplyMessage:message:280336"}},{"__typename":"MessageEdge","cursor":"MjQuMTB8Mi4xfG98MTB8MTQ6MCwzOToxfDU","node":{"__ref":"TkbReplyMessage:message:280337"}},{"__typename":"MessageEdge","cursor":"MjQuMTB8Mi4xfG98MTB8MTQ6MCwzOToxfDY","node":{"__ref":"TkbReplyMessage:message:280338"}},{"__typename":"MessageEdge","cursor":"MjQuMTB8Mi4xfG98MTB8MTQ6MCwzOToxfDc","node":{"__ref":"TkbReplyMessage:message:280339"}},{"__typename":"MessageEdge","cursor":"MjQuMTB8Mi4xfG98MTB8MTQ6MCwzOToxfDg","node":{"__ref":"TkbReplyMessage:message:280340"}},{"__typename":"MessageEdge","cursor":"MjQuMTB8Mi4xfG98MTB8MTQ6MCwzOToxfDk","node":{"__ref":"TkbReplyMessage:message:280341"}},{"__typename":"MessageEdge","cursor":"MjQuMTB8Mi4xfG98MTB8MTQ6MCwzOToxfDEw","node":{"__ref":"TkbReplyMessage:message:280342"}}],"pageInfo":{"__typename":"PageInfo","hasNextPage":true,"endCursor":"MjQuMTB8Mi4xfG98MTB8MTQ6MCwzOToxfDEw","hasPreviousPage":false,"startCursor":null}},"customFields":[],"revisions({\"constraints\":{\"isPublished\":{\"eq\":true}},\"first\":1})":{"__typename":"RevisionConnection","totalCount":2}},"Conversation:conversation:280332":{"__typename":"Conversation","id":"conversation:280332","solved":false,"topic":{"__ref":"TkbTopicMessage:message:280332"},"lastPostingActivityTime":"2023-06-05T22:59:20.470-07:00","lastPostTime":"2020-02-23T11:32:57.000-08:00","unreadReplyCount":14,"isSubscribed":false},"ModerationData:moderation_data:280332":{"__typename":"ModerationData","id":"moderation_data:280332","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItMTEyMDdpMTM1MDFBRjU3NjI4RDRFNg?revision=2\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItMTEyMDdpMTM1MDFBRjU3NjI4RDRFNg?revision=2","title":"0151T000003d6l3QAA.png","associationType":"BODY","width":854,"height":446,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItMTc3OWk1RDBFOEZFNDU2MzE5MTNB?revision=2\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItMTc3OWk1RDBFOEZFNDU2MzE5MTNB?revision=2","title":"0151T000003d6l4QAA.png","associationType":"BODY","width":1326,"height":1198,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItODcxMWk3NTFFMzdBRjc2MUNCOTI1?revision=2\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItODcxMWk3NTFFMzdBRjc2MUNCOTI1?revision=2","title":"0151T000003d6l5QAA.png","associationType":"BODY","width":746,"height":432,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItMzA1OGkyRkY4RTRCNTA1QzAxOUYz?revision=2\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItMzA1OGkyRkY4RTRCNTA1QzAxOUYz?revision=2","title":"0151T000003d6l6QAA.png","associationType":"BODY","width":672,"height":422,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItOTkyOWlDNDg1ODNDMUYyOURCMzAz?revision=2\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItOTkyOWlDNDg1ODNDMUYyOURCMzAz?revision=2","title":"0151T000003d6l7QAA.png","associationType":"BODY","width":670,"height":488,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItMTQ0NDRpM0YzRDEzMkM5NEMxOTI5OA?revision=2\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItMTQ0NDRpM0YzRDEzMkM5NEMxOTI5OA?revision=2","title":"0151T000003d6l8QAA.png","associationType":"BODY","width":926,"height":764,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItMTEyMTBpRDgxM0RBOUFGQTYyRDhCOQ?revision=2\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItMTEyMTBpRDgxM0RBOUFGQTYyRDhCOQ?revision=2","title":"0151T000003d6l9QAA.png","associationType":"BODY","width":916,"height":720,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItNjg0MGk1NjAyODZDRjIxRkE4RDI4?revision=2\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItNjg0MGk1NjAyODZDRjIxRkE4RDI4?revision=2","title":"0151T000003d6lAQAQ.png","associationType":"BODY","width":648,"height":472,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItNjU4OGlGRjJFMTEzQTU2NjQxQ0Yx?revision=2\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItNjU4OGlGRjJFMTEzQTU2NjQxQ0Yx?revision=2","title":"0151T000003d6lGQAQ.png","associationType":"BODY","width":934,"height":712,"altText":null},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItNTI5MmkwMzMyNkU3NDhBQjk0RUFC?revision=2\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/bS0yODAzMzItNTI5MmkwMzMyNkU3NDhBQjk0RUFC?revision=2","title":"0151T000003d6lHQAQ.png","associationType":"BODY","width":936,"height":714,"altText":null},"Revision:revision:280332_2":{"__typename":"Revision","id":"revision:280332_2","lastEditTime":"2023-06-05T22:59:20.470-07:00"},"CachedAsset:theme:customTheme1-1733222329859":{"__typename":"CachedAsset","id":"theme:customTheme1-1733222329859","value":{"id":"customTheme1","animation":{"fast":"150ms","normal":"250ms","slow":"500ms","slowest":"750ms","function":"cubic-bezier(0.07, 0.91, 0.51, 1)","__typename":"AnimationThemeSettings"},"avatar":{"borderRadius":"50%","collections":["custom"],"__typename":"AvatarThemeSettings"},"basics":{"browserIcon":{"imageAssetName":"JimmyPackets-512-1702592938213.png","imageLastModified":"1702592945815","__typename":"ThemeAsset"},"customerLogo":{"imageAssetName":"f5_logo_fix-1704824537976.svg","imageLastModified":"1704824540697","__typename":"ThemeAsset"},"maximumWidthOfPageContent":"1600px","oneColumnNarrowWidth":"800px","gridGutterWidthMd":"30px","gridGutterWidthXs":"10px","pageWidthStyle":"WIDTH_OF_PAGE_CONTENT","__typename":"BasicsThemeSettings"},"buttons":{"borderRadiusSm":"5px","borderRadius":"5px","borderRadiusLg":"5px","paddingY":"5px","paddingYLg":"7px","paddingYHero":"var(--lia-bs-btn-padding-y-lg)","paddingX":"12px","paddingXLg":"14px","paddingXHero":"42px","fontStyle":"NORMAL","fontWeight":"400","textTransform":"NONE","disabledOpacity":0.5,"primaryTextColor":"var(--lia-bs-white)","primaryTextHoverColor":"var(--lia-bs-white)","primaryTextActiveColor":"var(--lia-bs-white)","primaryBgColor":"var(--lia-bs-primary)","primaryBgHoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.85))","primaryBgActiveColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.7))","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","primaryBorderActive":"1px solid transparent","primaryBorderFocus":"1px solid var(--lia-bs-white)","primaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","secondaryTextColor":"var(--lia-bs-gray-900)","secondaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","secondaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","secondaryBgColor":"var(--lia-bs-gray-400)","secondaryBgHoverColor":"hsl(var(--lia-bs-gray-400-h), var(--lia-bs-gray-400-s), calc(var(--lia-bs-gray-400-l) * 0.96))","secondaryBgActiveColor":"hsl(var(--lia-bs-gray-400-h), var(--lia-bs-gray-400-s), calc(var(--lia-bs-gray-400-l) * 0.92))","secondaryBorder":"1px solid transparent","secondaryBorderHover":"1px solid transparent","secondaryBorderActive":"1px solid transparent","secondaryBorderFocus":"1px solid transparent","secondaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","tertiaryTextColor":"var(--lia-bs-gray-900)","tertiaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","tertiaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","tertiaryBgColor":"transparent","tertiaryBgHoverColor":"transparent","tertiaryBgActiveColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.04)","tertiaryBorder":"1px solid transparent","tertiaryBorderHover":"1px solid hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","tertiaryBorderActive":"1px solid transparent","tertiaryBorderFocus":"1px solid transparent","tertiaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","destructiveTextColor":"var(--lia-bs-danger)","destructiveTextHoverColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.95))","destructiveTextActiveColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.9))","destructiveBgColor":"var(--lia-bs-gray-300)","destructiveBgHoverColor":"hsl(var(--lia-bs-gray-300-h), var(--lia-bs-gray-300-s), calc(var(--lia-bs-gray-300-l) * 0.96))","destructiveBgActiveColor":"hsl(var(--lia-bs-gray-300-h), var(--lia-bs-gray-300-s), calc(var(--lia-bs-gray-300-l) * 0.92))","destructiveBorder":"1px solid transparent","destructiveBorderHover":"1px solid transparent","destructiveBorderActive":"1px solid transparent","destructiveBorderFocus":"1px solid transparent","destructiveBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","__typename":"ButtonsThemeSettings"},"border":{"color":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","mainContent":"NONE","sideContent":"NONE","radiusSm":"3px","radius":"5px","radiusLg":"9px","radius50":"100vw","__typename":"BorderThemeSettings"},"boxShadow":{"xs":"0 0 0 1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08), 0 3px 0 -1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08)","sm":"0 2px 4px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.06)","md":"0 5px 15px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.15)","lg":"0 10px 30px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.15)","__typename":"BoxShadowThemeSettings"},"cards":{"bgColor":"var(--lia-panel-bg-color)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":"var(--lia-box-shadow-xs)","__typename":"CardsThemeSettings"},"chip":{"maxWidth":"300px","height":"30px","__typename":"ChipThemeSettings"},"coreTypes":{"defaultMessageLinkColor":"var(--lia-bs-primary)","defaultMessageLinkDecoration":"none","defaultMessageLinkFontStyle":"NORMAL","defaultMessageLinkFontWeight":"400","defaultMessageFontStyle":"NORMAL","defaultMessageFontWeight":"400","forumColor":"#0C5C8D","forumFontFamily":"var(--lia-bs-font-family-base)","forumFontWeight":"var(--lia-default-message-font-weight)","forumLineHeight":"var(--lia-bs-line-height-base)","forumFontStyle":"var(--lia-default-message-font-style)","forumMessageLinkColor":"var(--lia-default-message-link-color)","forumMessageLinkDecoration":"var(--lia-default-message-link-decoration)","forumMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","forumMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","forumSolvedColor":"#62C026","blogColor":"#730015","blogFontFamily":"var(--lia-bs-font-family-base)","blogFontWeight":"var(--lia-default-message-font-weight)","blogLineHeight":"1.75","blogFontStyle":"var(--lia-default-message-font-style)","blogMessageLinkColor":"var(--lia-default-message-link-color)","blogMessageLinkDecoration":"var(--lia-default-message-link-decoration)","blogMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","blogMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","tkbColor":"#C20025","tkbFontFamily":"var(--lia-bs-font-family-base)","tkbFontWeight":"var(--lia-default-message-font-weight)","tkbLineHeight":"1.75","tkbFontStyle":"var(--lia-default-message-font-style)","tkbMessageLinkColor":"var(--lia-default-message-link-color)","tkbMessageLinkDecoration":"var(--lia-default-message-link-decoration)","tkbMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","tkbMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaColor":"#4099E2","qandaFontFamily":"var(--lia-bs-font-family-base)","qandaFontWeight":"var(--lia-default-message-font-weight)","qandaLineHeight":"var(--lia-bs-line-height-base)","qandaFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkColor":"var(--lia-default-message-link-color)","qandaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","qandaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaSolvedColor":"#3FA023","ideaColor":"#F3704B","ideaFontFamily":"var(--lia-bs-font-family-base)","ideaFontWeight":"var(--lia-default-message-font-weight)","ideaLineHeight":"var(--lia-bs-line-height-base)","ideaFontStyle":"var(--lia-default-message-font-style)","ideaMessageLinkColor":"var(--lia-default-message-link-color)","ideaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","ideaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","ideaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","contestColor":"#FCC845","contestFontFamily":"var(--lia-bs-font-family-base)","contestFontWeight":"var(--lia-default-message-font-weight)","contestLineHeight":"var(--lia-bs-line-height-base)","contestFontStyle":"var(--lia-default-message-link-font-style)","contestMessageLinkColor":"var(--lia-default-message-link-color)","contestMessageLinkDecoration":"var(--lia-default-message-link-decoration)","contestMessageLinkFontStyle":"ITALIC","contestMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","occasionColor":"#EE4B5B","occasionFontFamily":"var(--lia-bs-font-family-base)","occasionFontWeight":"var(--lia-default-message-font-weight)","occasionLineHeight":"var(--lia-bs-line-height-base)","occasionFontStyle":"var(--lia-default-message-font-style)","occasionMessageLinkColor":"var(--lia-default-message-link-color)","occasionMessageLinkDecoration":"var(--lia-default-message-link-decoration)","occasionMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","occasionMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","grouphubColor":"#491B62","categoryColor":"#949494","communityColor":"#FFFFFF","productColor":"#949494","__typename":"CoreTypesThemeSettings"},"colors":{"black":"#000000","white":"#FFFFFF","gray100":"#F7F7F7","gray200":"#F7F7F7","gray300":"#E8E8E8","gray400":"#D9D9D9","gray500":"#CCCCCC","gray600":"#949494","gray700":"#707070","gray800":"#545454","gray900":"#333333","dark":"#545454","light":"#F7F7F7","primary":"#0C5C8D","secondary":"#333333","bodyText":"#222222","bodyBg":"#F5F5F5","info":"#1D9CD3","success":"#62C026","warning":"#FFD651","danger":"#C20025","alertSystem":"#FF6600","textMuted":"#707070","highlight":"#FFFCAD","outline":"var(--lia-bs-primary)","custom":["#C20025","#081B85","#009639","#B3C6D7","#7CC0EB","#F29A36"],"__typename":"ColorsThemeSettings"},"divider":{"size":"3px","marginLeft":"4px","marginRight":"4px","borderRadius":"50%","bgColor":"var(--lia-bs-gray-600)","bgColorActive":"var(--lia-bs-gray-600)","__typename":"DividerThemeSettings"},"dropdown":{"fontSize":"var(--lia-bs-font-size-sm)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius-sm)","dividerBg":"var(--lia-bs-gray-300)","itemPaddingY":"5px","itemPaddingX":"20px","headerColor":"var(--lia-bs-gray-700)","__typename":"DropdownThemeSettings"},"emoji":{"skinToneDefault":"#ffcd43","skinToneLight":"#fae3c5","skinToneMediumLight":"#e2cfa5","skinToneMedium":"#daa478","skinToneMediumDark":"#a78058","skinToneDark":"#5e4d43","__typename":"EmojiThemeSettings"},"heading":{"color":"var(--lia-bs-body-color)","fontFamily":"Inter","fontStyle":"NORMAL","fontWeight":"600","h1FontSize":"30px","h2FontSize":"25px","h3FontSize":"20px","h4FontSize":"18px","h5FontSize":"16px","h6FontSize":"16px","lineHeight":"1.2","subHeaderFontSize":"11px","subHeaderFontWeight":"500","h1LetterSpacing":"normal","h2LetterSpacing":"normal","h3LetterSpacing":"normal","h4LetterSpacing":"normal","h5LetterSpacing":"normal","h6LetterSpacing":"normal","subHeaderLetterSpacing":"2px","h1FontWeight":null,"h2FontWeight":null,"h3FontWeight":null,"h4FontWeight":null,"h5FontWeight":null,"h6FontWeight":null,"__typename":"HeadingThemeSettings"},"icons":{"size10":"10px","size12":"12px","size14":"14px","size16":"16px","size20":"20px","size24":"24px","size30":"30px","size40":"40px","size50":"50px","size60":"60px","size80":"80px","size120":"120px","size160":"160px","__typename":"IconsThemeSettings"},"imagePreview":{"bgColor":"var(--lia-bs-gray-900)","titleColor":"var(--lia-bs-white)","controlColor":"var(--lia-bs-white)","controlBgColor":"var(--lia-bs-gray-800)","__typename":"ImagePreviewThemeSettings"},"input":{"borderColor":"var(--lia-bs-gray-600)","disabledColor":"var(--lia-bs-gray-600)","focusBorderColor":"var(--lia-bs-primary)","labelMarginBottom":"10px","btnFontSize":"var(--lia-bs-font-size-sm)","focusBoxShadow":"0 0 0 3px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","checkLabelMarginBottom":"2px","checkboxBorderRadius":"3px","borderRadiusSm":"var(--lia-bs-border-radius-sm)","borderRadius":"var(--lia-bs-border-radius)","borderRadiusLg":"var(--lia-bs-border-radius-lg)","formTextMarginTop":"4px","textAreaBorderRadius":"var(--lia-bs-border-radius)","activeFillColor":"var(--lia-bs-primary)","__typename":"InputThemeSettings"},"loading":{"dotDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.2)","dotLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.5)","barDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.06)","barLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.4)","__typename":"LoadingThemeSettings"},"link":{"color":"var(--lia-bs-primary)","hoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) - 10%))","decoration":"none","hoverDecoration":"underline","__typename":"LinkThemeSettings"},"listGroup":{"itemPaddingY":"15px","itemPaddingX":"15px","borderColor":"var(--lia-bs-gray-300)","__typename":"ListGroupThemeSettings"},"modal":{"contentTextColor":"var(--lia-bs-body-color)","contentBg":"var(--lia-bs-white)","backgroundBg":"var(--lia-bs-black)","smSize":"440px","mdSize":"760px","lgSize":"1080px","backdropOpacity":0.3,"contentBoxShadowXs":"var(--lia-bs-box-shadow-sm)","contentBoxShadow":"var(--lia-bs-box-shadow)","headerFontWeight":"700","__typename":"ModalThemeSettings"},"navbar":{"position":"FIXED","background":{"attachment":null,"clip":null,"color":"var(--lia-bs-white)","imageAssetName":null,"imageLastModified":"0","origin":null,"position":"CENTER_CENTER","repeat":"NO_REPEAT","size":"COVER","__typename":"BackgroundProps"},"backgroundOpacity":0.8,"paddingTop":"15px","paddingBottom":"15px","borderBottom":"1px solid var(--lia-bs-border-color)","boxShadow":"var(--lia-bs-box-shadow-sm)","brandMarginRight":"30px","brandMarginRightSm":"10px","brandLogoHeight":"30px","linkGap":"10px","linkJustifyContent":"flex-start","linkPaddingY":"5px","linkPaddingX":"10px","linkDropdownPaddingY":"9px","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkColor":"var(--lia-bs-body-color)","linkHoverColor":"var(--lia-bs-primary)","linkFontSize":"var(--lia-bs-font-size-sm)","linkFontStyle":"NORMAL","linkFontWeight":"400","linkTextTransform":"NONE","linkLetterSpacing":"normal","linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkBgColor":"transparent","linkBgHoverColor":"transparent","linkBorder":"none","linkBorderHover":"none","linkBoxShadow":"none","linkBoxShadowHover":"none","linkTextBorderBottom":"none","linkTextBorderBottomHover":"none","dropdownPaddingTop":"10px","dropdownPaddingBottom":"15px","dropdownPaddingX":"10px","dropdownMenuOffset":"2px","dropdownDividerMarginTop":"10px","dropdownDividerMarginBottom":"10px","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","controllerIconColor":"var(--lia-bs-body-color)","controllerIconHoverColor":"var(--lia-bs-body-color)","controllerTextColor":"var(--lia-nav-controller-icon-color)","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","controllerHighlightColor":"hsla(30, 100%, 50%)","controllerHighlightTextColor":"var(--lia-yiq-light)","controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerColor":"var(--lia-nav-controller-icon-color)","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","hamburgerBgColor":"transparent","hamburgerBgHoverColor":"transparent","hamburgerBorder":"none","hamburgerBorderHover":"none","collapseMenuMarginLeft":"20px","collapseMenuDividerBg":"var(--lia-nav-link-color)","collapseMenuDividerOpacity":0.16,"__typename":"NavbarThemeSettings"},"pager":{"textColor":"var(--lia-bs-link-color)","textFontWeight":"var(--lia-font-weight-md)","textFontSize":"var(--lia-bs-font-size-sm)","__typename":"PagerThemeSettings"},"panel":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-bs-border-radius)","borderColor":"var(--lia-bs-border-color)","boxShadow":"none","__typename":"PanelThemeSettings"},"popover":{"arrowHeight":"8px","arrowWidth":"16px","maxWidth":"300px","minWidth":"100px","headerBg":"var(--lia-bs-white)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius)","boxShadow":"0 0.5rem 1rem hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.15)","__typename":"PopoverThemeSettings"},"prism":{"color":"#000000","bgColor":"#f5f2f0","fontFamily":"var(--font-family-monospace)","fontSize":"var(--lia-bs-font-size-base)","fontWeightBold":"var(--lia-bs-font-weight-bold)","fontStyleItalic":"italic","tabSize":2,"highlightColor":"#b3d4fc","commentColor":"#62707e","punctuationColor":"#6f6f6f","namespaceOpacity":"0.7","propColor":"#990055","selectorColor":"#517a00","operatorColor":"#906736","operatorBgColor":"hsla(0, 0%, 100%, 0.5)","keywordColor":"#0076a9","functionColor":"#d3284b","variableColor":"#c14700","__typename":"PrismThemeSettings"},"rte":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":" var(--lia-panel-box-shadow)","customColor1":"#bfedd2","customColor2":"#fbeeb8","customColor3":"#f8cac6","customColor4":"#eccafa","customColor5":"#c2e0f4","customColor6":"#2dc26b","customColor7":"#f1c40f","customColor8":"#e03e2d","customColor9":"#b96ad9","customColor10":"#3598db","customColor11":"#169179","customColor12":"#e67e23","customColor13":"#ba372a","customColor14":"#843fa1","customColor15":"#236fa1","customColor16":"#ecf0f1","customColor17":"#ced4d9","customColor18":"#95a5a6","customColor19":"#7e8c8d","customColor20":"#34495e","customColor21":"#000000","customColor22":"#ffffff","defaultMessageHeaderMarginTop":"14px","defaultMessageHeaderMarginBottom":"10px","defaultMessageItemMarginTop":"0","defaultMessageItemMarginBottom":"10px","diffAddedColor":"hsla(170, 53%, 51%, 0.4)","diffChangedColor":"hsla(43, 97%, 63%, 0.4)","diffNoneColor":"hsla(0, 0%, 80%, 0.4)","diffRemovedColor":"hsla(9, 74%, 47%, 0.4)","specialMessageHeaderMarginTop":"14px","specialMessageHeaderMarginBottom":"10px","specialMessageItemMarginTop":"0","specialMessageItemMarginBottom":"10px","__typename":"RteThemeSettings"},"tags":{"bgColor":"var(--lia-bs-gray-200)","bgHoverColor":"var(--lia-bs-gray-400)","borderRadius":"var(--lia-bs-border-radius-sm)","color":"var(--lia-bs-body-color)","hoverColor":"var(--lia-bs-body-color)","fontWeight":"var(--lia-font-weight-md)","fontSize":"var(--lia-font-size-xxs)","textTransform":"UPPERCASE","letterSpacing":"0.5px","__typename":"TagsThemeSettings"},"toasts":{"borderRadius":"var(--lia-bs-border-radius)","paddingX":"12px","__typename":"ToastsThemeSettings"},"typography":{"fontFamilyBase":"Atkinson Hyperlegible","fontStyleBase":"NORMAL","fontWeightBase":"400","fontWeightLight":"300","fontWeightNormal":"400","fontWeightMd":"500","fontWeightBold":"700","letterSpacingSm":"normal","letterSpacingXs":"normal","lineHeightBase":"1.3","fontSizeBase":"15px","fontSizeXxs":"11px","fontSizeXs":"12px","fontSizeSm":"13px","fontSizeLg":"20px","fontSizeXl":"24px","smallFontSize":"14px","customFonts":[],"__typename":"TypographyThemeSettings"},"unstyledListItem":{"marginBottomSm":"5px","marginBottomMd":"10px","marginBottomLg":"15px","marginBottomXl":"20px","marginBottomXxl":"25px","__typename":"UnstyledListItemThemeSettings"},"yiq":{"light":"#ffffff","dark":"#000000","__typename":"YiqThemeSettings"},"colorLightness":{"primaryDark":0.36,"primaryLight":0.74,"primaryLighter":0.89,"primaryLightest":0.95,"infoDark":0.39,"infoLight":0.72,"infoLighter":0.85,"infoLightest":0.93,"successDark":0.24,"successLight":0.62,"successLighter":0.8,"successLightest":0.91,"warningDark":0.39,"warningLight":0.68,"warningLighter":0.84,"warningLightest":0.93,"dangerDark":0.41,"dangerLight":0.72,"dangerLighter":0.89,"dangerLightest":0.95,"__typename":"ColorLightnessThemeSettings"},"localOverride":false,"__typename":"Theme"},"localOverride":false},"CachedAsset:text:en_US-components/common/EmailVerification-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1728320186000","value":{"email.verification.title":"Email Verification Required","email.verification.message.update.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. To change your email, visit My Settings.","email.verification.message.resend.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. Resend email."},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1728320186000","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:quilt:f5.prod:pages/kbs/TkbMessagePage:board:TechnicalArticles-1733222328126":{"__typename":"CachedAsset","id":"quilt:f5.prod:pages/kbs/TkbMessagePage:board:TechnicalArticles-1733222328126","value":{"id":"TkbMessagePage","container":{"id":"Common","headerProps":{"backgroundImageProps":null,"backgroundColor":null,"addComponents":null,"removeComponents":["community.widget.bannerWidget"],"componentOrder":null,"__typename":"QuiltContainerSectionProps"},"headerComponentProps":{"community.widget.breadcrumbWidget":{"disableLastCrumbForDesktop":false}},"footerProps":null,"footerComponentProps":null,"items":[{"id":"message-list","layout":"MAIN_SIDE","bgColor":"transparent","showTitle":true,"showDescription":true,"textPosition":"CENTER","textColor":"var(--lia-bs-body-color)","sectionEditLevel":null,"bgImage":null,"disableSpacing":null,"edgeToEdgeDisplay":null,"fullHeight":null,"showBorder":null,"__typename":"MainSideQuiltSection","columnMap":{"main":[{"id":"tkbs.widget.tkbArticleWidget","className":"lia-tkb-container","props":{"contributorListType":"panel","showHelpfulness":false,"showTimestamp":true,"showGuideNavigationSection":true,"showVersion":true,"lazyLoad":false,"editLevel":"CONFIGURE"},"__typename":"QuiltComponent"}],"side":[{"id":"featuredWidgets.widget.featuredContentWidget","className":null,"props":{"instanceId":"featuredWidgets.widget.featuredContentWidget-1702666556326","layoutProps":{"layout":"card","layoutOptions":{"useRepliesCount":false,"useAuthorRank":false,"useTimeToRead":true,"useKudosCount":false,"useViewCount":true,"usePreviewMedia":true,"useBody":false,"useCenteredCardContent":false,"useTags":true,"useTimestamp":false,"useBoardLink":true,"useAuthorLink":false,"useSolvedBadge":true}},"titleSrOnly":false,"showPager":true,"pageSize":3,"lazyLoad":true},"__typename":"QuiltComponent"},{"id":"messages.widget.relatedContentWidget","className":null,"props":{"hideIfEmpty":true,"enablePagination":true,"useTitle":true,"listVariant":{"type":"listGroup"},"pageSize":3,"style":"list","pagerVariant":{"type":"loadMore"},"viewVariant":{"type":"inline","props":{"useRepliesCount":true,"useMedia":true,"useAuthorRank":false,"useNode":true,"useTimeToRead":true,"useSpoilerFreeBody":true,"useKudosCount":true,"useNodeLink":true,"useViewCount":true,"usePreviewMedia":false,"useBody":false,"timeStampType":"postTime","useTags":true,"clampSubjectLines":2,"useBoardIcon":false,"useMessageTimeLink":true,"clampBodyLines":3,"useTextBody":true,"useSolvedBadge":true,"useAvatar":true,"useAuthorLogin":true,"useUnreadCount":true}},"lazyLoad":true,"panelType":"divider"},"__typename":"QuiltComponent"}],"__typename":"MainSideSectionColumns"}}],"__typename":"QuiltContainer"},"__typename":"Quilt","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-pages/kbs/TkbMessagePage-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-pages/kbs/TkbMessagePage-1728320186000","value":{"title":"{contextMessageSubject} | {communityTitle}","errorMissing":"This article cannot be found","name":"TKB Message Page","section.message-list.title":"","section.erPqcf.title":"","section.erPqcf.description":"","section.message-list.description":""},"localOverride":false},"CachedAsset:quiltWrapper:f5.prod:Common:1733222265596":{"__typename":"CachedAsset","id":"quiltWrapper:f5.prod:Common:1733222265596","value":{"id":"Common","header":{"backgroundImageProps":{"assetName":"header.jpg","backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"LEFT_CENTER","lastModified":"1702932449000","__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"id":"custom.widget.Beta_MetaNav","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"community.widget.navbarWidget","props":{"showUserName":false,"showRegisterLink":true,"style":{"boxShadow":"var(--lia-bs-box-shadow-sm)","linkFontWeight":"700","controllerHighlightColor":"hsla(30, 100%, 50%)","dropdownDividerMarginBottom":"10px","hamburgerBorderHover":"none","linkFontSize":"15px","linkBoxShadowHover":"none","backgroundOpacity":0.4,"controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerBgColor":"transparent","linkTextBorderBottom":"none","hamburgerColor":"var(--lia-nav-controller-icon-color)","brandLogoHeight":"48px","linkLetterSpacing":"normal","linkBgHoverColor":"transparent","collapseMenuDividerOpacity":0.16,"paddingBottom":"10px","dropdownPaddingBottom":"15px","dropdownMenuOffset":"2px","hamburgerBgHoverColor":"transparent","borderBottom":"0","hamburgerBorder":"none","dropdownPaddingX":"10px","brandMarginRightSm":"10px","linkBoxShadow":"none","linkJustifyContent":"center","linkColor":"var(--lia-bs-primary)","collapseMenuDividerBg":"var(--lia-nav-link-color)","dropdownPaddingTop":"10px","controllerHighlightTextColor":"var(--lia-yiq-dark)","background":{"imageAssetName":"","color":"var(--lia-bs-white)","size":"COVER","repeat":"NO_REPEAT","position":"CENTER_CENTER","imageLastModified":""},"linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkHoverColor":"var(--lia-bs-primary)","position":"FIXED","linkBorder":"none","linkTextBorderBottomHover":"2px solid #0C5C8D","brandMarginRight":"30px","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","linkBorderHover":"none","collapseMenuMarginLeft":"20px","linkFontStyle":"NORMAL","linkPaddingX":"10px","paddingTop":"10px","linkPaddingY":"5px","linkTextTransform":"NONE","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkBgColor":"transparent","linkDropdownPaddingY":"9px","controllerIconColor":"#0C5C8D","dropdownDividerMarginTop":"10px","linkGap":"10px","controllerIconHoverColor":"#0C5C8D"},"links":{"sideLinks":[],"mainLinks":[{"children":[{"linkType":"INTERNAL","id":"migrated-link-1","params":{"boardId":"TechnicalForum","categoryId":"Forums"},"routeName":"ForumBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-2","params":{"boardId":"WaterCooler","categoryId":"Forums"},"routeName":"ForumBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-0","params":{"categoryId":"Forums"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-4","params":{"boardId":"codeshare","categoryId":"CrowdSRC"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-5","params":{"boardId":"communityarticles","categoryId":"CrowdSRC"},"routeName":"TkbBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-3","params":{"categoryId":"CrowdSRC"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-7","params":{"boardId":"TechnicalArticles","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"article-series","params":{"boardId":"article-series","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"security-insights","params":{"boardId":"security-insights","categoryId":"Articles"},"routeName":"TkbBoardPage"},{"linkType":"INTERNAL","id":"migrated-link-8","params":{"boardId":"DevCentralNews","categoryId":"Articles"},"routeName":"TkbBoardPage"}],"linkType":"INTERNAL","id":"migrated-link-6","params":{"categoryId":"Articles"},"routeName":"CategoryPage"},{"children":[{"linkType":"INTERNAL","id":"migrated-link-10","params":{"categoryId":"CommunityGroups"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"migrated-link-11","params":{"categoryId":"F5-Groups"},"routeName":"CategoryPage"}],"linkType":"INTERNAL","id":"migrated-link-9","params":{"categoryId":"GroupsCategory"},"routeName":"CategoryPage"},{"children":[],"linkType":"INTERNAL","id":"migrated-link-12","params":{"boardId":"Events","categoryId":"top"},"routeName":"EventBoardPage"},{"children":[],"linkType":"INTERNAL","id":"migrated-link-13","params":{"boardId":"Suggestions","categoryId":"top"},"routeName":"IdeaBoardPage"}]},"className":"QuiltComponent_lia-component-edit-mode__lQ9Z6","showSearchIcon":false},"__typename":"QuiltComponent"},{"id":"community.widget.bannerWidget","props":{"backgroundColor":"transparent","visualEffects":{"showBottomBorder":false},"backgroundImageProps":{"backgroundSize":"COVER","backgroundPosition":"CENTER_CENTER","backgroundRepeat":"NO_REPEAT"},"fontColor":"#222222"},"__typename":"QuiltComponent"},{"id":"community.widget.breadcrumbWidget","props":{"backgroundColor":"var(--lia-bs-primary)","linkHighlightColor":"#FFFFFF","visualEffects":{"showBottomBorder":false},"backgroundOpacity":60,"linkTextColor":"#FFFFFF"},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"footer":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"var(--lia-bs-body-color)","items":[{"id":"custom.widget.Beta_Footer","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.Tag_Manager_Helper","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.Consent_Blackbar","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"__typename":"QuiltWrapper","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-components/common/ActionFeedback-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1728320186000","value":{"joinedGroupHub.title":"Welcome","joinedGroupHub.message":"You are now a member of this group and are subscribed to updates.","groupHubInviteNotFound.title":"Invitation Not Found","groupHubInviteNotFound.message":"Sorry, we could not find your invitation to the group. The owner may have canceled the invite.","groupHubNotFound.title":"Group Not Found","groupHubNotFound.message":"The grouphub you tried to join does not exist. It may have been deleted.","existingGroupHubMember.title":"Already Joined","existingGroupHubMember.message":"You are already a member of this group.","accountLocked.title":"Account Locked","accountLocked.message":"Your account has been locked due to multiple failed attempts. Try again in {lockoutTime} minutes.","editedGroupHub.title":"Changes Saved","editedGroupHub.message":"Your group has been updated.","leftGroupHub.title":"Goodbye","leftGroupHub.message":"You are no longer a member of this group and will not receive future updates.","deletedGroupHub.title":"Deleted","deletedGroupHub.message":"The group has been deleted.","groupHubCreated.title":"Group Created","groupHubCreated.message":"{groupHubName} is ready to use","accountClosed.title":"Account Closed","accountClosed.message":"The account has been closed and you will now be redirected to the homepage","resetTokenExpired.title":"Reset Password Link has Expired","resetTokenExpired.message":"Try resetting your password again","invalidUrl.title":"Invalid URL","invalidUrl.message":"The URL you're using is not recognized. Verify your URL and try again.","accountClosedForUser.title":"Account Closed","accountClosedForUser.message":"{userName}'s account is closed","inviteTokenInvalid.title":"Invitation Invalid","inviteTokenInvalid.message":"Your invitation to the community has been canceled or expired.","inviteTokenError.title":"Invitation Verification Failed","inviteTokenError.message":"The url you are utilizing is not recognized. Verify your URL and try again","pageNotFound.title":"Access Denied","pageNotFound.message":"You do not have access to this area of the community or it doesn't exist","eventAttending.title":"Responded as Attending","eventAttending.message":"You'll be notified when there's new activity and reminded as the event approaches","eventInterested.title":"Responded as Interested","eventInterested.message":"You'll be notified when there's new activity and reminded as the event approaches","eventNotFound.title":"Event Not Found","eventNotFound.message":"The event you tried to respond to does not exist."},"localOverride":false},"CachedAsset:component:custom.widget.Beta_MetaNav-en-1733222345845":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_MetaNav-en-1733222345845","value":{"component":{"id":"custom.widget.Beta_MetaNav","template":{"id":"Beta_MetaNav","markupLanguage":"HANDLEBARS","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_MetaNav","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"MetaNav menu at the top of every page.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Beta_Footer-en-1733222345845":{"__typename":"CachedAsset","id":"component:custom.widget.Beta_Footer-en-1733222345845","value":{"component":{"id":"custom.widget.Beta_Footer","template":{"id":"Beta_Footer","markupLanguage":"HANDLEBARS","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Beta_Footer","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"DevCentral´s custom footer.","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Tag_Manager_Helper-en-1733222345845":{"__typename":"CachedAsset","id":"component:custom.widget.Tag_Manager_Helper-en-1733222345845","value":{"component":{"id":"custom.widget.Tag_Manager_Helper","template":{"id":"Tag_Manager_Helper","markupLanguage":"HANDLEBARS","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Tag_Manager_Helper","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"Helper widget to inject Tag Manager scripts into head element","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:component:custom.widget.Consent_Blackbar-en-1733222345845":{"__typename":"CachedAsset","id":"component:custom.widget.Consent_Blackbar-en-1733222345845","value":{"component":{"id":"custom.widget.Consent_Blackbar","template":{"id":"Consent_Blackbar","markupLanguage":"HTML","style":null,"texts":null,"defaults":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.Consent_Blackbar","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"TEXTHTML","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"dynamicByCoreNode":false,"description":"","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":null,"form":null},"localOverride":false},"CachedAsset:text:en_US-components/community/Breadcrumb-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1728320186000","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBanner-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBanner-1728320186000","value":{"messageMarkedAsSpam":"This post has been marked as spam","messageMarkedAsSpam@board:TKB":"This article has been marked as spam","messageMarkedAsSpam@board:BLOG":"This post has been marked as spam","messageMarkedAsSpam@board:FORUM":"This discussion has been marked as spam","messageMarkedAsSpam@board:OCCASION":"This event has been marked as spam","messageMarkedAsSpam@board:IDEA":"This idea has been marked as spam","manageSpam":"Manage Spam","messageMarkedAsAbuse":"This post has been marked as abuse","messageMarkedAsAbuse@board:TKB":"This article has been marked as abuse","messageMarkedAsAbuse@board:BLOG":"This post has been marked as abuse","messageMarkedAsAbuse@board:FORUM":"This discussion has been marked as abuse","messageMarkedAsAbuse@board:OCCASION":"This event has been marked as abuse","messageMarkedAsAbuse@board:IDEA":"This idea has been marked as abuse","preModCommentAuthorText":"This comment will be published as soon as it is approved","preModCommentModeratorText":"This comment is awaiting moderation","messageMarkedAsOther":"This post has been rejected due to other reasons","messageMarkedAsOther@board:TKB":"This article has been rejected due to other reasons","messageMarkedAsOther@board:BLOG":"This post has been rejected due to other reasons","messageMarkedAsOther@board:FORUM":"This discussion has been rejected due to other reasons","messageMarkedAsOther@board:OCCASION":"This event has been rejected due to other reasons","messageMarkedAsOther@board:IDEA":"This idea has been rejected due to other reasons"},"localOverride":false},"CachedAsset:text:en_US-components/tkbs/TkbArticleWidget-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/tkbs/TkbArticleWidget-1728320186000","value":{},"localOverride":false},"Category:category:Forums":{"__typename":"Category","id":"category:Forums","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Forum:board:TechnicalForum":{"__typename":"Forum","id":"board:TechnicalForum","forumPolicies":{"__typename":"ForumPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Forum:board:WaterCooler":{"__typename":"Forum","id":"board:WaterCooler","forumPolicies":{"__typename":"ForumPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:DevCentralNews":{"__typename":"Tkb","id":"board:DevCentralNews","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:GroupsCategory":{"__typename":"Category","id":"category:GroupsCategory","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:F5-Groups":{"__typename":"Category","id":"category:F5-Groups","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:CommunityGroups":{"__typename":"Category","id":"category:CommunityGroups","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Occasion:board:Events":{"__typename":"Occasion","id":"board:Events","boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"occasionPolicies":{"__typename":"OccasionPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Idea:board:Suggestions":{"__typename":"Idea","id":"board:Suggestions","boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"ideaPolicies":{"__typename":"IdeaPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:CrowdSRC":{"__typename":"Category","id":"category:CrowdSRC","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:codeshare":{"__typename":"Tkb","id":"board:codeshare","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:communityarticles":{"__typename":"Tkb","id":"board:communityarticles","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:security-insights":{"__typename":"Tkb","id":"board:security-insights","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Tkb:board:article-series":{"__typename":"Tkb","id":"board:article-series","tkbPolicies":{"__typename":"TkbPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"QueryVariables:TopicReplyList:message:280332:2":{"__typename":"QueryVariables","id":"TopicReplyList:message:280332:2","value":{"id":"message:280332","first":10,"sorts":{"postTime":{"direction":"ASC"}},"repliesFirst":3,"repliesFirstDepthThree":1,"repliesSorts":{"postTime":{"direction":"ASC"}},"useAvatar":true,"useAuthorLogin":true,"useAuthorRank":true,"useBody":true,"useKudosCount":true,"useTimeToRead":false,"useMedia":false,"useReadOnlyIcon":false,"useRepliesCount":true,"useSearchSnippet":false,"useAcceptedSolutionButton":false,"useSolvedBadge":false,"useAttachments":false,"attachmentsFirst":5,"useTags":true,"useNodeAncestors":false,"useUserHoverCard":true,"useNodeHoverCard":false,"useModerationStatus":true,"usePreviewSubjectModal":false,"useMessageStatus":true}},"ROOT_MUTATION":{"__typename":"Mutation"},"CachedAsset:text:en_US-components/customComponent/CustomComponent-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/customComponent/CustomComponent-1728320186000","value":{"errorMessage":"Error rendering component id: {customComponentId}","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-components/community/Navbar-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1728320186000","value":{"community":"Community Home","inbox":"Inbox","manageContent":"Manage Content","tos":"Terms of Service","forgotPassword":"Forgot Password","themeEditor":"Theme Editor","edit":"Edit Navigation Bar","skipContent":"Skip to content","migrated-link-9":"Groups","migrated-link-7":"Technical Articles","migrated-link-8":"DevCentral News","migrated-link-1":"Technical Forum","migrated-link-10":"Community Groups","migrated-link-2":"Water Cooler","migrated-link-11":"F5 Groups","migrated-link-0":"Forums","article-series":"Article Series","migrated-link-5":"Community Articles","migrated-link-6":"Articles","security-insights":"Security Insights","migrated-link-3":"CrowdSRC","migrated-link-4":"CodeShare","migrated-link-12":"Events","migrated-link-13":"Suggestions"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarHamburgerDropdown-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1728320186000","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1728320186000","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1728320186000","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1728320186000","value":{"title.login":"Sign In","title.registration":"Register","title.forgotPassword":"Forgot Password","title.multiAuthLogin":"Sign In"},"localOverride":false},"CachedAsset:text:en_US-components/nodes/NodeLink-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1728320186000","value":{"place":"Place {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageView/MessageViewStandard-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewStandard-1728320186000","value":{"anonymous":"Anonymous","author":"{messageAuthorLogin}","authorBy":"{messageAuthorLogin}","board":"{messageBoardTitle}","replyToUser":" to {parentAuthor}","showMoreReplies":"Show More","replyText":"Reply","repliesText":"Replies","markedAsSolved":"Marked as Solved","movedMessagePlaceholder.BLOG":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.TKB":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.FORUM":"{count, plural, =0 {This reply has been} other {These replies have been} }","movedMessagePlaceholder.IDEA":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.OCCASION":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholderUrlText":"moved.","messageStatus":"Status: ","statusChanged":"Status changed: {previousStatus} to {currentStatus}","statusAdded":"Status added: {status}","statusRemoved":"Status removed: {status}","labelExpand":"expand replies","labelCollapse":"collapse replies","unhelpfulReason.reason1":"Content is outdated","unhelpfulReason.reason2":"Article is missing information","unhelpfulReason.reason3":"Content is for a different Product","unhelpfulReason.reason4":"Doesn't match what I was searching for"},"localOverride":false},"CachedAsset:text:en_US-components/messages/ThreadedReplyList-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/ThreadedReplyList-1728320186000","value":{"title":"{count, plural, one{# Reply} other{# Replies}}","title@board:BLOG":"{count, plural, one{# Comment} other{# Comments}}","title@board:TKB":"{count, plural, one{# Comment} other{# Comments}}","title@board:IDEA":"{count, plural, one{# Comment} other{# Comments}}","title@board:OCCASION":"{count, plural, one{# Comment} other{# Comments}}","noRepliesTitle":"No Replies","noRepliesTitle@board:BLOG":"No Comments","noRepliesTitle@board:TKB":"No Comments","noRepliesTitle@board:IDEA":"No Comments","noRepliesTitle@board:OCCASION":"No Comments","noRepliesDescription":"Be the first to reply","noRepliesDescription@board:BLOG":"Be the first to comment","noRepliesDescription@board:TKB":"Be the first to comment","noRepliesDescription@board:IDEA":"Be the first to comment","noRepliesDescription@board:OCCASION":"Be the first to comment","messageReadOnlyAlert:BLOG":"Comments have been turned off for this post","messageReadOnlyAlert:TKB":"Comments have been turned off for this article","messageReadOnlyAlert:IDEA":"Comments have been turned off for this idea","messageReadOnlyAlert:FORUM":"Replies have been turned off for this discussion","messageReadOnlyAlert:OCCASION":"Comments have been turned off for this event"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageReplyCallToAction-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyCallToAction-1728320186000","value":{"leaveReply":"Leave a reply...","leaveReply@board:BLOG@message:root":"Leave a comment...","leaveReply@board:TKB@message:root":"Leave a comment...","leaveReply@board:IDEA@message:root":"Leave a comment...","leaveReply@board:OCCASION@message:root":"Leave a comment...","repliesTurnedOff.FORUM":"Replies are turned off for this topic","repliesTurnedOff.BLOG":"Comments are turned off for this topic","repliesTurnedOff.TKB":"Comments are turned off for this topic","repliesTurnedOff.IDEA":"Comments are turned off for this topic","repliesTurnedOff.OCCASION":"Comments are turned off for this topic","infoText":"Stop poking me!"},"localOverride":false},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/cmstMzYtWjgzVzZJ\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/cmstMzYtWjgzVzZJ","height":0,"width":0,"mimeType":"image/svg+xml"},"Rank:rank:36":{"__typename":"Rank","id":"rank:36","position":13,"name":"Cirrocumulus","color":"CCCCCC","icon":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/cmstMzYtWjgzVzZJ\"}"},"rankStyle":"FILLED"},"User:user:307368":{"__typename":"User","id":"user:307368","uid":307368,"login":"mhite_60883","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2010-03-31T01:00:00.000-07:00","confirmEmailStatus":null,"registrationAccessLevel":null,"ssoRegistrationFields":[]},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-9.svg"},"rank":{"__ref":"Rank:rank:36"},"messagesCount":218,"kudosGivenCount":0,"kudosReceivedCount":0,"kudosWeight":1,"ssoId":null,"followersCount":null,"solutionsCount":7},"ModerationData:moderation_data:280333":{"__typename":"ModerationData","id":"moderation_data:280333","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"TkbReplyMessage:message:280333":{"__typename":"TkbReplyMessage","author":{"__ref":"User:user:307368"},"id":"message:280333","revisionNum":1,"uid":280333,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Tkb:board:TechnicalArticles"},"parent":{"__ref":"TkbTopicMessage:message:280332"},"conversation":{"__ref":"Conversation:conversation:280332"},"subject":"Re: Existing Ansible BIG-IP modules","moderationData":{"__ref":"ModerationData:moderation_data:280333"},"body":"Thanks for the fantastic tutorial covering all this! It's certainly been a fun challenge getting all the F5 bits and pieces to work with F5 and I can't wait to see what new levels you take this to.\n\n-- Matt","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"203","kudosSumWeight":0,"repliesCount":0,"postTime":"2016-02-13T15:35:35.000-08:00","lastPublishTime":"2016-02-13T15:35:35.000-08:00","metrics":{"__typename":"MessageMetrics","views":809},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/cmstNDEtSzFzVEth\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/cmstNDEtSzFzVEth","height":0,"width":0,"mimeType":"image/svg+xml"},"Rank:rank:41":{"__typename":"Rank","id":"rank:41","position":18,"name":"Nimbostratus","color":"CCCCCC","icon":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/cmstNDEtSzFzVEth\"}"},"rankStyle":"FILLED"},"User:user:126740":{"__typename":"User","id":"user:126740","uid":126740,"login":"jcshelby_261360","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2019-05-05T01:26:23.000-07:00","confirmEmailStatus":null,"registrationAccessLevel":null,"ssoRegistrationFields":[]},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-4.svg"},"rank":{"__ref":"Rank:rank:41"},"messagesCount":1,"kudosGivenCount":0,"kudosReceivedCount":0,"kudosWeight":1,"ssoId":null,"followersCount":null,"solutionsCount":0},"ModerationData:moderation_data:280334":{"__typename":"ModerationData","id":"moderation_data:280334","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"TkbReplyMessage:message:280334":{"__typename":"TkbReplyMessage","author":{"__ref":"User:user:126740"},"id":"message:280334","revisionNum":1,"uid":280334,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Tkb:board:TechnicalArticles"},"parent":{"__ref":"TkbTopicMessage:message:280332"},"conversation":{"__ref":"Conversation:conversation:280332"},"subject":"Re: Existing Ansible BIG-IP modules","moderationData":{"__ref":"ModerationData:moderation_data:280334"},"body":"Excellent tutorial and much appreciated. I have one question - I'm working with the new bigip_virtual_server module and am having some issues with getting it to work correctly. Do you have any experience with this module, and if so could I solicit your input on the issues I'm seeing? Thanks in advance for the assistance.","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"203","kudosSumWeight":0,"repliesCount":0,"postTime":"2016-04-27T12:39:55.000-07:00","lastPublishTime":"2016-04-27T12:39:55.000-07:00","metrics":{"__typename":"MessageMetrics","views":809},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/cmstMjktRWl0NU5q\"}":{"__typename":"AssociatedImage","url":"https://community.f5.com/t5/s/zihoc95639/images/cmstMjktRWl0NU5q","height":24,"width":21,"mimeType":"image/png"},"Rank:rank:29":{"__typename":"Rank","id":"rank:29","position":6,"name":"MVP","color":"7CC0EB","icon":{"__ref":"AssociatedImage:{\"url\":\"https://community.f5.com/t5/s/zihoc95639/images/cmstMjktRWl0NU5q\"}"},"rankStyle":"FILLED"},"User:user:225981":{"__typename":"User","id":"user:225981","uid":225981,"login":"Sebastian_Maniak","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2009-12-07T00:00:00.000-08:00","confirmEmailStatus":null,"registrationAccessLevel":null,"ssoRegistrationFields":[]},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-1.svg"},"rank":{"__ref":"Rank:rank:29"},"messagesCount":60,"kudosGivenCount":17,"kudosReceivedCount":26,"kudosWeight":1,"ssoId":null,"followersCount":null,"solutionsCount":3},"ModerationData:moderation_data:280335":{"__typename":"ModerationData","id":"moderation_data:280335","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"TkbReplyMessage:message:280335":{"__typename":"TkbReplyMessage","author":{"__ref":"User:user:225981"},"id":"message:280335","revisionNum":1,"uid":280335,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Tkb:board:TechnicalArticles"},"parent":{"__ref":"TkbTopicMessage:message:280332"},"conversation":{"__ref":"Conversation:conversation:280332"},"subject":"Re: Existing Ansible BIG-IP modules","moderationData":{"__ref":"ModerationData:moderation_data:280335"},"body":"

Great work. I am getting this error. have you seen this before ..

 

\n

fatal: [192.168.234.131]: FAILED! => {\"changed\": false, \"failed\": true, \"msg\": \"received exception: \\ntraceback: Traceback (most recent call last):\\n File \\\"/tmp/ansible_f3H4ou/ansible_module_bigip_facts.py\\\", line 1659, in main\\n saved_active_folder = ()\\n File \\\"/tmp/ansible_f3H4ou/ansible_module_bigip_facts.py\\\", line 143, in get_active_folder\\n return self.api.System.Session.get_active_folder()\\n File \\\"/usr/local/lib/python2.7/dist-packages/bigsuds.py\\\", line 360, in __getattr__\\n client = self._client_creator('%s.%s' % (self._name, attr))\\n File \\\"/usr/local/lib/python2.7/dist-packages/bigsuds.py\\\", line 170, in _create_client\\n raise ConnectionError(str(e))\\nConnectionError: \\n\"}

 

","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"211","kudosSumWeight":0,"repliesCount":0,"postTime":"2017-01-31T15:46:55.000-08:00","lastPublishTime":"2017-01-31T15:46:55.000-08:00","metrics":{"__typename":"MessageMetrics","views":802},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"ModerationData:moderation_data:280336":{"__typename":"ModerationData","id":"moderation_data:280336","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"TkbReplyMessage:message:280336":{"__typename":"TkbReplyMessage","author":{"__ref":"User:user:217977"},"id":"message:280336","revisionNum":1,"uid":280336,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Tkb:board:TechnicalArticles"},"parent":{"__ref":"TkbTopicMessage:message:280332"},"conversation":{"__ref":"Conversation:conversation:280332"},"subject":"Re: Existing Ansible BIG-IP modules","moderationData":{"__ref":"ModerationData:moderation_data:280336"},"body":"

Sebastian, try adding the following to your tasks

 

\n

validate_certs: \"no\"

 

","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"90","kudosSumWeight":0,"repliesCount":0,"postTime":"2017-01-31T18:03:25.000-08:00","lastPublishTime":"2017-01-31T18:03:25.000-08:00","metrics":{"__typename":"MessageMetrics","views":802},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"ModerationData:moderation_data:280337":{"__typename":"ModerationData","id":"moderation_data:280337","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"TkbReplyMessage:message:280337":{"__typename":"TkbReplyMessage","author":{"__ref":"User:user:225981"},"id":"message:280337","revisionNum":2,"uid":280337,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Tkb:board:TechnicalArticles"},"parent":{"__ref":"TkbTopicMessage:message:280332"},"conversation":{"__ref":"Conversation:conversation:280332"},"subject":"Re: Existing Ansible BIG-IP modules","moderationData":{"__ref":"ModerationData:moderation_data:280337"},"body":"

it didn't like that.

\n

The error appears to have been in '/home/smaniak/ansible/playbooks/sites.yaml': line 12, column 1, but may\nbe elsewhere in the file depending on the exact syntax problem.

\n

The offending line appears to be:

\n
        include: \"system_info\"\n    validate_certs: \"no\"\n
\n\n

^ here

","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"203","kudosSumWeight":0,"repliesCount":0,"postTime":"2017-02-01T04:33:48.000-08:00","lastPublishTime":"2023-06-03T22:48:44.180-07:00","metrics":{"__typename":"MessageMetrics","views":805},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"ModerationData:moderation_data:280338":{"__typename":"ModerationData","id":"moderation_data:280338","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"TkbReplyMessage:message:280338":{"__typename":"TkbReplyMessage","author":{"__ref":"User:user:225981"},"id":"message:280338","revisionNum":2,"uid":280338,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Tkb:board:TechnicalArticles"},"parent":{"__ref":"TkbTopicMessage:message:280332"},"conversation":{"__ref":"Conversation:conversation:280332"},"subject":"Re: Existing Ansible BIG-IP modules","moderationData":{"__ref":"ModerationData:moderation_data:280338"},"body":"

Got it working, I had to use

\n
        validate_certs: \"false\"\n
\n\n

thanks.

","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"79","kudosSumWeight":0,"repliesCount":0,"postTime":"2017-02-01T07:32:53.000-08:00","lastPublishTime":"2023-06-03T22:48:41.419-07:00","metrics":{"__typename":"MessageMetrics","views":801},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"User:user:398163":{"__typename":"User","id":"user:398163","uid":398163,"login":"mthornton42_217","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2019-05-04T22:00:19.000-07:00","confirmEmailStatus":null,"registrationAccessLevel":null,"ssoRegistrationFields":[]},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-4.svg"},"rank":{"__ref":"Rank:rank:41"},"messagesCount":9,"kudosGivenCount":0,"kudosReceivedCount":0,"kudosWeight":1,"ssoId":null,"followersCount":null,"solutionsCount":0},"ModerationData:moderation_data:280339":{"__typename":"ModerationData","id":"moderation_data:280339","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"TkbReplyMessage:message:280339":{"__typename":"TkbReplyMessage","author":{"__ref":"User:user:398163"},"id":"message:280339","revisionNum":1,"uid":280339,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Tkb:board:TechnicalArticles"},"parent":{"__ref":"TkbTopicMessage:message:280332"},"conversation":{"__ref":"Conversation:conversation:280332"},"subject":"Re: Existing Ansible BIG-IP modules","moderationData":{"__ref":"ModerationData:moderation_data:280339"},"body":"

Is there a way to prompt for the password, rather than storing it in the playbook?

 

","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"93","kudosSumWeight":0,"repliesCount":0,"postTime":"2017-04-13T13:51:13.000-07:00","lastPublishTime":"2017-04-13T13:51:13.000-07:00","metrics":{"__typename":"MessageMetrics","views":801},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"ModerationData:moderation_data:280340":{"__typename":"ModerationData","id":"moderation_data:280340","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"TkbReplyMessage:message:280340":{"__typename":"TkbReplyMessage","author":{"__ref":"User:user:217977"},"id":"message:280340","revisionNum":2,"uid":280340,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Tkb:board:TechnicalArticles"},"parent":{"__ref":"TkbTopicMessage:message:280332"},"conversation":{"__ref":"Conversation:conversation:280332"},"subject":"Re: Existing Ansible BIG-IP modules","moderationData":{"__ref":"ModerationData:moderation_data:280340"},"body":"

@mthornton42 you can provide the values needed to connect in a number of ways.

\n\n

If you use vars_prompt in your playbook, just refer to the variables you set when you use the tasks. For example.

\n
...\nvars_prompt:\n  - name: \"username\"\n    prompt: \"what is your name?\"\n  - name: \"password\"\n    prompt: \"what is your password?\"\n    private: yes\n\ntasks:\n    - name: foo\n      bigip_virtual_server:\n          ...\n          user: \"{{ username }}\"\n          password: \"{{ password }}\"\n          ...\n
\n\n

be aware that vars_prompt is a playbook level configuration.

","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"203","kudosSumWeight":0,"repliesCount":0,"postTime":"2017-04-13T14:52:56.000-07:00","lastPublishTime":"2023-06-05T22:40:18.898-07:00","metrics":{"__typename":"MessageMetrics","views":795},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"User:user:207603":{"__typename":"User","id":"user:207603","uid":207603,"login":"devnullNZ","biography":null,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2013-03-05T00:00:00.000-08:00","confirmEmailStatus":null,"registrationAccessLevel":null,"ssoRegistrationFields":[]},"deleted":false,"email":"","avatar":{"__typename":"UserAvatar","url":"https://community.f5.com/t5/s/zihoc95639/m_assets/avatars/default/avatar-8.svg"},"rank":{"__ref":"Rank:rank:41"},"messagesCount":12,"kudosGivenCount":0,"kudosReceivedCount":0,"kudosWeight":1,"ssoId":null,"followersCount":null,"solutionsCount":0},"ModerationData:moderation_data:280341":{"__typename":"ModerationData","id":"moderation_data:280341","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"TkbReplyMessage:message:280341":{"__typename":"TkbReplyMessage","author":{"__ref":"User:user:207603"},"id":"message:280341","revisionNum":1,"uid":280341,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Tkb:board:TechnicalArticles"},"parent":{"__ref":"TkbTopicMessage:message:280332"},"conversation":{"__ref":"Conversation:conversation:280332"},"subject":"Re: Existing Ansible BIG-IP modules","moderationData":{"__ref":"ModerationData:moderation_data:280341"},"body":"

Is there already a module that will return client side & server side connection info?

 

\n

I'm wanting to forceably close connections as part of a playbook that switches traffic to another F5 pair as part of a failover strategy between DC's.\nSo far I haven't found this info being exposed in any of the ansible F5 modules...

 

","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"212","kudosSumWeight":0,"repliesCount":0,"postTime":"2017-04-23T20:34:42.000-07:00","lastPublishTime":"2017-04-23T20:34:42.000-07:00","metrics":{"__typename":"MessageMetrics","views":800},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"ModerationData:moderation_data:280342":{"__typename":"ModerationData","id":"moderation_data:280342","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"TkbReplyMessage:message:280342":{"__typename":"TkbReplyMessage","author":{"__ref":"User:user:217977"},"id":"message:280342","revisionNum":1,"uid":280342,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Tkb:board:TechnicalArticles"},"parent":{"__ref":"TkbTopicMessage:message:280332"},"conversation":{"__ref":"Conversation:conversation:280332"},"subject":"Re: Existing Ansible BIG-IP modules","moderationData":{"__ref":"ModerationData:moderation_data:280342"},"body":"

@devnullNZ

 

\n

Not at this time. Please file an issue for this and provide details on exactly what you're interested in and it can be added.

 

\n

https://github.com/F5Networks/f5-ansible/issues

 

\n

-tim

 

","body@stripHtml({\"removeProcessingText\":false,\"removeSpoilerMarkup\":false,\"removeTocMarkup\":false,\"truncateLength\":200})@stringLength":"218","kudosSumWeight":0,"repliesCount":0,"postTime":"2017-04-24T09:07:12.000-07:00","lastPublishTime":"2017-04-24T09:07:12.000-07:00","metrics":{"__typename":"MessageMetrics","views":800},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"replies":{"__typename":"MessageConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1728320186000","value":{"title":"Query Handler"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1728320186000","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSubject-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1728320186000","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1728320186000","value":{"showMessageBody":"Show More","mentionsErrorTitle":"{mentionsType, select, board {Board} user {User} message {Message} other {}} No Longer Available","mentionsErrorMessage":"The {mentionsType} you are trying to view has been removed from the community.","videoProcessing":"Video is being processed. Please try again in a few minutes.","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageCustomFields-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageCustomFields-1728320186000","value":{"CustomField.default.label":"Value of {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageRevision-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRevision-1728320186000","value":{"lastUpdatedDatePublished":"{publishCount, plural, one{Published} other{Updated}} {date}","lastUpdatedDateDraft":"Created {date}","version":"Version {major}.{minor}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageReplyButton-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyButton-1728320186000","value":{"repliesCount":"{count}","title":"Reply","title@board:BLOG@message:root":"Comment","title@board:TKB@message:root":"Comment","title@board:IDEA@message:root":"Comment","title@board:OCCASION@message:root":"Comment"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageAuthorBio-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageAuthorBio-1728320186000","value":{"sendMessage":"Send Message","actionMessage":"Follow this blog board to get notified when there's new activity","coAuthor":"CO-PUBLISHER","contributor":"CONTRIBUTOR","userProfile":"View Profile","iconlink":"Go to {name} {type}"},"localOverride":false},"CachedAsset:text:en_US-components/guides/GuideBottomNavigation-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/guides/GuideBottomNavigation-1728320186000","value":{"nav.label":"Previous/Next Page","nav.previous":"Previous","nav.next":"Next"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1728320186000","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserRank-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserRank-1728320186000","value":{"rankName":"{rankName}","userRank":"Author rank {rankName}"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserRegistrationDate-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserRegistrationDate-1728320186000","value":{"noPrefix":"{date}","withPrefix":"Joined {date}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageTime-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTime-1728320186000","value":{"postTime":"Published: {time}","lastPublishTime":"Last Update: {time}","conversation.lastPostingActivityTime":"Last posting activity time: {time}","conversation.lastPostTime":"Last post time: {time}","moderationData.rejectTime":"Rejected time: {time}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Pager/PagerLoadMorePreviousNextLinkable-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Pager/PagerLoadMorePreviousNextLinkable-1728320186000","value":{"loadMore":"Show More"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagView/TagViewChip-1728320186000","value":{"tagLabelName":"Tag name {tagName}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1728320186000","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1728320186000":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/ranks/UserRankLabel-1728320186000","value":{"altTitle":"Icon for {rankName} rank"},"localOverride":false}}}},"page":"/kbs/TkbMessagePage/TkbMessagePage","query":{"boardId":"technicalarticles","messageSubject":"existing-ansible-big-ip-modules","messageId":"280332"},"buildId":"RL9aTUoti7G3vPN1EM--R","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"f5","openTelemetryServiceVersion":"24.10.0","openTelemetryUniverse":"prod","openTelemetryCollector":"http://localhost:4318","openTelemetryRouteChangeAllowedTime":"5000","khorosSignInIdpId":"kh-auth-idp","apolloDevToolsEnabled":false},"isFallback":false,"isExperimentalCompile":false,"dynamicIds":["./components/customComponent/CustomComponent/CustomComponent.tsx","./components/community/Navbar/NavbarWidget.tsx","./components/community/Breadcrumb/BreadcrumbWidget.tsx","./components/tkbs/TkbArticleWidget/TkbArticleWidget.tsx","./components/messages/MessageView/MessageViewStandard/MessageViewStandard.tsx","./components/messages/ThreadedReplyList/ThreadedReplyList.tsx","../shared/client/components/common/List/UnstyledList/UnstyledList.tsx","./components/messages/MessageView/MessageView.tsx","../shared/client/components/common/Pager/PagerLoadMorePreviousNextLinkable/PagerLoadMorePreviousNextLinkable.tsx","../shared/client/components/common/List/UnwrappedList/UnwrappedList.tsx","./components/tags/TagView/TagView.tsx","./components/tags/TagView/TagViewChip/TagViewChip.tsx"],"appGip":true,"scriptLoader":[]}