ansible - настроить содержимое списка на основе условий в ролях по умолчанию - PullRequest
1 голос
/ 23 июня 2019

Я смотрю, чтобы определить список dict в main.yml по умолчанию для базы ролей в условии. Вы знаете, как это сделать?

Я пробовал это:

pkg: "[ 
{% if 'web' in group_names %}                                               
        { name: 'pkg-php' },                                                
        { name: 'pkg-web' },                                                
{% endif %}                                                                 
    { name: 'pkg-libs' },                                                   
    { name: 'pkg-core' } ]"

Проблема в том, что она возвращает строку, а не список dict

Ожидаемый результат

Когда хост находится в группе 'web':

pkg:
  - { name: 'pkg-php' }                                                
  - { name: 'pkg-web' }                                                
  - { name: 'pkg-libs' }                                                   
  - { name: 'pkg-core' }

Когда нет:

pkg:
  - { name: 'pkg-libs' }                                                   
  - { name: 'pkg-core' }

Ответы [ 2 ]

0 голосов
/ 23 июня 2019

ИМХО, с Jinja2 невозможно включить условные переменные роли по умолчанию, кроме строк.

pkg: |
  {% if inventory_hostname in groups['web'] %}
  inventory_hostname IS member of the group 'web'
  {% else %}
  inventory_hostname IS NOT member of the group 'web'
  {% endif %}

Существует возможность условно include_vars .Возможно, вы захотите просмотреть Приоритет переменной: куда я должен поместить переменную? и решить, соответствует ли это потенциальным другим условиям проекта.

Для продолжения include_vars поместите переменные в файлы

$ cat vars/all.yml
pkg:
  - { name: 'pkg-libs' }
  - { name: 'pkg-core' }
$ cat vars/web.yml
pkg:
  - { name: 'pkg-php' }
  - { name: 'pkg-web' }

Если инвентарь_hostname (хост, к которому применяется воспроизведение)член группы web , переменные из файла vars / web.yml включены.Игра ниже

- hosts: srv-web-01
  vars:
    web:
      pkg: []
  tasks:
    - include_vars:
        file: vars/all.yml
        name: common
    - include_vars:
        file: vars/web.yml
        name: web
      when: inventory_hostname in groups['web']
    - set_fact:
        pkg: "{{ pkg|default([]) + web.pkg + common.pkg }}"
    - debug:
        var: pkg

дает

"pkg": [
    {
        "name": "pkg-php"
    }, 
    {
        "name": "pkg-web"
    }, 
    {
        "name": "pkg-libs"
    }, 
    {
        "name": "pkg-core"
    }
]

Стандартное решение

Возможное стандартное решение для включения переменных для группы хостов: group_vars , которые имеют приоритет Variable прямо над роль по умолчанию .Ожидаемый результат может быть просто достигнут с помощью следующих group_vars

$ cat group_vars/all.yml 
pkg:
  - { name: 'pkg-libs' }
  - { name: 'pkg-core' }
$ cat group_vars/web.yml 
pkg:
  - { name: 'pkg-libs' }
  - { name: 'pkg-core' }
  - { name: 'pkg-php' }
  - { name: 'pkg-web' }

Расширенное решение

Неэффективно обновлять многие group_vars файлов, если общий элемент изменяется.Можно объявить переменные, специфичные для модульной группы

$ cat group_vars/all.yml
pkg_all:
  - { name: 'pkg-libs' }
  - { name: 'pkg-core' }
$ cat group_vars/web.yml
pkg_web:
  - { name: 'pkg-php' }
  - { name: 'pkg-web' }

, и объединить все pkg_ * в пространстве переменных хоста, то есть переменные pkg_ *, объявленные в group_vars , членом которого является хост

- set_fact:
    pkg: "{{ pkg|default([]) + lookup('vars', item) }}"
  loop: "{{  hostvars[inventory_hostname].keys()|
             select('match', '^pkg_(.*)$')|
             list }}"
- set_fact:
    pkg: "{{ pkg|unique }}"
- debug:
    var: pkg
0 голосов
/ 23 июня 2019

Это может быть немного более многословно, но почему бы просто не обернуть внешние куски?

{% if 'web' in group_names %}                                               
pkg:
  - { name: 'pkg-php' }                                                
  - { name: 'pkg-web' }                                                
  - { name: 'pkg-libs' }                                                   
  - { name: 'pkg-core' }
{% else %}
pkg:
  - { name: 'pkg-libs' }                                                   
  - { name: 'pkg-core' }
{% endif %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...