如何在ansible中创建动态变量

时间:2015-09-03 11:26:20

标签: ansible ansible-playbook ansible-awx

真实场景,想要在AWS中获得sqs的资源ID,这将在执行playbook后返回。因此,在文件中使用此变量来配置应用程序。

将变量从一个剧本持久保存到另一个剧本

检查文档,set_fact和register等模块只有该特定主机的范围。将变量从一个主机用于另一个主机有很多目的。

我能想到的替代方案:

  1. 使用Command模块并将变量回显到文件。稍后,使用变量文件使用vars部分或包含。

  2. 设置env变量然后访问它但这很难。

  3. 那么解决方案是什么?

2 个答案:

答案 0 :(得分:5)

如果您正在收集事实,可以通过正常的jinja2 +变量查找访问hostvars:

e.g。

- hosts: serverA.example.org
  gather_facts: True
  ...
  tasks:

    - set_fact:
        taco_tuesday: False 

然后,如果已经运行,则在另一台主机上运行:

- hosts: serverB.example.org
  ...
  tasks:

    - debug: var="{{ hostvars['serverA.example.org']['ansible_memtotal_mb'] }}"

    - debug: var="{{ hostvars['serverA.example.org']['taco_tuesday'] }}"

请注意,如果您有多个Ansible控制计算机(从中调用ansibleansible-playbook),您应该利用Ansible可以存储其facts/variables in a cache的事实(目前Redis和json),控制机器不太可能拥有不同的hostvars。有了这个,您可以将控制机器设置为使用共享文件夹中的文件(这有其风险 - 如果两台控制机器同时在同一主机上运行会怎么样?),或者从Redis设置/获取事实服务器

对于我对Amazon数据的使用,我更喜欢每次使用标记/元数据查找来获取资源。我写了一个Ansible plugin,这让我可以更容易地做到这一点,因为我更喜欢考虑主机和运行订购(但你的里程可能会有所不同)。

答案 1 :(得分:0)

您可以将“常用”变量写入host_varsgroup_vars,这样所有服务器都可以访问它。

另一种方法可能是创建自定义ansible module/lookup plugin以隐藏所有样板代码,并轻松灵活地访问所需的变量。