Код:
- 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": "administrator@brammer.vdc",
"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». Из-за кавычек элемент в списке associable_object_types является строкой. Проверь это
- 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
- Пример полного playbook для тестирования
- 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]