如何在ansible中创建动态变量

Lak*_*kar 3 ansible ansible-playbook ansible-awx

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

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

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

我能想到的替代方案:

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

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

那么解决方案是什么?

小智 5

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

例如

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

    - set_fact:
        taco_tuesday: False 
Run Code Online (Sandbox Code Playgroud)

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

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

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

    - debug: var="{{ hostvars['serverA.example.org']['taco_tuesday'] }}"
Run Code Online (Sandbox Code Playgroud)

请记住,如果您有多个Ansible控制机器(您可以调用ansible和调用ansible-playbook),您应该利用Ansible可以将其事实/变量存储在缓存(当前是Redis和json)中的事实,这样控制机器就是不太可能有不同的hostvars.有了这个,你可以设置你的控制机器使用共享文件夹中的文件(它有风险 - 如果两个控制机器同时在同一主机上运行会怎么样?),或者从Redis设置/获取事实服务器.

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