将字符串附加到 Ansible 中的列表

Nal*_*ore 5 ansible

我正在尝试将一个字符串附加到 ansible 中的列表中,所以基本上我将构建一个有效负载来删除 F5 GTM 网络设备中的一些拓扑记录。

我能够创建一个列表,其中包含相应拓扑记录的所有输出。对于输出的每一行,我需要附加一个字符串“删除”。

- name: Lookup Topology Records  
  bigip_command:
    user: admin
    password: password
    server: gtm.abc.com
    commands: "list gtm topology | grep -i '{{ item }}'"
    warn: no
    validate_certs: no
  register: topology_info
  delegate_to: localhost
  loop: "{{ gtm_pool }}"
  
- debug: var=topology_info
 
- name: Sanitize the Topology records of the Pool
  set_fact:
    clean_topology_info: "{{ clean_topology_info | default ([]) + item.stdout_lines  }}"
  loop: "{{ topology_info.results }}"
  
- debug: var=clean_topology_info
 
 
- name: Sanitized Topology Info
  vars:
    topology_item: "{{ item }}"
   set_fact:
     sanitized_topology_info: "{{ sanitized_topology_info | default ([]) + topology_item }}"
  loop: "{{ clean_topology_info }}"
  
- name: Build payload to delete the Topology Record
  set_fact:
    topology_payload: "{{ topology_payload | default([]) + ['delete'] + item }}"
  loop: "{{ clean_topology_info }}"
  
- debug: var=topology_payload

------------------------------------------------------------
Debug outputs(stdout_lines) as below :-

"gtm_pool": [
        "test-poo1", 
        "test-pool2"
    ]

debug of "topology_info" :-

"stdout_lines": [
                    [
                        "gtm topology ldns: subnet 10.10.10.0/24 server: pool /Common/test-pool1 {", 
                        "gtm topology ldns: subnet 10.8.22.0/24 server: pool /Common/test-pool1 {"
                    ]
                ]

