Klammern ([]) aus Ansible-String entfernen

Klammern ([]) aus Ansible-String entfernen

Code:

            - 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

Anordnung:

"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"
],

Ausgabe:

 "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 scheint sich über scheinbar doppelte Klammern zu beschweren, die durch das Hinzufügen zusätzlicher Klammern beim Split entstehen. Ich kann einfach nicht herausfinden, wie ich sie loswerde. Normalerweise füge ich einfach [0] an das Ende der Variable oder der JSON-Abfrage an, bin mir aber nicht sicher, wie ich die Klammern ([]) nach einem Split entferne. Jede Hilfe ist willkommen.

UPDATE: Die Verwendung einer Schleife führt zu denselben Ergebnissen:

  "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"
      ],

Tatsächlich brauche ich Folgendes:

        - 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

Antwort1

Q:„Split durch Hinzufügen zusätzlicher Klammern. So werden Sie sie wieder los.“

Kurze Antwort: Entfernen Sie die Anführungszeichen um das Element in der Liste

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

Details: Der Titel lautet „Klammern ([]) aus Ansible-String entfernen“. Wegen der Anführungszeichen ist das Element in der Listezuordenbare_Objekttypenist eine Zeichenfolge. Testen Sie es

    - debug:
        var: associable_object_types.0|type_debug

gibt

  associable_object_types.0|type_debug: AnsibleUnicode

Da es sich bei der Zeichenfolge um eine gültige YAML-Liste handelt, können Sie die Zeichenfolge in eine Liste konvertieren

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

gibt (gekürzt)

  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

Diese Option erfordert eine Liste von Zeichenketten. Testen Sie zuerst, ob es sich um die Schleife handelt, z. B.

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

Anmerkungen:

  • Das Format Ihrer Ausgabe ist JSON, da Sie (höchstwahrscheinlich) dasStandardCallback-Plugin. Der JSON-Standard erfordert, dass die Zeichenfolgen in doppelte Anführungszeichen gesetzt werden. Die Ausgabe meiner Antwort ist YAML, da ich dasyamlCallback-Plugin. Probieren Sie es aus
shell> ANSIBLE_STDOUT_CALLBACK=yaml  ansible-playbook playbook.yml
  • Beispiel eines vollständigen Playbooks zum Testen
- 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 }}"
  • Korrigieren Sie den Wert dieses Hashs. Dies sollte eine Liste sein. Versuchen Sie, dieverbindenFilter
  'category_associable_types': item | json_query('category_associable_types') | join (',')

Dann müssen Sie es nicht teilen

  associable_object_types:
    - "{{ item.category_associable_types | split(',') }}"
  • Das Ergebnis ist eine Liste von Listen, wenn Sie Elemente einer Liste aufteilen. Wenn Sie beispielsweise die Liste
  l1: [a-b-c, d-e-f, g-h-j]

Teile die Elemente auf der Liste auf

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

gibt die Liste der Listen in YAML

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

oder in JSON

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

Du kannstebnendie Liste (zusätzliche Klammern entfernen)

  l3: "{{ l2|flatten }}"

gibt

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

verwandte Informationen