Удаление скобок ([]) из строки Ansible

Удаление скобок ([]) из строки Ansible

Код:

            - name: Set category info as fact
              set_fact:
                category_info: "{{ category_info|default([]) + [ {
                  'category_name': item | json_query('category_name'),
                  'category_description': item | json_query('category_description'),
                  'category_cardinality': item | json_query('category_cardinality'),
                  'category_associable_types': item | json_query('category_associable_types') | join (',')
                  } ] }}"
              with_items: '{{ tag_category_jsondata.tag_category_info }}'
              register: result_tag_category_info    

---

            - name: Create tag categories from source variables
                  community.vmware.vmware_category:
                    validate_certs: false
                    hostname: "{{ vc_server }}"
                    username: "{{ vc_user }}"
                    password: "{{ vc_pass }}"
                    category_name: '{{ item.category_name }}'
                    category_description: '{{ item.category_description }}'
                    category_cardinality: '{{ item.category_cardinality | lower }}'
                    associable_object_types:
                    - "{{ item.category_associable_types | split(',') }}"
                    state: present
                  delegate_to: localhost
                  when: item.category_associable_types|length > 0
                  with_items: '{{ category_info }}'
                  register: result_import_tag_category

Множество:

"category_associable_types": [
  "Datastore",
  "Opaque Network",
  "Storage Pod",
  "Virtual App",
  "Vmware Distributed Virtual Switch",
  "Distributed Virtual Switch",
  "Host Network",
  "Network",
  "Cluster Compute Resource",
  "Distributed Virtual Portgroup",
  "Folder",
  "Host System",
  "Resource Pool",
  "Virtual Machine",
  "Datacenter"
],

Проблема:

 "associable_object_types": [
        "['Datastore', 'Opaque Network', 'Storage Pod', 'Virtual App', 'Vmware Distributed Virtual Switch', 'Distributed Virtual Switch', 'Host Network', 'Network', 'Cluster Compute Resource', 'Distributed Virtual Portgroup', 'Folder', 'Host System', 'Resource Pool', 'Virtual Machine', 'Datacenter']"
      ],

Ansible, похоже, жалуется на то, что выглядит как двойные скобки, в результате добавления дополнительных скобок при разделении. Я не могу понять, как от них избавиться. Обычно я просто добавляю [0] в конец переменной или json_query, но не уверен, как удалить скобки ([]) после разделения. Любая помощь приветствуется.

