Ansible: разные значения одной и той же переменной в файле конфигурации для разных хостов - PullRequest
0 голосов
/ 07 ноября 2018

Я настраиваю кластер Redis для своих веб-серверов, который я хочу, чтобы один из них был ведущим, а остальные три - рабами. В связи с этим у меня должно быть два разных файла .config для разных серверов: ведомые с линией slaveof <host> <port> и ведущий без этой линии.

Так было бы что-то вроде:

## master_server /etc/redis.conf
bind 0.0.0.0
port 6379
etc...

## slave_server1 /etc/redis.conf
bind 0.0.0.0
port 6379
slaveof masters_ip_address 6379
etc...

## slave_server2 /etc/redis.conf
bind 0.0.0.0
port 6379
slaveof masters_ip_address 6379
etc...

## slave_server3 /etc/redis.conf
bind 0.0.0.0
port 6379
slaveof masters_ip_address 6379
etc...

Вот как я пытался это сделать:

Сначала я установил две переменные в основном файле по умолчанию:

## /defaults/main.yml
redis_slave: 'masters_ip_address 6379'
redis_master: ''

А затем добавил переменную false в мои group_vars , которая имеет приоритетное значение, поэтому все серверы унаследовали бы это значение, а также добавила одну и ту же переменную в host_vars соответствует серверу, которым я хочу быть главным, но true, поэтому только этот сервер будет иметь значение, отличное от переменной slaveof:

## /group_vars/webservers.yml
master: false

## /host_vars/master_server.yml
master: true

И в моем шаблоне я реализую логику if-else для установки правильных значений:

## redis.conf.j2
{% if master == false %}
  {% set slaveof = redis_slave %}
{% else %}
  {% set slaveof = redis_master %}
{% endif %}

slaveof {{ slaveof }}

Но когда я пытаюсь протестировать этот playbook, он устанавливает одинаковый файл .config для всех серверов. Я что-то упустил или есть другой способ сделать это проще?

1 Ответ

0 голосов
/ 07 ноября 2018

Вы должны условно шаблонировать файл конфигурации, основываясь на некотором аспекте хоста. Вы создаете переменную для описания этого аспекта (является ли хост ведущим или ведомым в конфигурации Redis) - master.

Тогда вы правильно используете условную проверку для этой переменной, чтобы

## templates/etc/redis.conf.j2
{% if master == false %}
  {% set slaveof = redis_slave %}
{% else %}
  {% set slaveof = redis_master %}
{% endif %}

slaveof {{ slaveof }}

Это можно сделать проще, определив две группы для конфигурации redis:

# inventory.ini
.
.
.
[redis_masters] # defines group redis_masters
master.server.ip
[redis_slaves]  # defines group redis_slaves
slave.server.ip

[redis_hosts:children]
redis_masters
redis_slaves

Теперь вы определяете соответствующий group_vars:

# group_vars/redis_slaves.yml
slaveof: redis_master

# group_vars/redis_masters.yml
slaveof: redis_slave

#group_vars/redis_hosts.yml
# all the generic Redis stuff
bind: 0.0.0.0
port: 6379
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...