redis - Ansible:不同主机的配置文件中相同变量的不同值
问题描述
我正在为我的网络服务器设置一个 Redis 集群,我希望其中 1 个作为主服务器,另外 3 个作为从服务器。因此,对于不同的服务器,我必须有两个不同的 .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_varstrue
中,但是,所以只有这个服务器对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 }}
但是当我尝试测试这个剧本时,它为所有服务器设置了相同的 .config 文件。我错过了什么还是有另一种更简单的方法来做到这一点?
解决方案
您必须根据主机的某些方面有条件地模板化配置文件。您创建一个变量来描述这一方面(在 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
推荐阅读
- python - 如何将相同的值添加到字典中的不同键?
- java - 运行服务“Google Play 服务”使用大量 RAM
- r - 获取对 R 中的特定列具有相同值的所有行名
- java - 有没有办法在Java(类似LINQ)中创建另一个对象的集合?
- r - 如何使用 R 中的 ets() 或 holt() 函数复制 Excel 2016 forecast.ets 的结果?
- python - 有没有办法为本地文件生成 URL?
- css - 如何避免 BEM 中相同类名的冲突?
- sql - Web 服务帐户的权限
- pandas - 我有一个 2 列的 DF。我想对其进行布尔检查
- r - R. 将具有连续值的列拆分为具有连续开始和结束位置的 2 列