"stdout_lines": [
                    [
                        "gtm topology ldns: subnet 0.0.0.0/0 server: pool /Common/test-pool2 {"
                    ]


debug of "clean_topology_info":-

"clean_topology_info": [
        [
                        "gtm topology ldns: subnet 10.10.10.0/24 server: pool /Common/test-pool1 {", 
                        "gtm topology ldns: subnet 10.8.22.0/24 server: pool /Common/test-pool1 {", 
        ], 
        [
            "gtm topology ldns: subnet 0.0.0.0/0 server: pool /Common/test-pool2 {",
        ]
    ]

debug of "sanitized_topology_info":-

"sanitized_topology_info": [
             "gtm topology ldns: subnet 10.10.10.0/24 server: pool /Common/test-pool1 {", 
                        "gtm topology ldns: subnet 10.8.22.0/24 server: pool /Common/test-pool1 {", 
           "gtm topology ldns: subnet 0.0.0.0/0 server: pool /Common/test-pool2 {"
        ]



debug of "topology_payload":-

"topology_payload": [
        "delete", 
        "gtm topology ldns: subnet 10.10.10.0/24 server: pool /Common/test-pool1 {", 
                        "gtm topology ldns: subnet 10.8.22.0/24 server: pool /Common/test-pool1 {",  
        "delete", 
       "gtm topology ldns: subnet 0.0.0.0/0 server: pool /Common/test-pool2 {"
    ]


Expected output of topology_payload should be like :-

Basically i need to append a string 'delete' infront of the each output.

"topology_payload": [ 
        "delete gtm topology ldns: subnet 10.10.10.0/24 server: pool /Common/test-pool1 {", 
                        "delete gtm topology ldns: subnet 10.8.22.0/24 server: pool /Common/test-pool1 {",  
       "delete gtm topology ldns: subnet 0.0.0.0/0 server: pool /Common/test-pool2 {"
    ]
Run Code Online (Sandbox Code Playgroud)

topology_payload 的预期输出应该是这样的:-

基本上我需要在每个输出前面附加一个字符串“删除”。

topology_payload:
  - "delete gtm topology ldns: subnet 10.10.10.0/24 server: pool /Common/test-pool1"
  - "delete gtm topology ldns: subnet 10.8.22.0/24 server: pool /Common/test-pool1"
  - "delete gtm topology ldns: subnet 0.0.0.0/0 server: pool /Common/test-pool2"
Run Code Online (Sandbox Code Playgroud)

Vla*_*tka 11

问: “在每个项目前面添加一个字符串。”'delete'

A:这就是你要找的东西吗?

- hosts: localhost
  vars:
    info: ['a', 'b', 'c']
  tasks:
    - set_fact:
        payload: "{{ payload|default([]) + ['delete ' ~ item] }}"
      loop: "{{ info }}"
    - debug:
        var: payload
Run Code Online (Sandbox Code Playgroud)

给出(删节)

payload:
  - delete a
  - delete b
  - delete c
Run Code Online (Sandbox Code Playgroud)

无需迭代即可实现相同的结果(信用@Romain DEQUIDT)

- hosts: localhost
  vars:
    info: ['a', 'b', 'c']
    payload: "{{ ['delete']|product(info)|map('join', ' ')|list }}"
  tasks:
    - debug:
        var: payload
Run Code Online (Sandbox Code Playgroud)

问:“在每个以 开头的输出前面添加一个字符串‘delete’ 'gtm topology'。”

A:使用测试搜索

- hosts: localhost
  gather_facts: false
  vars:
    info: ['a', 'gtm topology', 'c']
  tasks:
    - set_fact:
        payload: "{{ payload|default([]) + ['delete ' ~ item] }}"
      loop: "{{ info }}"
      when: item is search('^gtm topology')
    - debug:
        var: payload
Run Code Online (Sandbox Code Playgroud)

给出(删节)

payload:
  - delete gtm topology
Run Code Online (Sandbox Code Playgroud)

无需迭代即可达到相同的结果

- hosts: localhost
  vars:
    info: ['a', 'gtm topology', 'c']
    info_gtm_topology: "{{ info|select('search', '^gtm topology') }}"
    payload: "{{ ['delete']|product(info_gtm_topology)|map('join', ' ')|list }}"
  tasks:
    - debug:
        var: payload
Run Code Online (Sandbox Code Playgroud)

问:“除了上述条件外,处理列表,直到'test-pool1'找到为止。”

A:还可以使用测试搜索来查找最后一项的索引

  hosts: localhost
  vars:
    info: ['a', 'gtm topology 1', 'c', 'test-pool1', 'gtm topology 2', 'd']
    stop_regex: '.*pool1.*'
    stop_items: "{{ info|select('search', stop_regex) }}"
    stop_index: "{{ info.index(stop_items.0) }}"
  tasks:
    - set_fact:
        payload: "{{ payload|default([]) + ['delete ' ~ item] }}"
      loop: "{{ info[:stop_index|int] }}"
      when: item is search('^gtm topology')
    - debug:
        var: payload
Run Code Online (Sandbox Code Playgroud)

给出(删节)

payload:
  - delete gtm topology 1
Run Code Online (Sandbox Code Playgroud)

无需迭代即可达到相同的结果

- hosts: localhost
  vars:
    info: ['a', 'gtm topology 1', 'c', 'test-pool1', 'gtm topology 2', 'd']
    stop_regex: '.*pool1.*'
    stop_items: "{{ info|select('search', stop_regex) }}"
    stop_index: "{{ info.index(stop_items.0) }}"
    info_gtm_topology: "{{ info[:stop_index|int]|select('search', '^gtm topology') }}"
    payload: "{{ ['delete']|product(info_gtm_topology)|map('join', ' ')|list }}"
  tasks:
    - debug:
        var: payload
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您可以创建自定义过滤器。请参阅过滤器插件

shell> cat filter_plugins/list_search.py 
import re


def list_search(l, x):
    r = re.compile(x)
    return list(filter(r.match, l))


def list_index(l, x, *i):
    if len(i) == 0:
        return l.index(x) if x in l else -1
    elif len(i) == 1:
        return l.index(x, i[0]) if x in l[i[0]:] else -1
    else:
        return l.index(x, i[0], i[1]) if x in l[i[0]:i[1]] else -1


class FilterModule(object):
    ''' Ansible filters for operating on lists '''

    def filters(self):
        return {
            'list_index': list_index,
            'list_search': list_search,
        }
Run Code Online (Sandbox Code Playgroud)

下面的剧

- hosts: localhost
  vars:
    info: ['a', 'gtm topology 1', 'c', 'test-pool1', 'gtm topology 2', 'd']
    stop_regex: '.*pool1.*'
    stop_items: "{{ info|list_search(stop_regex) }}"
    stop_index: "{{ info|list_index(stop_items.0) }}"
    info_gtm_topology: "{{ info[:stop_index|int]|select('search', '^gtm topology') }}"
    payload: "{{ ['delete']|product(info_gtm_topology)|map('join', ' ')|list }}"
  tasks:
    - debug:
        var: payload
Run Code Online (Sandbox Code Playgroud)

给出相同的结果

payload:
  - delete gtm topology 1
Run Code Online (Sandbox Code Playgroud)