2016-10-04 2 views
0
# "Run application specific configuration scripts" 
- include: "app_cfg/{{ app_name }}.yml" 
    when: "{{ app_conf[app_name].app_cfg }}" 
    ignore_errors: no 
    tags: 
    - conf 

Я думал, что я буду иметь возможность условно включать приложения конкретных playbooks просто установив одну переменную в значение true/false как так:Вынужденный создать файл заранее анзибль условно включают

app_conf: 
    my_app_1: 
    app_cfg: no 
    my_app_2: 
    app_cfg: yes 

К сожалению Ansible заставляет меня для создания файла заранее:

ERROR: file could not read: <...>/tasks/app_cfg/app_config.yml 

Есть ли способ избежать создания пустых файлов?

# ansible --version 
ansible 1.9.2 

ответ

2

include с when не обусловлен здравым смыслом.
Он фактически включает в себя все задачи внутри include-файла и добавляет задание when к каждой заданной задаче.
Поэтому он ожидает, что файл include будет существовать.

Вы можете использовать эту инструкцию, используя with_first_found и skip: true.
Что-то вроде этого:

# warning, code not tested 
- include: "app_cfg/{{ app_name }}.yml" 
    with_first_found: 
    - files: 
     - "{{ app_conf[app_name].app_cfg | ternary('app_cfg/'+app_name+'.yml', 'unexisting.file') }}" 
     skip: true 
    tags: conf 

Он должен предоставить действительное название конфигурации, если app_cfg верно и unexisting.file (который будет пропущено) в противном случае.

См. this ответ о пропуске вариант.

+0

Хотя немного уродливая, но все же отличная функция, которую я полностью пропустил в недоступных джунглях docs. Благодаря! –

+0

Мне пришлось отказаться принять ваш ответ, так как он выдает ошибку: 'ERROR: [DEPRECATED]: include + with_items - устаревшая функция <...>' –

+0

@ NarūnasK рассматривает возможность обновления до Ansible 2.x: _In 2.0, вы снова можно использовать with_ loops и task includes_. –

Смежные вопросы