【问题标题】:Ansible: Different values to the same variable in a config file for different hostsAnsible:不同主机的配置文件中相同变量的不同值
【发布时间】: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_mastersredis_slaves,然后在每个 group_vars 中相应地设置变量 master
  • 我>>认为
  • 对不起 :) 让我写一个答案,在那里我可以用语法等更好地表达自己。届时您可以对其进行投票和评论。

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


【解决方案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

【讨论】:

  • 我明白你的意思。但我只有一个组(网络服务器),其中包含我想使用的所有服务器(1 个主服务器 + 3 个从属服务器)
  • 这种使用一组是你的问题的根源。一个组只是一个“逻辑”分组,一个“标签”,如果你愿意的话,它允许你将某些变量和值分配给某些主机,而将其他变量和值分配给其他主机。通过将您的 redis slaves 称为“redis slaves” - 即将它们放在一个 redis-slaves 组中,将更容易理解 为什么 他们以这种方式设置该变量,并且您可以移动模板中的一些逻辑,使其更清晰。
  • 太棒了!这应该对你有用:) 如果它解决了你的问题,你能接受答案吗?
  • 非常感谢,它成功了!我当然可以。再次感谢您的帮助!
  • 令人惊讶的是,正确的库存设计可以解决多少问题,而错误的库存设计又会产生多少问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多