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