2016-07-01 3 views
2

я запускаю playbooks уточняющего серверную среды целевой в командной строке, например .:Объединения общих параметров с определенным параметром среды в анзибле

ansible-playbook -e env=staging playbook.yml

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

Структура каталога может выглядеть следующим образом:

├── group_vars 
│   ├── all 
│   │   ├── users.yml 
│   │   
│   ├── development 
│   │   ├── users.yml 
│   │   
│   ├── production 
│   │   ├── users.yml 
│   │   
│   └── staging 
│    ├── users.yml 

Первоначально я думал, что установка, как это будет делать эту работу. Тем не менее, users.yml словари для каждой среды никогда не сливались с all/users.yml

ansible-playbook -e env=production playbook.yml просто читать production/users.yml.

Как я могу получить Ansible merge users.yml из определенных окружений с помощью all/users.yml - так что у меня всегда есть общие и созданные пользователем пользователи?

+1

Возможный дубликат (http://stackoverflow.com/questions/35554415/in-ansible-ho w-to-comb-variables-from-separate-files-in-one-array) – ydaetskcoR

ответ

2

Необязательный по умолчанию переопределяет значения хэша/словаря по их эквивалентам, которые имеют более высокий приоритет.

Вы можете переопределить это, изменив параметр hash_behaviour в ansible.cfg, если вы действительно этого хотите, но я бы предложил против него на таком глобальном уровне.

Вместо этого вы могли бы определить пользователь, как это:

users: 
    name: dev-foo 
    ... 

, а затем также имеешь all_users переменное, определенные в вашем все group_vars как это:

all_users: 
    name: common-foo 
    ... 

И тогда вы могли бы combine переменные либо используя задачу set_fact для создания объединенной переменной следующим образом:

name: combine users 
set_fact: 
    combined_users: '{{ users | combine(all_users) }}' 

Или вы могли бы объединить его непосредственно в задаче, где вы собираетесь его использовать:

name: create users 
user: 
    name: {{ item.name }} 
    ... 
with_items: '{{ users | combine(all_users) }}' 

Если вы просто пытаетесь объединить 2 списков вы можете сделать это с помощью простого добавления списков:

name: combine users 
set_fact: 
    combined_users: '{{ users + all_users }}' 

Или просто прямо: [? в анзибль, как комбинировать переменные из отдельных файлов в один массив]

name: create users 
user: 
    name: {{ item.name }} 
    ... 
with_items: users + all_users 
+0

отличный ответ, спасибо – luqo33

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