Lak*_*kar 3 ansible ansible-playbook ansible-awx
真实场景,希望在AWS中获得sqs的资源ID,这将在执行playbook后返回.因此,在文件中使用此变量来配置应用程序.
将变量从一个剧本持久化到另一个剧本
检查文档,set_fact和register等模块只有该特定主机的范围.使用从一个主机到另一个主机的变量有很多目的.
我能想到的替代方案:
使用Command模块并将变量回显到文件.稍后,使用变量文件使用vars部分或include.
设置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和运行订购(但你的里程可能会有所不同).