Как написать переменную словаря в файл в Ansible? [Дубликат]

Как уже упоминалось в парах других, нет способа стилизовать родительский элемент элемента, используя только CSS, но следующее работает с jQuery :

$("a.active").parents('li').css("property", "value");

35
задан Phil Gyford 24 October 2016 в 12:47
поделиться

2 ответа

Я думаю, что добрался до конца.

Задача такова:

- 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'}
]
63
ответ дан Mark 19 August 2018 в 11:12
поделиться
  • 1
    Вы можете избежать объявления пустого словаря, если используете фильтр default . genders: "{{ genders | default({}) | combine( {item.item.name: item.stdout}) }} – smicyk 30 May 2016 в 14:10
  • 2
    Спасибо @smicyk - я с запозданием добавил ваше удобное предложение в примеры. – Phil Gyford 23 August 2016 в 09:45
  • 3
    Второй пример должен быть: genders: "{{ genders|default([]) + [ {'name': item.item.name, 'gender': item.stdout} ] }}", с массивом по умолчанию вместо объекта по умолчанию. – Olivier Lecrivain 24 October 2016 в 12:26
  • 4
    Спасибо @OlivierLecrivain - я исправил этот пример. – Phil Gyford 2 November 2016 в 12:44
  • 5
    В любом случае, чтобы сделать это в Ansible pre-2.0? – Randy 9 November 2017 в 18:33

Спасибо, Фил, за ваше решение; в случае, если кто-то попадает в ту же ситуацию, что и я, вот вариант (более сложный):

---
# 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 ...
    

Надеюсь, это поможет.

8
ответ дан RichVel 19 August 2018 в 11:12
поделиться
  • 1
    Много танков для примечания -%}! Я боролся с этим в течение нескольких недель. – ceving 3 August 2017 в 17:31
  • 2
    Это отличный совет! Только одно примечание: с Ansible 2.4.3, по крайней мере, каждая строка, за исключением последних потребностей {%- ... -%} с тире как на открытой, так и на закрывающей скобках, иначе dict будет интерпретироваться как строка – Michael 5 March 2018 в 07:00
Другие вопросы по тегам:

Похожие вопросы: