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은 추가 대괄호를 추가하는 분할의 결과로 이중 대괄호로 보이는 것에 대해 불평하는 것 같습니다. 나는 평생 동안 그것들을 제거하는 방법을 알 수 없습니다. 나는 보통 변수나 json_query의 끝에 [0]을 추가하지만 분할 후 대괄호([])를 제거하는 방법을 잘 모르겠습니다. 도움을 주시면 감사하겠습니다.

업데이트: 루프를 사용하면 동일한 결과가 생성됩니다.

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

관련 정보