首页 > 解决方案 > 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 文件。我错过了什么还是有另一种更简单的方法来做到这一点?

标签: redisansibleyamlansible-inventoryansible-template

解决方案


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

推荐阅读