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です。ヤムコールバックプラグイン。試してみる
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]

関連情報