真实场景,想要在AWS中获得sqs的资源ID,这将在执行playbook后返回。因此,在文件中使用此变量来配置应用程序。
将变量从一个剧本持久保存到另一个剧本
检查文档,set_fact和register等模块只有该特定主机的范围。将变量从一个主机用于另一个主机有很多目的。
我能想到的替代方案:
使用Command模块并将变量回显到文件。稍后,使用变量文件使用vars部分或包含。
设置env变量然后访问它但这很难。
那么解决方案是什么?
答案 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控制计算机(从中调用ansible
和ansible-playbook
),您应该利用Ansible可以存储其facts/variables in a cache的事实(目前Redis和json),控制机器不太可能拥有不同的hostvars。有了这个,您可以将控制机器设置为使用共享文件夹中的文件(这有其风险 - 如果两台控制机器同时在同一主机上运行会怎么样?),或者从Redis设置/获取事实服务器
对于我对Amazon数据的使用,我更喜欢每次使用标记/元数据查找来获取资源。我写了一个Ansible plugin,这让我可以更容易地做到这一点,因为我更喜欢考虑主机和运行订购(但你的里程可能会有所不同)。
答案 1 :(得分:0)
您可以将“常用”变量写入host_vars
或group_vars
,这样所有服务器都可以访问它。
另一种方法可能是创建自定义ansible module/lookup plugin
以隐藏所有样板代码,并轻松灵活地访问所需的变量。