Как уже упоминалось в парах других, нет способа стилизовать родительский элемент элемента, используя только CSS, но следующее работает с jQuery :
$("a.active").parents('li').css("property", "value");
Я думаю, что добрался до конца.
Задача такова:
- name: Populate genders
set_fact:
genders: "{{ genders|default({}) | combine( {item.item.name: item.stdout} ) }}"
with_items: "{{ people.results }}"
Она пробивает каждый из dicts (item
) в поле people.results
, каждый раз создавая новый dict, такой как {Bob: "male"}
и combine()
s, что новый dict в массиве genders
, который заканчивается следующим образом:
{
"Bob": "male",
"Thelma": "female"
}
Он принимает ключи ( name
в этом случае) будет уникальным.
Затем я понял, что мне действительно нужен список словарей, так как кажется намного проще прокручивать с помощью with_items
:
- name: Populate genders
set_fact:
genders: "{{ genders|default([]) + [ {'name': item.item.name, 'gender': item.stdout} ] }}"
with_items: "{{ people.results }}"
Это позволяет комбинировать существующий список со списком, содержащим один dict. Мы получим массив genders
следующим образом:
[
{'name': 'Bob', 'gender': 'male'},
{'name': 'Thelma', 'gender': 'female'}
]
Спасибо, Фил, за ваше решение; в случае, если кто-то попадает в ту же ситуацию, что и я, вот вариант (более сложный):
---
# this is just to avoid a call to |default on each iteration
- set_fact:
postconf_d: {}
- name: 'get postfix default configuration'
command: 'postconf -d'
register: command
# the answer of the command give a list of lines such as:
# "key = value" or "key =" when the value is null
- name: 'set postfix default configuration as fact'
set_fact:
postconf_d: >
{{
postconf_d |
combine(
dict([ item.partition('=')[::2]|map('trim') ])
)
with_items: command.stdout_lines
Это даст следующий вывод (снятый для примера):
"postconf_d": {
"alias_database": "hash:/etc/aliases",
"alias_maps": "hash:/etc/aliases, nis:mail.aliases",
"allow_min_user": "no",
"allow_percent_hack": "yes"
}
Идти дальше, проанализируйте списки в «значении»:
- name: 'set postfix default configuration as fact'
set_fact:
postconf_d: >-
{% set key, val = item.partition('=')[::2]|map('trim') -%}
{% if ',' in val -%}
{% set val = val.split(',')|map('trim')|list -%}
{% endif -%}
{{ postfix_default_main_cf | combine({key: val}) }}
with_items: command.stdout_lines
...
"postconf_d": {
"alias_database": "hash:/etc/aliases",
"alias_maps": [
"hash:/etc/aliases",
"nis:mail.aliases"
],
"allow_min_user": "no",
"allow_percent_hack": "yes"
}
Несколько замечаний:
>-
в YAML и -%}
в Jinja ), в противном случае вы получите сообщение об ошибке: FAILED! => {"failed": true, "msg": "|combine expects dictionaries, got u\" {u'...
{% if ..
далека от пуленепробиваемого val.split(',')|map('trim')|list
можно было бы упростить до val.split(', ')
, но я хотел указать на то, что вы будете необходимо |list
, иначе вы получите сообщение об ошибке: "|combine expects dictionaries, got u\"{u'...': <generator object do_map at ...
Надеюсь, это поможет.
-%}
! Я боролся с этим в течение нескольких недель.
– ceving
3 August 2017 в 17:31
{%- ... -%}
с тире как на открытой, так и на закрывающей скобках, иначе dict будет интерпретироваться как строка
– Michael
5 March 2018 в 07:00
genders: "{{ genders | default({}) | combine( {item.item.name: item.stdout}) }}
– smicyk 30 May 2016 в 14:10"{{ genders|default([]) + [ {'name': item.item.name, 'gender': item.stdout} ] }}"
, с массивом по умолчанию вместо объекта по умолчанию. – Olivier Lecrivain 24 October 2016 в 12:26