コード:
- 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]