Ansible 在使用不同库存的游戏之间共享变量

问题描述 投票:0回答:2

我有两本剧本:

create_infrastructure.yml
bootstrap_cluster.yml
。第一个剧本使用静态清单,仅定义具有一个成员的
infrastructure
组:
127.0.0.1
。这用于构建部署 kubernetes 集群的基础设施。
第二个 playbook 使用动态清单
hcloud.yml
,并负责引导 kubernetes 集群。
bootstrap_cluster.yml
中执行的角色之一需要访问控制平面负载均衡器的 IP 地址,这是
create_infrastructure.yml
剧本已知的内容。
我尝试过使用
register
选项和
set_fact
模块,但似乎无法使其工作。事实上,尝试从
hostvars['infrastructure']['control_plane_ip']
访问
bootstrap_cluster.yml
没有多大意义,因为
infrastructure
组甚至没有在剧本使用的动态清单中定义。
关于如何在针对不同主机的剧本之间动态共享变量的任何想法?

ansible ansible-2.x ansible-inventory
2个回答
0
投票

如果您在同一通话中启动剧本,您可以使用虚拟主机测试我的解决方案:

在不同主机之间传递Var

# Combine multiple playbooks in the same call combine.yml for example:
  - import_playbook: play1.yml
  - import_playbook: play2.yml

如果您的 playbook 在两次单独的调用中启动,唯一的解决方案是创建在 2 个 playbook 之间共享的文件。


0
投票

要在 Ansible play 中的所有主机之间传播变量,您可以使用 set_fact 模块结合 run_once: true 指令来定义它。将 run_once 设置为 true 可确保变量一次性建立并可供剧中的每个主机使用。

下面是一个用于说明的示例剧本:

- hosts: host1, host2
  gather_facts: false

  tasks:
    - name: Set a variable to be shared among all hosts
      set_fact:
        hello: world
      run_once: true

    - name: Display the variable for each host
      debug:
        msg: "{{ hello }}"

执行此剧本会导致“host1”和“host2”输出“world”,尽管变量 hello 仅分配一次。当使用大量主机或需要发出单个 API 请求(而不是每个主机一个)时,此方法特别有效,同时仍将值传播到所有主机。

© www.soinside.com 2019 - 2024. All rights reserved.