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]