真实场景,想在AWS中获取一个sqs的resource id,在playbook执行后会返回。因此,在文件中使用此变量来配置应用程序。
将变量从一个剧本持久化到另一个剧本
查看文档,set_fact 和 register 等模块仅适用于该特定主机。使用从一台主机到另一台主机的变量有很多用途。
我能想到的替代方案:
使用命令模块并将变量回显到文件中。后来,使用变量文件使用 vars section 或 include。
设置环境变量然后访问它,但这会很困难。
那么解决方案是什么?
真实场景,想在AWS中获取一个sqs的resource id,在playbook执行后会返回。因此,在文件中使用此变量来配置应用程序。
将变量从一个剧本持久化到另一个剧本
查看文档,set_fact 和 register 等模块仅适用于该特定主机。使用从一台主机到另一台主机的变量有很多用途。
我能想到的替代方案:
使用命令模块并将变量回显到文件中。后来,使用变量文件使用 vars section 或 include。
设置环境变量然后访问它,但这会很困难。
那么解决方案是什么?
如果您正在收集事实,您可以通过正常的 jinja2 + 变量查找访问主机变量:
例如
- 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 可以将其事实/变量存储在缓存中(当前是 Redis 和 json)这一事实,这样控制机器就是不太可能有不同的主机变量。有了这个,您可以将您的控制机器设置为使用共享文件夹中的文件(这有其风险——如果两台控制机器同时在同一主机上运行怎么办?),或者从 Redis 设置/获取事实服务器。
对于我对 Amazon 数据的使用,我更喜欢每次使用标签/元数据查找来获取资源。我编写了一个Ansible 插件,它让我可以更轻松地完成此操作,因为我更喜欢它而不是考虑主机变量和运行排序(但您的里程可能会有所不同)。
您可以在命令行上传递变量:http: //docs.ansible.com/ansible/playbooks_variables.html#passing-variables-on-the-command-line
ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo"
您可以使用本地连接运行 playbook = get variable 并将其应用于另一个 playbook:
- hosts: 127.0.0.1
connection: local
- shell: ansible-playbook -i ...
register: sqs_id
- shell: ansible-playbook -i ... -e "sqs_id={{sqs_id.stdout}}"
在这种情况下,委托也可能有用:http: //docs.ansible.com/ansible/playbooks_delegation.html#delegation
您也可以将输出存储在本地文件中并使用(http://docs.ansible.com/ansible/playbooks_delegation.html#delegation): - 名称:取一个 sqs id local_action:命令 cat ~/sqs_id
PS:
我不明白为什么您不能编写复杂的剧本,其中将包含许多共享变量的角色?
您可以将“公共”变量写入 ahost_vars
或以group_vars
这种方式所有服务器都可以访问它。
另一种方法可能是创建一个自定义ansible module/lookup plugin
来隐藏所有样板代码并轻松灵活地访问您需要的变量。
我对 azure DevOps 管道也有类似的问题。我使用 terraform、ssh-keys 和 windows 用户名/密码创建了 VM:s 由 terraform 生成并将其存储在 KeyVault 中。
所以我需要在所有创建的 VM:s 上运行 Ansible 之前查询 KeyVault。我最终使用 Azure python SDK 来获取所有秘密。我还为每个 VM 生成了一个清单文件和一个带有文件的 host_vars 文件夹。
实际的剧本现在非常基础并且可以完美地完成工作。terraform 和 ansible 的所有变量都在一个 json 文件中。而且python脚本不到30行。