Код:
- 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, похоже, жалуется на то, что выглядит как двойные скобки, в результате добавления дополнительных скобок при разделении. Я не могу понять, как от них избавиться. Обычно я просто добавляю [0] в конец переменной или json_query, но не уверен, как удалить скобки ([]) после разделения. Любая помощь приветствуется.
ОБНОВЛЕНИЕ: Использование цикла дает те же результаты:
"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]