ОБНОВЛЕНИЕ: Использование цикла дает те же результаты:

  "msg": "value of associable_object_types must be one or more of: All objects, Cluster, Content Library, Datacenter, Datastore, Datastore Cluster, Distributed Port Group, Distributed Switch, Folder, Host, Library item, Network, Host Network, Opaque Network, Resource Pool, vApp, Virtual Machine. Got no match for: Datastore,Opaque Network,Storage Pod,Virtual App,Vmware Distributed Virtual Switch,Distributed Virtual Switch,Host Network,Network,Cluster Compute Resource,Distributed Virtual Portgroup,Folder,Host System,Resource Pool,Virtual Machine,Datacenter",
  "invocation": {
    "module_args": {
      "validate_certs": false,
      "hostname": "vcenter-t430.brilliantitsolutions.com",
      "username": "[email protected]",
      "password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
      "category_name": "Ansible",
      "category_description": "",
      "category_cardinality": "single",
      "associable_object_types": [
        "Datastore,Opaque Network,Storage Pod,Virtual App,Vmware Distributed Virtual Switch,Distributed Virtual Switch,Host Network,Network,Cluster Compute Resource,Distributed Virtual Portgroup,Folder,Host System,Resource Pool,Virtual Machine,Datacenter"
      ],

ПО СУТИ, мне нужно это:

        - name: Create tag categories from source variables
          community.vmware.vmware_category:
            validate_certs: false
            hostname: "{{ vc_server }}"
            username: "{{ vc_user }}"
            password: "{{ vc_pass }}"
            category_name: '{{ item.category_name }}'
            category_description: '{{ item.category_description }}'
            category_cardinality: '{{ item.category_cardinality | lower }}'
            associable_object_types:
            - Datastore
            - Opaque Network
            - Storage Pod
            - Virtual App
            - Vmware Distributed Virtual Switch
            - Distributed Virtual Switch
            - Host Network
            - Network
            - Cluster Compute Resource
            - Distributed Virtual Portgroup
            - Folder
            - Host System
            - Resource Pool
            - Virtual Machine
            - Datacenter
            state: present

решение1

В:«Разделить, добавив дополнительные скобки. Как от них избавиться».

Короткий ответ: избавьтесь от кавычек вокруг пункта в списке.

  "associable_object_types": [['Datastore', 'Opaque Network', ...]]

Подробности: В заголовке указано "Удаление скобок ([]) из строки Ansible". Из-за кавычек элемент в спискеассоциированные_типы_объектовэто строка. Проверьте ее

    - debug:
        var: associable_object_types.0|type_debug

дает

  associable_object_types.0|type_debug: AnsibleUnicode

Поскольку строка является допустимым списком YAML, вы можете преобразовать строку в список

    - debug:
        var: item|from_yaml
      loop: "{{ associable_object_types }}"

дает (сокращенно)

  item|from_yaml:
  - Datastore
  - Opaque Network
  - Storage Pod
  - Virtual App
  - Vmware Distributed Virtual Switch
  - Distributed Virtual Switch
  - Host Network
  - Network
  - Cluster Compute Resource
  - Distributed Virtual Portgroup
  - Folder
  - Host System
  - Resource Pool
  - Virtual Machine
  - Datacenter

Для этой опции нужен список строк. Сначала проверьте, является ли это циклом, например

  - debug:
      msg: |
        associable_object_types: {{ item.category_associable_types|from_yaml }}
    when: item.category_associable_types|length > 0
    loop: '{{ category_info }}'

Примечания:

  • Формат вашего вывода — JSON, поскольку вы (весьма вероятно) используетепо умолчаниюПлагин обратного вызова. Стандарт JSON требует, чтобы строки были заключены в двойные кавычки. Вывод моего ответа — YAML, потому что я используюyamlплагин обратного вызова. Попробуйте
shell> ANSIBLE_STDOUT_CALLBACK=yaml  ansible-playbook playbook.yml
  • Пример полной схемы тестирования
- hosts: localhost

  vars:

    l1: [a-b-c, d-e-f, g-h-j]
    l2: "{{ l1|map('split', '-') }}"
    l3: "{{ l2|flatten }}"

    associable_object_types: ["['Datastore', 'Opaque Network', 'Storage Pod', 'Virtual App', 'Vmware Distributed Virtual Switch', 'Distributed Virtual Switch', 'Host Network', 'Network', 'Cluster Compute Resource', 'Distributed Virtual Portgroup', 'Folder', 'Host System', 'Resource Pool', 'Virtual Machine', 'Datacenter']"]

  tasks:

    - debug:
        var: l1|to_yaml
    - debug:
        var: l2|to_yaml
    - debug:
        var: l2
    - debug:
        var: l3|to_yaml

    - debug:
        var: associable_object_types
    - debug:
        var: associable_object_types.0|type_debug
    - debug:
        var: item|from_yaml
      loop: "{{ associable_object_types }}"
  • Исправьте значение этого хэша. Это должен быть список. Попробуйте удалитьприсоединитьсяфильтр
  'category_associable_types': item | json_query('category_associable_types') | join (',')

Тогда вам не придется его делить.

  associable_object_types:
    - "{{ item.category_associable_types | split(',') }}"
  • Результатом будет список списков, когда вы разделите элементы списка. Например, если задан список
  l1: [a-b-c, d-e-f, g-h-j]

Разделить элементы списка

  l2: "{{ l1|map('split', '-') }}"

дает список списков в YAML

  l2:
    - [a, b, c]
    - [d, e, f]
    - [g, h, j]

, или в формате JSON

{
    "l2": [
        ["a", "b", "c"],
        ["d", "e", "f"],
        ["g", "h", "j"]
    ]
}

Ты можешьсглаживатьсписок (избавьтесь от дополнительных скобок)

  l3: "{{ l2|flatten }}"

дает

  l3: [a, b, c, d, e, f, g, h, j]

Связанный контент