Ansible: разные значения одной и той же переменной в файле конфигурации для разных хостов

Я настраиваю кластер 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 ответ

Решение

Вы должны условно шаблонировать файл конфигурации, основываясь на некотором аспекте хоста. Вы создаете переменную для описания этого аспекта (является ли хост ведущим или ведомым в конфигурации 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
Другие вопросы по тегам