【发布时间】:2018-11-07 10:01:35
【问题描述】:
我正在为我的网络服务器设置一个 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: ''
然后在我的group_vars中添加了一个false变量,这是优先级最高的,所以所有的服务器都会继承这个值,并且也将相同的变量添加到 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 }}
但是当我尝试测试这个剧本时,它为所有服务器设置了相同的 .config 文件。我错过了什么还是有其他更简单的方法可以做到这一点?
【问题讨论】:
-
问题中似乎有错字:
## /host_vars/master_server.yml应该是group_vars/master_server.yml -
不,没错。 master_server 在 webservers 组中。由于变量的优先级是主机 > 子组 > 父组 > 所有组,我只希望这个 master_server.yml 具有与所有其他服务器不同的值。所以我为所有的 webservers 组设置了一个全局变量,具有相同的值,并且只在 master_server 中更改它。
-
在我看来,最好只定义组
redis_masters和redis_slaves,然后在每个group_vars中相应地设置变量master。 -
我>>认为
-
对不起 :) 让我写一个答案,在那里我可以用语法等更好地表达自己。届时您可以对其进行投票和评论。
标签: redis ansible yaml ansible-inventory ansible-template