4

真实场景,想在AWS中获取一个sqs的resource id,在playbook执行后会返回。因此,在文件中使用此变量来配置应用程序。

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

查看文档,set_fact 和 register 等模块仅适用于该特定主机。使用从一台主机到另一台主机的变量有很多用途。

我能想到的替代方案:

  1. 使用命令模块并将变量回显到文件中。后来,使用变量文件使用 vars section 或 include。

  2. 设置环境变量然后访问它,但这会很困难。

那么解决方案是什么?

4

4 回答 4

6

如果您正在收集事实,您可以通过正常的 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 控制机器(您从哪里调用ansibleansible-playbook从哪里调用),您应该利用 Ansible 可以将其事实/变量存储在缓存中(当前是 Redis 和 json)这一事实,这样控制机器就是不太可能有不同的主机变量。有了这个,您可以将您的控制机器设置为使用共享文件夹中的文件(这有其风险——如果两台控制机器同时在同一主机上运行怎么办?),或者从 Redis 设置/获取事实服务器。

对于我对 Amazon 数据的使用,我更喜欢每次使用标签/元数据查找来获取资源。我编写了一个Ansible 插件,它让我可以更轻松地完成此操作,因为我更喜欢它而不是考虑主机变量和运行排序(但您的里程可能会有所不同)。

于 2015-09-03T14:00:28.640 回答
1

您可以在命令行上传递变量: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:

我不明白为什么您不能编写复杂的剧本,其中将包含许多共享变量的角色?

于 2015-09-10T10:41:51.947 回答
0

您可以将“公共”变量写入 ahost_vars或以group_vars这种方式所有服务器都可以访问它。

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

于 2015-09-03T13:31:02.480 回答
0

我对 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行。

于 2021-09-23T17:08:05.297 回答