使用组中的主机填充变量文件的最佳方法是什么?



在我的all.yml文件中,我有一些在整个项目中使用的全局变量。其中之一是redis主机的列表。我的库存文件看起来像这样:

[dev_redis]
host.abc.com
[prod_redis]
host.xyz.com

所以我想在我的all.yml文件中做的是这样的:

---
global__:
  app_user: root
  app_group: root
  redis_hosts: "{% for host in groups[{{env}}_redis] %}{{host}}:5544,{% endfor %}"

这不起作用——我得到一个错误:FAILED! => {"failed": true, "msg": "ERROR! template error while templating string: expected token ':', got '}'"}

我的问题是:

(1)为什么我得到这个错误?

(2)如果我不采购包含我的redis节点的库存文件,我能做到这一点吗?对于每次运行的部署脚本,我引用哪些库存文件使用的服务类型(这一切都发生在一个python包装器)——所以如果我部署服务以外的redis,我仍然可以访问组从redis库存文件?我可以传入多个库存文件与-i ?

我看到你在主yml中使用了循环,而这种方式我们在需要访问模板中的变量时定义了循环。

主机可以通过以下方式访问:

---
global__:
  app_user: root
  app_group: root
  redis_hosts: "{{[groups['dev_redis'][0]]}}:5544"

dev可以替换为变量{{env}}

回答你的问题:

  1. 由于某些语法问题,您正在获得此错误。在ansible中,当一个变量被使用时,它应该在"{}"中给出,并且在某些地方它是一个裸变量。根据var的使用,如果没有正确使用,ansible会抛出这个错误。

  2. 不,那不可能。您需要传递要使用的目录/变量文件。

    • 是的,你可以从redis目录文件访问组,即使你正在部署任何其他服务,但这应该通过

    • 可以使用-i以引用文件夹的方式传递多个库存文件。例如:ansible-playbook -i/home/ubuntu/inventory/test.yml

在库存目录中可以有多个库存文件。如/home/ubuntu/inventory/host1,/home/ubuntu/inventory/host2,/home/ubuntu/inventory/var1等

最新更新