Ansible:针对不同主机的配置文件中,同一变量的值不同

时间:2018-11-07 10:01:36

标签: redis ansible yaml ansible-inventory ansible-template

我正在为我的Web服务器设置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 中,该变量是优先级最高的,因此所有服务器都将继承该值,并且还将相同的变量添加到< em> 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文件。我是否缺少某些东西,或者还有其他更简单的方法吗?

1 个答案:

答案 0 :(得分: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