Ansible:不同主机的配置文件中相同变量的不同值

Ansible: Different values to the same variable in a config file for different hosts

我正在为我的网络服务器设置一个 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对应的服务器中添加了相同的变量,我想成为master,但是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 文件。我是不是遗漏了什么或者是否有其他更简单的方法来做到这一点?

您必须根据主机的某些方面有条件地模板化配置文件。你创建一个变量来描述这个方面(在Redis配置中主机是master还是slave)——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