Ansible: переопределить роли по умолчанию - PullRequest
1 голос
/ 08 ноября 2019

У меня есть следующий доступный макет каталога

inventories/
   group_vars/     # common variables production and staging
      all
   production/
      hosts              
      group_vars/     
         all      # common to all production 
         groupN.yml
      host_vars/
         all     # common to all production 
         hostnameN.yml

   staging/
      hosts               
      group_vars/     
         all      # common to all staging 
         groupN.yml
      host_vars/
         all     # common to all staging 
         hostnameN.yml      

site.yml
production.yml
staging.yml

roles/
    docker/
         defaults
             # let's assume there defaults contain default_docker_version=a.b.c
         tasks
         ...
    webtier/
  • Мои вопросы:

- Как переопределить значения в ролях / общих/ default с использованием значений, специфичных для хоста?

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

Пример Я хочу, чтобы на производственных хостах была версия докера xyzи подготовка имеют docker_version abc

Я попытался добавить переменную в host_vars - но ansible все еще не может найти ее.


- Есть ли улучшения вмакет структуры, который можно сделать?

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Q: "Как переопределить значения в ролях / общих / по умолчанию, используя значения, специфичные для хоста ?"

A: Для staging поместите переменные в каталог

inventories/staging/host_vars

Для production поместите переменные в каталог

inventories/production/host_vars

Например

$ cat inventories/production/hosts
prod-001
prod-002
prod-003

$ cat inventories/production/hosts/host_vars/prod-001
docker_version: "x.y.z"

$ cat inventories/production/hosts/host_vars/prod-002
docker_version: "x.y.z"

$ cat inventories/production/hosts/host_vars/prod-003
docker_version: "x.y.z"

Было бы более эффективно использовать групповые значения . Например,

$ cat inventories/production/hosts
[group_01]
prod-001
prod-002
prod-003

$ cat inventories/production/group_vars/group_01
docker_version: "x.y.z"

или все . Например,

$ cat inventories/production/group_vars/all
docker_version: "x.y.z"

Q: "Есть ли улучшение в структуре, которое можно сделать?"

A: Ваш случай - Альтернативный макет каталога с добычей и подготовкой инвентаря в отдельных каталогах. Необходимо настроить инвентарь . Например,

ansible-playbook -i inventories/staging/hosts site.yml

В этом случае используются переменные инвентаризации в каталогах staging / hosts / host_vars и staging / hosts / group_vars . Это можно протестировать

ansible-inventory -i inventories/staging/hosts --list

Существуют другие опции , а не улучшения в зависимости от ваших вариантов использования.


Примечания

  • инвентаризации / group_vars / all бесполезно
  • инвентаризации / production / host_vars / all бесполезно (постановка же)
1 голос
/ 08 ноября 2019

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

Ниже приведен фрагмент для вызова роли из книги воспроизведения путем переопределения значения

 roles:
   - { role: roles/common, docker_version: "{{ docker_version }}" }
* 1005. * docker_version - это переменная, которая передается в роль для переопределения значения и его значения, поступающего из инвентаря playbook.

см. здесь для проверки приоритета переменных в ansible, это очень полезно.

...