Снятие скобок ([]) из строки 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": "administrator@brammer.vdc",
      "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 ответ
1

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

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

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

Подробности: В заголовке написано «Снятие скобок ([]) из строки Ansible». Из-за кавычек элемент в списке associable_object_types является строкой. Проверь это

    - 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, потому что я использую батат плагин обратного звонка. Попытайся
shell> ANSIBLE_STDOUT_CALLBACK=yaml  ansible-playbook playbook.yml
  • Пример полного playbook для тестирования
- 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]

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *