Объединение списков Ansible в сочетании с фильтром «по умолчанию»

все

в моем инвентаре я использую три вары на разных уровнях:

 all/vars: 
 common_configs:
   - src: cfg.a
     dest: dest_a
 group_vars/vars:
 group_configs:
   - src: cfg.b
     dest: dest_b
 host_vars/vars: 
 host_configs:
   - src: cfg.c
     dest: dest_c

наконец, мне нужно, чтобы все cfg были развернуты на целевом хосте. Я использую следующий код:

 - copy:
     src: '{{ item.src }}'
     dest: '{{ item.dest }}'
   with_items:
      - '{{ common_configs + group_configs + host_configs }}'

Все работает, но в моем случае обязательным является только common_configs, поэтому, когда либо group_configs, либо/и host_configs не определены - я получаю сообщение об ошибке. Я попытался использовать фильтр по умолчанию (опустить):

   with_items:
      - '{{ common_configs + group_configs + host_configs|default(omit) }}'

Но у меня другая ошибка:

FAILED! => {"msg": "Unexpected templating type error occurred on ({{ common_configs + group_configs + host_configs|default(omit) }}): can only concatenate list (not \"str\") to list"}

Каков верный способ опустить undefined vars в таком случае?

Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
2
0
1 345
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы хотите использовать фильтр default, чтобы заменить неопределенные переменные пустым списком в вашем выражении:

with_items:
   - '{{ common_configs + group_configs|default([]) + host_configs|default([]) }}'

Вот это да. Очень просто и очевидно, но мне это не пришло в голову... Спасибо

syswipe 10.04.2019 13:30

Другие вопросы по теме