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

时间:2016-07-05 20:42:38

标签: ansible ansible-2.x

在我的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传递多个广告资源文件吗?

1 个答案:

答案 0 :(得分:0)

我看到你在main yml中使用了循环,这样我们就可以在需要访问模板中的变量时定义循环。

可以访问主机:

---
global__:
  app_user: root
  app_group: root

  redis_hosts: "{{[groups['dev_redis'][0]]}}:5544"

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

您的问题的答案:

  1. 由于某些语法问题,您收到此错误。在使用变量时,它应该在“{}”中给出,在某些地方它应该是一个裸变量。根据var的用法,如果未正确使用,则会出现此错误。

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

    • 是的,您可以从redis清单文件中访问这些组,即使您正在部署任何其他服务但应该通过

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

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