Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Redis Ansible:不同主机的配置文件中相同变量的不同值_Redis_Ansible_Yaml_Ansible Inventory_Ansible Template - Fatal编程技术网

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

Redis Ansible:不同主机的配置文件中相同变量的不同值,redis,ansible,yaml,ansible-inventory,ansible-template,Redis,Ansible,Yaml,Ansible Inventory,Ansible Template,我正在为我的Web服务器设置一个Redis集群,我希望其中一个是主服务器,另外三个是从服务器。 因此,对于不同的服务器,我必须有两个不同的.config文件,一个是带有行slaveof的从属服务器,另一个是不带行的主服务器 所以它会是这样的: ## 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

我正在为我的Web服务器设置一个Redis集群,我希望其中一个是主服务器,另外三个是从服务器。 因此,对于不同的服务器,我必须有两个不同的.config文件,一个是带有行
slaveof
的从属服务器,另一个是不带行的主服务器

所以它会是这样的:

## 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
变量添加到我的组变量中,这是优先级最高的,因此所有服务器都将继承此值,并且还将相同的变量添加到与我要成为主服务器的服务器相对应的主机变量中,但
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

然后正确地使用此变量的条件检查

## 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/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

问题中似乎有一个输入错误:
。/host\u vars/master\u server.yml
应该是
group\u vars/master\u server.yml
不,没错。主服务器位于webservers组内。由于变量的优先级是主机>子组>父组>所有组,因此我只希望此master_server.yml具有与所有其他服务器不同的值。因此,我为所有WebServer组设置了一个全局变量,该变量的值相同,在我看来,这样做会更好,只需定义组
redis\u masters
redis\u slaves
,然后在每个
group\u vars
中相应地设置变量
master
。我想对不起:)让我写一个答案,在那里我可以用语法等更好地表达自己。你可以投票并发表评论。我明白你的意思。但是我只有一个组(webservers),其中包含我想要使用的所有服务器(1个主服务器+3个从服务器)。不过,使用一个组是问题的根源。组只是一个“逻辑”分组,如果您愿意,它是一个“标记”,允许您将某些变量和值提供给某些主机,而将其他变量和值提供给其他主机。通过将您的redis奴隶称为“redis奴隶”——也就是说,将它们放在redis奴隶组中,将更容易理解为什么它们以这种方式设置该变量,并且您可以将一些逻辑移出模板,使其更干净。太棒了!这应该对你有用:)如果它解决了你的问题,你能接受这个答案吗?非常感谢,它奏效了!我当然可以。再次感谢你的帮助!令人惊讶的是,有多少问题可以通过正确的库存设计来解决,有多少问题是通过错误的库存设计来解决的。